@davmash/bygone 0.8.14 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,7 +9,7 @@ or materially changed.
9
9
  - **Explore — desktop:** open-ended file, directory, history, revision,
10
10
  multi-panel, and branch-change investigation.
11
11
  - **Present — desktop/browser:** generated and authored tours with narrative,
12
- exact source evidence, and an independent changed-files rail.
12
+ exact source evidence, and one task navigator for Tour, Files, or Commits.
13
13
  - **VS Code companion:** contextual file comparison and file history near the
14
14
  current editor. Repository-, directory-, multi-panel-, and tour-scale work
15
15
  should hand off to desktop.
@@ -21,6 +21,45 @@ or materially changed.
21
21
  The shared Monaco renderer supplies diff semantics and presentation. Sharing a
22
22
  renderer does not make every workflow appropriate in every host.
23
23
 
24
+ ## Shared workspace
25
+
26
+ Desktop Explore uses **History · Compare · Historical tour · Deconstructed
27
+ tour** without requiring an authored document. Missing tour buttons open an
28
+ short, editable prompt referencing the bundled v3 tour skill and the workspace's
29
+ repository, revisions, and selected paths. Read instructions exposes the Markdown;
30
+ Save an editable copy and Use my copy support user-owned forks. Desktop prompts
31
+ reference a real filesystem path outside the application archive. Browser prompts
32
+ name a Markdown attachment to download and supply alongside the prompt; selecting
33
+ a local file does not disclose its full path. Custom instructions and prompt drafts
34
+ stay in the current workspace; edited prompts are preserved with a reset notice
35
+ when the selected instructions change. No model request or shell command runs
36
+ automatically. Prompt ranges use exact committed identities or explicitly ask for
37
+ a range choice. Existing tour loading remains available.
38
+
39
+ **Open in History** resolves the comparison's Git ownership and path scope.
40
+ Its commit axis includes the selected revisions and their ancestry, including
41
+ commits that did not change the active file. File-change markers and numbered
42
+ active panels are distinct from unapplied comparison checkboxes. Clear clears
43
+ the draft without changing modes. History retains add/remove-panel controls.
44
+ **Back to comparison** restores the originating ordered comparison and its
45
+ navigation. Mode transitions use the native unsaved-edit guard; writable
46
+ working files remain writable and explicit read-only launches stay read-only.
47
+
48
+ Opening an authored document from this workspace keeps the same native window.
49
+ A different repository, range, or scoped context requires confirmation; the
50
+ tour is read-only and the original comparison remains available. Explicit
51
+ Present launches may use their dedicated window. Browser tour uploads are
52
+ validated within the presentation server's existing repository and do not
53
+ acquire local-path or desktop-write capabilities. VS Code retains its desktop
54
+ handoff boundary.
55
+
56
+ Legacy v1 presentations retain their authored tour and missing-tour help;
57
+ History and Compare explain that a v2-or-newer repository backend is required.
58
+
59
+ Verification: `test/workspace*.test.js` and the native
60
+ `--smoke-test-workspace` launch exercise ownership, range safety, restoration,
61
+ prompt behavior, and the normal-mode controls.
62
+
24
63
  ## Standalone Explore
25
64
 
26
65
  | User question | Discovery and launch | Session/source | Mutability and lifecycle | Maturity | Verification |
@@ -30,7 +69,7 @@ renderer does not make every workflow appropriate in every host.
30
69
  | Compare directories | File → Compare Directories; drag/drop; two or more directory arguments | Directory comparison | Directory rows are read-only; writable file drill-down depends on source/review state | Core | directory smoke and directory-diff tests |
31
70
  | Follow one file or directory through Git | File → View File or Directory History; one path; `--history` | Git commits plus supported index/worktree states | Commits are read-only; worktree/index provenance is explicit | Core | Git history and directory-history tests |
32
71
  | Compare named revisions | Git → Compare Revisions; `bygone --git-diff <refs…>` | Git blobs/revisions | Read-only snapshots | Core | Git comparison tests and desktop menu contract |
33
- | Explore a branch change | Git → Review Branch Change; `bygone review` | Merge-base-to-tip branch inventory for a selected head and optional base | Read-only review snapshots; dirty state is reported, not silently included | Core | branch comparison, review-path, and desktop menu tests |
72
+ | Explore a branch change | Git → Review Branch Change; `bygone review` | Deterministic start-here overview plus the complete merge-base-to-tip inventory | Read-only review snapshots; attention is a reading-order hint, viewed state remains session-local, and dirty state is reported rather than included | Core | attention-model, branch comparison, review-path, and desktop menu tests |
34
73
  | Search comparison code | Edit → Find or Search Comparison | Active, visible, all loaded panels, unopened changed text snapshots, or one file's Git history | Search is read-only; history distinguishes content occurrence from introduction/removal; Replace requires the active writable model | Core | find, comparison-search, change-set-search, and history-search tests |
35
74
  | Search or safely replace in a filesystem tree | Edit → Search in Files; explicit directory root | System ripgrep 14+ with include/exclude, hidden, ignore, and result-limit controls | Search is read-only and cancellable; completed case-sensitive literal searches can build an exclusion-aware, revalidated, atomic replacement preview with guarded undo | Optional system capability | repository search/replace contracts, benchmark, and host-protocol tests |
36
75
  | Move through a multi-panel comparison | Strip buttons, panel headers, gutters, wheel, or `Alt+Arrow` | Active panel and adjacent pair | Does not change source identity | Core | focused-strip controller and standalone smoke tests |
@@ -46,16 +85,30 @@ appear only when Electron is not packaged.
46
85
 
47
86
  | User question | Discovery and launch | Identity/provenance | Mutability | Maturity | Verification |
48
87
  | --- | --- | --- | --- | --- | --- |
49
- | Explain a branch automatically | Present → Present Current Branch or Present Branch or Ref; `bygone present` | Committed merge-base-to-tip range for the current or selected head/base | Read-only | Core | presentation launch, generated-tour, and desktop menu tests |
88
+ | Explain a branch automatically | Present → Present Current Branch or Present Branch or Ref; `bygone present` | Committed merge-base-to-tip range with a deterministic overview first scene and complete Files navigator | Read-only; authored tours retain their authored order | Core | attention-model, presentation launch, generated-tour, and desktop menu tests |
50
89
  | Open an authored walkthrough | Present → Open Authored Tour; `bygone present --tour`; VS Code hand-off | Manifest range, scene, step, exact source anchor | Read-only | Core | reproducible example and tour validation tests |
90
+ | Read optional authored review notes | Browser or desktop Present shows an opt-in **Review notes** button when a v3 manifest includes `review` | `baseOid`/`headOid` pins and evidence links into the Final walkthrough | Immutable range; read-only panel; no scores or persisted reviewer state | Local prototype | `examples/bygone-history.bygone`, `test/reviewNotes.test.js`, and manual browser navigation check |
91
+ | Assess authored tour coverage | Coverage indicators in the Present sidebar | Distinct hunks referenced by authored walkthrough anchors; v2/v3 Final walkthrough coverage remains separate from deconstructed Explanation assignment completeness | Read-only authoring diagnostics; generated tours have no authored coverage metric | Advanced authoring | v1/v2/v3 coverage and presenter-host tests |
51
92
  | Listen to a generated or authored tour | Narrative Listen controls; Present → Listen to Tour | Existing manifest narrative segmented locally by scene/step and visible sentence | Read-only device TTS; voice/rate preferences remain local; continuous playback follows tour navigation and direct exploration pauses it | Core | narration model/controller and presenter-host tests |
52
93
  | Explain a real stack | `stacked-diff` scene | Exact real Git revisions per panel | Read-only | Advanced | `examples/stacked-diff.bygone` |
53
94
  | Explain a change in conceptual stages | `deconstructed-diff` scene | Explicitly labeled synthetic explanation stages backed by exact hunk IDs | Read-only | Advanced/experimental authoring | `examples/deconstructed-diff.bygone` |
54
- | Browse away from the narration | Files rail, change navigation | Browsed file versus active tour focus remain distinct | Read-only; Return to Tour restores narrative focus | Core | tour focus and persistent-anchor tests |
95
+ | Browse away from the narration | Files navigator, change navigation | Browsed file versus active tour focus remain distinct | Read-only; Return to Tour restores narrative focus | Core | tour focus and persistent-anchor tests |
96
+ | Browse commits or build a comparison while reading | Shared Commits navigator in every mode; check revisions, then Compare selected | All commits reachable from the presentation head; separate file-change markers, tour membership, and numbered loaded panels | Read-only snapshots; checkbox draft does not navigate; History preserves revision columns across files | Core | tour-history backend, stable-axis workspace tests, and browser mode-transition checks |
55
97
 
56
98
  Tour authoring remains file/CLI/agent driven. The desktop UI opens and presents
57
99
  tours but does not attempt to duplicate schema-aware authoring forms.
58
100
 
101
+ Tour reading is one continuous document: title, chapter headings, scene
102
+ overviews, and steps. Scrolling the narrative selects the active passage and
103
+ its source evidence; scrolling code does not advance the narrative. The
104
+ sidebar is a collapsible outline with separate disclosure and jump controls.
105
+ Scene overviews are independent reading stops, and each step includes a
106
+ collapsed scene-context disclosure above its text. Opening that disclosure
107
+ does not navigate. Keyboard previous/next follows the same document order;
108
+ History/Compare round-trips restore the passage and reading scroll position.
109
+ There are no title-screen, start-steps, or resume gates. Verification:
110
+ `test/tourReading.test.js` and `standalone/tourReadingSmoke.js`.
111
+
59
112
  ## VS Code companion
60
113
 
61
114
  | Command | Intended ownership | Current state | Editing contract | Follow-up |
@@ -78,22 +131,25 @@ VS Code's native Search rather than another bundled ripgrep process.
78
131
 
79
132
  | Surface | Purpose | Mutability/maturity |
80
133
  | --- | --- | --- |
81
- | `bygone`, paths, `--diff`, `--history`, `--git-diff`, `review` | Launch Explore sessions | Core launcher; desktop owns writes |
134
+ | `bygone`, paths, `--diff`, `--history`, `--git-diff`, `--read-only`, `review` | Launch Explore sessions | Core launcher; desktop owns writes; `--read-only` is a persisted capability ceiling for that launch |
82
135
  | `present` and `present --tour` | Launch Present sessions | Core, read-only presentation |
83
136
  | `tour context` | Produce a bounded provider-neutral change dossier | Authoring support, read-only |
84
- | `tour validate`, `compile`, `schema`, and coverage options | Validate exact evidence and build portable manifests | Advanced authoring, read-only except explicit output files |
137
+ | `tour validate`, `compile`, `schema`, and coverage options | Validate exact evidence and build repository-bound manifests | Advanced authoring, read-only except explicit output files |
85
138
  | `completion` | Generate shell completions from the shared command specification | Supporting tooling |
86
139
 
87
140
  ## Provenance and mutability vocabulary
88
141
 
89
142
  Use these labels consistently:
90
143
 
91
- - **Writable file:** filesystem/worktree content participating in dirty, undo,
144
+ - **Writable file:** filesystem content and a live `WORKTREE` column participating in dirty, undo,
92
145
  save, reload, watcher, and refresh behavior.
146
+ - **Read-only file:** live filesystem content intentionally opened with editing
147
+ disabled; external changes and explicit session refresh remain available.
93
148
  - **Read-only snapshot:** committed Git, history, tour, or supplied content that
94
149
  cannot be replaced or saved over a source file.
95
150
  - **INDEX** and **WORKTREE:** repository work states; do not describe them as
96
- commits.
151
+ commits. `INDEX` is a read-only snapshot; `WORKTREE` is live and writable in
152
+ revision comparisons unless the launch uses `--read-only`.
97
153
  - **Explanation stage:** synthetic deconstructed content; never imply that it
98
154
  is a real commit.
99
155
  - **Real revision:** a panel resolved from an exact Git object identity.
package/docs/releasing.md CHANGED
@@ -23,7 +23,6 @@ Publish everything:
23
23
 
24
24
  ```bash
25
25
  export BYGONE_HOMEBREW_TAP=/path/to/homebrew-tap
26
- npm whoami
27
26
  gh auth status
28
27
  npm run release:publish
29
28
  ```
@@ -34,10 +33,9 @@ aborts unless the worktree is clean and the current branch is `main`, pushes
34
33
  installs the artifacts locally, then publishes npm, GitHub, and Homebrew.
35
34
  The Homebrew tap defaults to the sibling `homebrew-bygone` checkout; set
36
35
  `BYGONE_HOMEBREW_TAP` only when the tap is elsewhere.
37
- If npm authentication is missing, the command launches browser login. For an
38
- unpublished version, it checks authentication again and pauses immediately
39
- before `npm publish`; press Enter only when ready to complete npm's time-limited
40
- passkey prompt.
36
+ Creating the GitHub release pushes the version tag. That tag starts the
37
+ protected Release workflow, which waits for approval and publishes npm through
38
+ OIDC trusted publishing without a long-lived npm token.
41
39
 
42
40
  Upload `bygone-<version>.vsix` from the Visual Studio Marketplace publisher
43
41
  page. GitHub OIDC support has merged into `vsce`, but Marketplace has not yet
@@ -62,12 +60,11 @@ The main scripts are:
62
60
  - requires a clean `main` worktree
63
61
  - pushes `main` and waits for that commit's GitHub Release Check workflow
64
62
  - rebuilds and installs the release locally, including a graceful desktop restart
65
- - logs into npm when needed and pauses immediately before the interactive npm publish challenge
66
- - publishes npm
67
63
  - creates a GitHub release with desktop artifacts
64
+ - triggers the protected GitHub Actions workflow that publishes npm through OIDC
68
65
  - updates and pushes the Homebrew tap
69
66
  - `npm run release:publish:npm`
70
- - publishes only the staged npm package
67
+ - manual fallback that publishes only the staged npm package
71
68
 
72
69
  Related packaging commands:
73
70
 
@@ -91,17 +88,16 @@ You need accounts on three services:
91
88
 
92
89
  ### 1. npm
93
90
 
94
- This is required for publishing the standalone package.
91
+ This is required for publishing the standalone package. Routine releases use
92
+ npm trusted publishing from GitHub Actions, so no npm token is stored in the
93
+ repository.
95
94
 
96
95
  - Sign up: [npm signup](https://www.npmjs.com/signup)
97
96
  - Docs: [npm getting started](https://docs.npmjs.com/getting-started)
98
97
 
99
- After creating the account:
100
-
101
- ```bash
102
- npm login
103
- npm whoami
104
- ```
98
+ Configure `@davmash/bygone` with a trusted publisher for the
99
+ `davidmashburn/bygone` repository, the `release.yml` workflow, and the
100
+ `npm-publish` environment.
105
101
 
106
102
  ### 2. GitHub
107
103
 
@@ -165,17 +161,12 @@ This repository should contain the tap structure used by the release script:
165
161
  - `Formula/`
166
162
  - `Casks/`
167
163
 
168
- ### 1. npm authentication
169
-
170
- ```bash
171
- npm whoami
172
- ```
173
-
174
- If that fails:
164
+ ### 1. npm trusted publishing
175
165
 
176
- ```bash
177
- npm login
178
- ```
166
+ The npm package must trust `.github/workflows/release.yml` in
167
+ `davidmashburn/bygone`, scoped to the `npm-publish` environment. The GitHub
168
+ environment should require a reviewer so pushing a tag does not publish by
169
+ itself.
179
170
 
180
171
  ### 2. GitHub authentication
181
172
 
@@ -305,9 +296,11 @@ npm run release:publish
305
296
 
306
297
  This runs the full publish path:
307
298
 
308
- 1. `npm publish dist/npm-package --access public`
309
- 2. `gh release create v<version> ... --notes-file CHANGELOG.md`
310
- 3. update, commit, and push the Homebrew tap
299
+ 1. `gh release create v<version> ... --notes-file CHANGELOG.md`
300
+ 2. the pushed tag starts `.github/workflows/release.yml`
301
+ 3. after environment approval, Actions validates the tag and package metadata,
302
+ runs `npm run release:check`, and publishes `dist/npm-package` through OIDC
303
+ 4. update, commit, and push the Homebrew tap
311
304
 
312
305
  Publish the VS Code extension separately by uploading the already-built
313
306
  `bygone-<version>.vsix` through the Marketplace publisher page.
@@ -344,10 +337,13 @@ The repository-local packaging notes are also in:
344
337
 
345
338
  Check:
346
339
 
347
- - `npm whoami`
348
340
  - `gh auth status`
349
341
  - `echo $BYGONE_HOMEBREW_TAP`
350
342
 
343
+ If the GitHub release succeeds but npm publishing does not, inspect the Release
344
+ workflow and confirm that both the GitHub `npm-publish` environment and npm
345
+ trusted-publisher configuration match `.github/workflows/release.yml`.
346
+
351
347
  ### VS Code publishing is not automated
352
348
 
353
349
  This is currently intentional. `vsce` has merged GitHub OIDC support, but the
@@ -1,10 +1,52 @@
1
- version: 1
1
+ version: 3
2
2
  title: How Bygone learned to review a branch
3
3
  sourceUrl: https://github.com/davidmashburn/bygone/commit/75b6d7c0303124ec314aa790d6b808c4a9d9ea0e
4
4
  range:
5
5
  base: 292fe9248c5c49f762489dc688296fc100d120bc
6
6
  head: 75b6d7c0303124ec314aa790d6b808c4a9d9ea0e
7
7
 
8
+ review:
9
+ baseOid: 292fe9248c5c49f762489dc688296fc100d120bc
10
+ headOid: 75b6d7c0303124ec314aa790d6b808c4a9d9ea0e
11
+ items:
12
+ - id: merge-base-contract
13
+ kind: concept
14
+ title: Merge-base defines the reviewed history
15
+ body: "resolveBranchReviewRange selects one merge base, then derives changed paths and commits from that boundary. The review is the merge-base-to-head story."
16
+ evidence:
17
+ - sceneId: review-pipeline
18
+ stepId: establish-boundary
19
+ - sceneId: review-pipeline
20
+ stepId: lock-the-semantics
21
+ - id: git-directory-boundary
22
+ kind: boundary
23
+ title: Git-specific work ends at two trees
24
+ body: "The Git layer discovers the range and materializes snapshots; FileComparator then hands those temporary roots to the ordinary directory comparison. A reader needs the range model before the reusable directory surface is meaningful."
25
+ evidence:
26
+ - sceneId: review-pipeline
27
+ stepId: make-range-portable
28
+ - sceneId: review-pipeline
29
+ stepId: turn-history-into-files
30
+ - sceneId: review-pipeline
31
+ stepId: reuse-the-diff-surface
32
+ - id: setup-owns-complexity
33
+ kind: tradeoff
34
+ title: Review support moves complexity into range and snapshot setup
35
+ body: "Reusing directory comparison avoids a branch-only renderer, while range resolution and temporary snapshot creation add complexity before that renderer."
36
+ evidence:
37
+ - sceneId: review-pipeline
38
+ stepId: establish-boundary
39
+ - sceneId: review-pipeline
40
+ stepId: turn-history-into-files
41
+ - sceneId: review-pipeline
42
+ stepId: reuse-the-diff-surface
43
+ - id: partial-materialization-cleanup
44
+ kind: question
45
+ title: Does a failed materialization clean up both temporary roots?
46
+ body: "The focused walkthrough follows the successful handoff, but it does not prove cleanup when git show fails after one root has been partially populated."
47
+ evidence: []
48
+ nextCheck: "Inspect the preparation-error path and add a fault-injection fixture only if a failed materialization leaves either temporary root behind."
49
+
8
50
  anchors:
9
51
  choose-merge-base:
10
52
  file: src/gitComparison.ts
@@ -47,34 +89,34 @@ chapters:
47
89
  scenes:
48
90
  - id: review-pipeline
49
91
  title: From Git history to a visual workspace
50
- summary: Follow the branch-review feature through its historical boundary, portable model, presentation seam, and proof.
92
+ summary: Follow the branch-review feature from its historical boundary to the reusable comparison surface and the test that fixes its semantics.
51
93
  bullets:
52
- - The comparison starts at merge-base rather than whichever ref happens to be named as the base.
53
- - Git-specific work ends once two temporary trees have been materialized.
54
- - Existing directory comparison then provides navigation and drill-down without a second renderer.
94
+ - Resolve the range before materializing files for the comparison.
95
+ - Keep Git-specific preparation at the temporary-tree handoff.
96
+ - Read the fixture as a proof of range semantics, separate from the renderer.
55
97
  tags: [git, architecture, dogfood]
56
98
  takeaway: Bygone reviews its own history using the same boundary it introduced in this commit.
57
99
  steps:
58
100
  - id: establish-boundary
59
101
  title: Establish the historical boundary
60
- body: The review represents everything introduced since the branch diverged, including changes made around merges.
102
+ body: Using the unique merge base makes the review start at branch divergence; the resolver rejects multiple merge bases instead of silently choosing one.
61
103
  focus: choose-merge-base
62
104
  - id: make-range-portable
63
105
  title: Describe the review as data
64
- body: Changed paths and commits are collected into a range that neither renderer needs to rediscover.
106
+ body: BranchReviewRange carries changed paths and commits once, so the renderer can consume prepared history rather than rediscovering Git state.
65
107
  focus: describe-range
66
108
  - id: turn-history-into-files
67
109
  title: Materialize two review trees
68
- body: The Git-specific layer creates base and head snapshots for only the changed paths.
110
+ body: Materializing only changed paths creates the two snapshots the diff can read; the temporary roots add setup and cleanup around the read-only comparison.
69
111
  focus: materialize-boundary
70
112
  connection: range-to-snapshot
71
113
  - id: reuse-the-diff-surface
72
114
  title: Reuse directory comparison
73
- body: VS Code hands those snapshots to Bygone's existing directory workflow instead of introducing a branch-only view.
115
+ body: Passing the roots to compareDirectories keeps branch review on the established directory workflow, so navigation and drill-down are reused instead of implemented in a branch-specific renderer.
74
116
  focus: open-review-surface
75
117
  connection: snapshot-to-surface
76
118
  - id: lock-the-semantics
77
119
  title: Prove the range starts at divergence
78
- body: The test creates a real repository and asserts the selected merge base, changed paths, and commits.
120
+ body: The fixture asserts the merge base, changed paths, and commit count; renderer behavior needs separate checks.
79
121
  focus: prove-merge-base
80
122
  connection: semantics-to-proof