@davmash/bygone 0.9.8 → 0.10.0
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.
- package/CHANGELOG.md +21 -1
- package/README.md +74 -1
- package/cli/commandSpec.js +2 -0
- package/cli/completions.js +3 -3
- package/cli/present.js +28 -10
- package/cli/tour.js +22 -1
- package/cli/tourExport.js +147 -0
- package/cli/tourFile.js +109 -4
- package/cli/tourHistory.js +31 -1
- package/completions/_bygone +1 -1
- package/completions/bygone +1 -1
- package/completions/bygone.fish +1 -1
- package/docs/change-tour-format.md +85 -68
- package/docs/explore.md +14 -3
- package/docs/generating-change-tours.md +84 -46
- package/docs/present.md +103 -14
- package/docs/product-surface.md +19 -8
- package/docs/sharing-tours.md +95 -0
- package/docs/visual-walkthrough/README.md +89 -0
- package/docs/visual-walkthrough/build-tour.mjs +54 -0
- package/docs/visual-walkthrough/capture-desktop.cjs +42 -0
- package/docs/visual-walkthrough/capture-desktop.mjs +21 -0
- package/docs/visual-walkthrough/captures.md +49 -0
- package/docs/visual-walkthrough/create-demo.mjs +57 -0
- package/docs/visual-walkthrough/deconstructed-demo.bygone +100 -0
- package/docs/visual-walkthrough/images/01-two-files.png +0 -0
- package/docs/visual-walkthrough/images/02-many-panels.png +0 -0
- package/docs/visual-walkthrough/images/03-directories.png +0 -0
- package/docs/visual-walkthrough/images/04-search.png +0 -0
- package/docs/visual-walkthrough/images/05-repository-history.png +0 -0
- package/docs/visual-walkthrough/images/06-file-history.png +0 -0
- package/docs/visual-walkthrough/images/07-branch-review.png +0 -0
- package/docs/visual-walkthrough/images/08-tour-reader.png +0 -0
- package/docs/visual-walkthrough/images/09-focused-step.png +0 -0
- package/docs/visual-walkthrough/images/10-deconstructed.png +0 -0
- package/docs/visual-walkthrough/images/11-exploration.png +0 -0
- package/docs/visual-walkthrough/images/12-authoring.png +0 -0
- package/docs/visual-walkthrough/images/13-export.png +0 -0
- package/docs/visual-walkthrough/images/14-vscode.png +0 -0
- package/docs/visual-walkthrough/images/15-cli.png +0 -0
- package/docs/visual-walkthrough/narrative.md +134 -0
- package/docs/visual-walkthrough/outline.md +52 -0
- package/docs/visual-walkthrough/walkthrough.bygone +340 -0
- package/docs/walkthrough.md +6 -101
- package/examples/bygone-history.bygone +11 -44
- package/examples/marker-focus.bygone +116 -0
- package/examples/navigation-lab.bygone.yaml +401 -336
- package/examples/tour-orientation.bygone +349 -0
- package/media/diff.worker.js +13 -3
- package/media/webview.css +1 -1
- package/media/webview.js +394 -319
- package/out/changeTour.js +865 -397
- package/out/deepLink.js +167 -0
- package/out/historyDirectory.js +66 -0
- package/out/standalone-main.js +20514 -16821
- package/out/tourCoverage.js +850 -386
- package/out/tourDocument.js +97 -0
- package/package.json +1 -1
- package/schemas/change-tour-source.schema.json +91 -64
- package/skills/pr-tour-guide/SKILL.md +144 -128
- package/skills/pr-tour-guide/references/expectations-and-feedback.md +57 -0
- package/standalone/index.html +10 -25
- package/web/export-bootstrap.js +62 -0
- package/web/export-licenses.txt +78 -0
- package/web/export-runtime.json +12 -0
- package/web/index.html +54 -47
- package/web/presenter.css +332 -178
- package/web/web-host.js +239 -137
package/cli/tourHistory.js
CHANGED
|
@@ -2,6 +2,7 @@ const { execFileSync } = require('child_process');
|
|
|
2
2
|
const { realpathSync } = require('fs');
|
|
3
3
|
const { TextDecoder } = require('util');
|
|
4
4
|
const path = require('path');
|
|
5
|
+
const { buildHistoryDirectoryEntries } = require('../out/historyDirectory.js');
|
|
5
6
|
const { parseNameStatusZ } = require('../out/gitComparison.js');
|
|
6
7
|
|
|
7
8
|
const DEFAULT_HISTORY_MAX_FILE_BYTES = 2 * 1024 * 1024;
|
|
@@ -412,6 +413,30 @@ function createTourHistory(manifest) {
|
|
|
412
413
|
rightLabel: `${rightPath} @ ${commit.slice(0, 7)}` };
|
|
413
414
|
},
|
|
414
415
|
compare,
|
|
416
|
+
changedFiles(input) {
|
|
417
|
+
input = requireInput(input);
|
|
418
|
+
if (!Array.isArray(input.commits) || input.commits.length > 32) throw new Error('Expected displayed revisions.');
|
|
419
|
+
const commits = input.commits.map(commit => commit === null ? null : validateCommit(root, commit));
|
|
420
|
+
const paths = new Set();
|
|
421
|
+
for (let index = 1; index < commits.length; index++) {
|
|
422
|
+
const pair = [commits[index - 1], commits[index]];
|
|
423
|
+
if (pair[0] === pair[1]) continue;
|
|
424
|
+
const output = pair.includes(null)
|
|
425
|
+
? git(root, ['ls-tree', '-r', '--name-only', '-z', pair.find(Boolean)])
|
|
426
|
+
: git(root, ['diff', '--name-only', '--no-renames', '--no-ext-diff', '-z', ...pair, '--']);
|
|
427
|
+
output.split('\0').filter(Boolean).forEach(file => paths.add(file));
|
|
428
|
+
}
|
|
429
|
+
const changed = [...paths].sort();
|
|
430
|
+
const inventories = input.includeEntries || input.includeFiles ? commits.map(commit => new Set(commit
|
|
431
|
+
? git(root, ['ls-tree', '-r', '--name-only', '-z', commit]).split('\0').filter(Boolean) : [])) : [];
|
|
432
|
+
return { paths: changed, ...(input.includeFiles ? {
|
|
433
|
+
files: [...new Set(inventories.flatMap(inventory => [...inventory]))].sort().map(path => ({
|
|
434
|
+
kind: 'text-diff', path, changeKind: paths.has(path) ? 'modified' : 'unchanged'
|
|
435
|
+
}))
|
|
436
|
+
} : {}), ...(input.includeEntries ? {
|
|
437
|
+
entries: buildHistoryDirectoryEntries(changed, inventories)
|
|
438
|
+
} : {}) };
|
|
439
|
+
},
|
|
415
440
|
compareMany(input) {
|
|
416
441
|
input = requireInput(input);
|
|
417
442
|
if (!Array.isArray(input.commits) || input.commits.length < 2) throw new Error('Comparison requires at least two commits.');
|
|
@@ -422,9 +447,14 @@ function createTourHistory(manifest) {
|
|
|
422
447
|
to: commits[index + 1],
|
|
423
448
|
...(input.path !== undefined ? { path: input.path } : {})
|
|
424
449
|
}));
|
|
450
|
+
const files = aggregateComparisonFiles(commits, comparisons);
|
|
425
451
|
return {
|
|
426
452
|
commits,
|
|
427
|
-
files
|
|
453
|
+
files,
|
|
454
|
+
entries: buildHistoryDirectoryEntries(files.map(file => file.path), commits.map((commit, index) => {
|
|
455
|
+
const inventory = new Set(git(root, ['ls-tree', '-r', '--name-only', '-z', commit]).split('\0').filter(Boolean));
|
|
456
|
+
return new Set(files.filter(file => inventory.has(file.comparisonPanels[index].path)).map(file => file.path));
|
|
457
|
+
}))
|
|
428
458
|
};
|
|
429
459
|
}
|
|
430
460
|
};
|
package/completions/_bygone
CHANGED
|
@@ -60,7 +60,7 @@ _bygone() {
|
|
|
60
60
|
'--help:Show command help'
|
|
61
61
|
)
|
|
62
62
|
shells=('zsh:Z shell' 'bash:Bash' 'fish:Fish shell')
|
|
63
|
-
tour_actions=('context:Build structured change evidence' 'coverage:Measure authored tour coverage' 'validate:Validate source and anchors' 'compile:Compile a repository-bound manifest' 'schema:Print the source schema')
|
|
63
|
+
tour_actions=('context:Build structured change evidence' 'coverage:Measure authored tour coverage' 'validate:Validate source and anchors' 'compile:Compile a repository-bound manifest' 'export:Export a portable HTML tour' 'schema:Print the source schema')
|
|
64
64
|
|
|
65
65
|
if (( CURRENT == 2 )); then
|
|
66
66
|
_describe 'bygone command' root_items
|
package/completions/bygone
CHANGED
|
@@ -23,7 +23,7 @@ _bygone() {
|
|
|
23
23
|
;;
|
|
24
24
|
tour)
|
|
25
25
|
if (( COMP_CWORD == 2 )); then
|
|
26
|
-
COMPREPLY=( $(compgen -W 'context coverage validate compile schema' -- "$cur") )
|
|
26
|
+
COMPREPLY=( $(compgen -W 'context coverage validate compile export schema' -- "$cur") )
|
|
27
27
|
elif [[ "${COMP_WORDS[2]}" == "context" ]]; then
|
|
28
28
|
refs="$(_bygone_git_refs)"
|
|
29
29
|
if [[ "$prev" =~ ^(--base|-m|--main)$ ]]; then
|
package/completions/bygone.fish
CHANGED
|
@@ -18,7 +18,7 @@ complete -c bygone -n '__fish_use_subcommand' -s C -r -d 'Run as if Bygone start
|
|
|
18
18
|
complete -c bygone -n '__fish_use_subcommand' -s h -l help -d 'Show command help'
|
|
19
19
|
complete -c bygone -n '__fish_use_subcommand' -s v -l version -d 'Show the installed version'
|
|
20
20
|
complete -c bygone -n '__fish_seen_subcommand_from completion' -a 'zsh bash fish' -d 'Shell'
|
|
21
|
-
complete -c bygone -n '__fish_seen_subcommand_from tour' -a 'context coverage validate compile schema' -d 'Tour action'
|
|
21
|
+
complete -c bygone -n '__fish_seen_subcommand_from tour' -a 'context coverage validate compile export schema' -d 'Tour action'
|
|
22
22
|
complete -c bygone -n 'string match -q "*tour context*" -- (commandline -opc)' -l base -r -a '(__bygone_git_refs)' -d 'Set the change-context base ref'
|
|
23
23
|
complete -c bygone -n 'string match -q "*tour context*" -- (commandline -opc)' -l output -s o -r -d 'Write the change context'
|
|
24
24
|
complete -c bygone -n 'string match -q "*tour context*" -- (commandline -opc)' -l max-patch-bytes -r -d 'Maximum included patch size per file'
|
|
@@ -8,54 +8,89 @@ suffix, and explicitly supplied files are validated by content rather than
|
|
|
8
8
|
rejected by extension.
|
|
9
9
|
|
|
10
10
|
An authored source is Git-backed, not portable: resolving refs and anchors
|
|
11
|
-
requires the corresponding local repository and Git objects. Version 2 and
|
|
11
|
+
requires the corresponding local repository and Git objects. Version 2, 4, and 5
|
|
12
12
|
compiled manifests remain bound to that repository so the presenter can load
|
|
13
13
|
live file history. Version 1 manifests remain readable as legacy portable
|
|
14
|
-
artifacts, without the mode switcher. Version
|
|
15
|
-
tours
|
|
16
|
-
|
|
14
|
+
artifacts, without the mode switcher. Version 4 supports independent authored
|
|
15
|
+
tours and scene directory overviews; versions 1 and 2 remain accepted without
|
|
16
|
+
those fields.
|
|
17
17
|
|
|
18
|
-
## Version
|
|
18
|
+
## Version 5 stability and compatibility
|
|
19
19
|
|
|
20
|
-
Format version **
|
|
21
|
-
|
|
22
|
-
UI fixes, navigation changes, and application patch releases do not require
|
|
23
|
-
rewriting a tour or incrementing its format version.
|
|
20
|
+
Format version **5** is the current authoring contract. Application and document
|
|
21
|
+
versions are separate; UI fixes do not require rewriting a tour.
|
|
24
22
|
|
|
25
|
-
| Document version | Reader support
|
|
23
|
+
| Document version | Reader support | Contract |
|
|
26
24
|
| --- | --- | --- |
|
|
27
25
|
| 1 | Supported | Legacy source and portable compiled manifests |
|
|
28
26
|
| 2 | Supported | Repository-bound manifests, real revision stacks, and endpoint walkthroughs |
|
|
29
|
-
| 3 |
|
|
30
|
-
|
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
| 3 | Retired | Remove the top-level `review` block, set source `version: 4`, and recompile |
|
|
28
|
+
| 4 | Supported | Independent authored tours and scene directory overviews; no Review Notes |
|
|
29
|
+
| 5 | Use for new sources | Optional opening, conclusion, and chapter previews; explicit overview purpose |
|
|
30
|
+
| Greater than 5 | Rejected with an upgrade message | Never interpreted as version 5 |
|
|
31
|
+
|
|
32
|
+
Version 4 removes the `review` field and the separate Review Notes panel.
|
|
33
|
+
Concepts, boundaries, tradeoffs, and unresolved questions belong in scene or
|
|
34
|
+
step narrative. Clearly distinguish an unknown from a supported conclusion and
|
|
35
|
+
state the next check that would resolve it. Neither source nor compiled manifests
|
|
36
|
+
accept a `review` field; existing v3 documents receive a migration error.
|
|
37
|
+
|
|
38
|
+
The v5 field names, types, required fields, enum values, and meanings are fixed
|
|
33
39
|
by the [source schema](../schemas/change-tour-source.schema.json) and the
|
|
34
|
-
semantic rules in this document.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
the same format number. New syntax that existing v3 readers cannot accept
|
|
38
|
-
requires a new document version, even when the new field is optional. Fixes
|
|
39
|
-
that enforce the documented contract do not make malformed documents valid.
|
|
40
|
+
semantic rules in this document. Breaking syntax or semantic changes require
|
|
41
|
+
a new document version. Fixes enforcing the documented contract do not make
|
|
42
|
+
malformed documents valid.
|
|
40
43
|
|
|
41
44
|
The source is strict: unknown properties are errors, not an extension
|
|
42
45
|
mechanism. JSON Schema covers document structure; `bygone tour validate`
|
|
43
46
|
additionally checks IDs and references, Git objects, unique anchor matches,
|
|
44
|
-
stage coverage, comparison endpoints
|
|
47
|
+
stage coverage, and comparison endpoints. A schema-only pass
|
|
45
48
|
does not prove that the source compiles. Validate against the intended local
|
|
46
49
|
repository before sharing a tour.
|
|
47
50
|
|
|
48
51
|
Keep authored YAML as the editable source. Compiled JSON is generated evidence,
|
|
49
|
-
not a second authoring syntax; v2/
|
|
52
|
+
not a second authoring syntax; v2/v4/v5 manifests retain repository identity and
|
|
50
53
|
resolved Git objects. Stable format support does not make missing repositories
|
|
51
54
|
or pruned objects available, and does not promise byte-identical generated
|
|
52
55
|
timestamps or presentation layout. Pin full commit IDs in `range` when the
|
|
53
56
|
underlying comparison must stay fixed.
|
|
54
57
|
|
|
55
|
-
The compatibility checks cover v1/v2 acceptance,
|
|
56
|
-
independent authored modes, overview evidence and fallback semantics,
|
|
57
|
-
|
|
58
|
-
parser, compiler, or schema change; update those
|
|
58
|
+
The compatibility checks cover v1/v2 acceptance, v4-only field gates,
|
|
59
|
+
independent authored modes, overview evidence and fallback semantics, retired
|
|
60
|
+
v3 rejection, removed-field rejection, and rejection of future versions. Run
|
|
61
|
+
`npm test` before releasing a parser, compiler, or schema change; update those
|
|
62
|
+
checks with any new contract.
|
|
63
|
+
|
|
64
|
+
## Opening and conclusion passages
|
|
65
|
+
|
|
66
|
+
Version 5 adds optional `opening` and `conclusion` at the document root and
|
|
67
|
+
inside each independently authored `tours.historical` or `tours.deconstructed`.
|
|
68
|
+
Each belongs to that narrative; one mode does not inherit another mode’s prose.
|
|
69
|
+
Switching modes stops narration and restores the selected mode’s reading position.
|
|
70
|
+
Returning from file exploration keeps the current passage and paused speech position.
|
|
71
|
+
|
|
72
|
+
```yaml
|
|
73
|
+
version: 5
|
|
74
|
+
opening:
|
|
75
|
+
title: What this tour will establish
|
|
76
|
+
summary: Explain the problem, the review question, and the route through the evidence.
|
|
77
|
+
bullets:
|
|
78
|
+
- Name the boundaries this tour will and will not cover.
|
|
79
|
+
conclusion:
|
|
80
|
+
title: What the evidence established
|
|
81
|
+
summary: Summarize the supported behavior and its consequence for the reviewer.
|
|
82
|
+
bullets:
|
|
83
|
+
- State any remaining uncertainty and the next check that would resolve it.
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Both passages require nonblank `title` and `summary`; optional `bullets` contain
|
|
87
|
+
nonblank strings. Unknown fields are rejected. They are narrative reading
|
|
88
|
+
positions, not scenes or evidence: they add no files, steps, or coverage.
|
|
89
|
+
The opening extends the title page, and the conclusion follows the last step.
|
|
90
|
+
Keyboard navigation, narration, search, and heading links include both, including
|
|
91
|
+
image-only guides. A conclusion link uses `part=conclusion`; requesting it in a
|
|
92
|
+
mode without a conclusion reports an unavailable target. Legacy tours remain
|
|
93
|
+
readable and receive no invented closing.
|
|
59
94
|
|
|
60
95
|
## Opening and compiling a source
|
|
61
96
|
|
|
@@ -88,7 +123,7 @@ once. When omitted, the presenter falls back to `title`, then a generic tour lab
|
|
|
88
123
|
|
|
89
124
|
## Independent authored tours
|
|
90
125
|
|
|
91
|
-
Version
|
|
126
|
+
Version 4 can supply `tours.historical.chapters` and
|
|
92
127
|
`tours.deconstructed.chapters`. Each uses the chapter and scene structure below,
|
|
93
128
|
with the document's shared range, anchors, and connections. This lets one file
|
|
94
129
|
explain actual revisions and also teach the change through synthetic stages.
|
|
@@ -110,17 +145,35 @@ See `examples/navigation-lab.bygone.yaml` for both tours in one file, and
|
|
|
110
145
|
[presentation navigation](./present.md#explore-and-follow-tours) for History and
|
|
111
146
|
Compare.
|
|
112
147
|
|
|
148
|
+
## Chapter previews
|
|
149
|
+
|
|
150
|
+
Version 5 chapters may include a nonblank `summary`: one or two sentences
|
|
151
|
+
explaining what comes next and why. It is optional in root chapters and each
|
|
152
|
+
independently authored mode. The compiler preserves it in the corresponding
|
|
153
|
+
compiled chapters and derived modes.
|
|
154
|
+
|
|
155
|
+
Only chapters with summaries have presentation and narration stops. Chapters
|
|
156
|
+
without summaries remain in the contents; selecting their heading or opening
|
|
157
|
+
a chapter link goes to their first scene. Scene-title links alone do not create
|
|
158
|
+
a chapter introduction. Earlier format versions accept chapters without this field.
|
|
159
|
+
|
|
113
160
|
## Scene directory overviews
|
|
114
161
|
|
|
115
|
-
In
|
|
162
|
+
In versions 4 and 5, an authored walkthrough, stacked-diff, or deconstructed-diff scene may carry a
|
|
116
163
|
directory overview for the presenter to render alongside the current scene:
|
|
117
164
|
|
|
118
165
|
```yaml
|
|
119
166
|
overview:
|
|
120
167
|
kind: directory-diff
|
|
168
|
+
purpose: See which web layers changed together before tracing their interaction.
|
|
121
169
|
path: web
|
|
122
170
|
```
|
|
123
171
|
|
|
172
|
+
Version 5 requires a nonblank `purpose`: explain what the inventory establishes
|
|
173
|
+
and why it is useful at this point. A scene without an explicit `overview` previews
|
|
174
|
+
its first step’s evidence with a “Coming up” caption and no active annotation.
|
|
175
|
+
Title, chapter, discussion, and conclusion passages show narrative only.
|
|
176
|
+
|
|
124
177
|
`path` is optional and is relative to the repository root. Omit it or use `.`
|
|
125
178
|
for the root directory. Absolute paths, backslashes, and `..` path segments are
|
|
126
179
|
rejected. The compiler preserves this evidence on the corresponding compiled
|
|
@@ -150,7 +203,7 @@ Use an explicit authored Historical scene to choose a narrower real comparison.
|
|
|
150
203
|
## Structure
|
|
151
204
|
|
|
152
205
|
```yaml
|
|
153
|
-
version:
|
|
206
|
+
version: 4
|
|
154
207
|
title: A reviewer-facing title
|
|
155
208
|
windowTitle: PR-1234
|
|
156
209
|
sourceUrl: https://example.test/pull/123
|
|
@@ -207,42 +260,6 @@ the claim while the code is visible and avoids repeating it in scene framing.
|
|
|
207
260
|
|
|
208
261
|
Narrative text supports inline Markdown links such as `[ticket](https://example.com/ticket)`. HTTP and HTTPS destinations open outside the tour; link labels remain visible and clickable during narration highlighting. Authored HTML, other URL schemes, and local-file destinations are treated as plain text. This is link support, not a general Markdown renderer.
|
|
209
262
|
|
|
210
|
-
The source schema has no ad hoc `notes` field. In v3, use the top-level `review`
|
|
211
|
-
block below for evidence-linked review observations and unresolved questions;
|
|
212
|
-
do not present those questions as settled step rationale.
|
|
213
|
-
|
|
214
|
-
## Review notes
|
|
215
|
-
|
|
216
|
-
The optional v3 `review` block records authored interpretation separately from
|
|
217
|
-
the narrative and deterministic evidence. It contains `baseOid`, `headOid`, and
|
|
218
|
-
a nonempty `items` array. Both OIDs must be full 40- or 64-character hexadecimal
|
|
219
|
-
Git IDs, matching the resolved **merge base** and head, respectively. A changed
|
|
220
|
-
range makes the review stale and compilation fails rather than silently
|
|
221
|
-
carrying the conclusions forward.
|
|
222
|
-
|
|
223
|
-
Each item has a unique nonblank `id`, a `kind` (`concept`, `boundary`,
|
|
224
|
-
`tradeoff`, or `question`), nonblank `title` and `body`, and an `evidence` array
|
|
225
|
-
of `{ sceneId, stepId }` references to endpoint walkthrough steps in the root
|
|
226
|
-
`chapters` (not scenes defined only inside an independent `tours` mode).
|
|
227
|
-
Synthetic stage IDs and stacked-diff step IDs are not walkthrough evidence.
|
|
228
|
-
Claims require at least one reference. Questions may use an empty evidence
|
|
229
|
-
array but require a nonblank `nextCheck`; other items may also supply it.
|
|
230
|
-
Validation confirms the references, not the truth of an author's claim or the
|
|
231
|
-
state of an external deployment.
|
|
232
|
-
|
|
233
|
-
For example, add this item to `review.items` alongside the structure above:
|
|
234
|
-
|
|
235
|
-
```yaml
|
|
236
|
-
- id: check-caller
|
|
237
|
-
kind: question
|
|
238
|
-
title: Is the caller compatible?
|
|
239
|
-
body: The source shows persistence, but the deployed caller has not been checked.
|
|
240
|
-
evidence:
|
|
241
|
-
- sceneId: decision-flow
|
|
242
|
-
stepId: persist-first
|
|
243
|
-
nextCheck: Verify the deployed caller contract against this exact head revision.
|
|
244
|
-
```
|
|
245
|
-
|
|
246
263
|
## Requirements
|
|
247
264
|
|
|
248
265
|
A walkthrough step may carry an optional `requirement` that names the stated
|
|
@@ -272,7 +289,7 @@ results search the compiled base and head snapshots, open the exact file and
|
|
|
272
289
|
side, and preserve **Return to tour** so exploration does not lose authored
|
|
273
290
|
context.
|
|
274
291
|
|
|
275
|
-
Version 2 and
|
|
292
|
+
Version 2 and 4 tours show one mode control for moving among live Git History,
|
|
276
293
|
arbitrary Compare ranges, and the authored tours available in that manifest.
|
|
277
294
|
Previously compiled version 2 deconstructed tours retain their authored final
|
|
278
295
|
endpoint walkthrough as **Final tour** beside **Deconstructed tour**. Other
|
|
@@ -285,9 +302,9 @@ only when every panel is a real selected Git revision. Use a
|
|
|
285
302
|
[deconstructed-diff example](../examples/deconstructed-diff.bygone) when
|
|
286
303
|
the teaching order is clearer than the real commit history; its cumulative
|
|
287
304
|
panels are synthetic explanation stages and must never be described as
|
|
288
|
-
commits. In versions 2 and
|
|
305
|
+
commits. In versions 2, 4, and 5, a `deconstructed-diff` scene in root `chapters`
|
|
289
306
|
requires a real `stack` with the same base and final endpoints and nonempty
|
|
290
|
-
walkthrough `steps` for compatibility. In
|
|
307
|
+
walkthrough `steps` for compatibility. In versions 4 and 5, a scene authored inside
|
|
291
308
|
`tours.deconstructed` may omit both because that tour is synthetic by design.
|
|
292
309
|
Explicit `tours.historical` content supplies its own explanation of real
|
|
293
310
|
revisions. Bygone does not infer a real stack from Git history. Every changed
|
package/docs/explore.md
CHANGED
|
@@ -6,10 +6,13 @@ prescribed reading order.
|
|
|
6
6
|
## Start a comparison
|
|
7
7
|
|
|
8
8
|
- The **File** menu contains the familiar new/open/save lifecycle. **New Blank
|
|
9
|
-
Comparison** opens
|
|
10
|
-
- **File → Compare Files…** accepts
|
|
9
|
+
Comparison** opens two writable blank panels without source paths.
|
|
10
|
+
- **File → Compare Files…** accepts one or more files. Select one item at a time when
|
|
11
11
|
the files live in different folders, or select several together. Two files open a side-by-side
|
|
12
|
-
comparison; additional files open the focused multi-panel strip.
|
|
12
|
+
comparison; additional files open the focused multi-panel strip. Cancel the second
|
|
13
|
+
file picker to review your first selection and choose **Open File**. The summary
|
|
14
|
+
also offers **Select More…** and **Add Blank Panel**; add blank panels repeatedly
|
|
15
|
+
to include as many as you need before choosing **Compare**.
|
|
13
16
|
- **File → Compare Directories…** uses the same additive selection flow for two or
|
|
14
17
|
more directory trees.
|
|
15
18
|
- Drag files or directories into the window for the same selection-count
|
|
@@ -58,6 +61,14 @@ The focused strip shows an adjacent pair when space permits and one readable
|
|
|
58
61
|
panel on narrow windows. Use the strip buttons, panel headers, gutters, wheel,
|
|
59
62
|
or `Alt+Left`/`Alt+Right` to change focus.
|
|
60
63
|
|
|
64
|
+
In a file comparison panel strip, drag a panel title to move it, or open its **⋮** menu and choose
|
|
65
|
+
**Move left** or **Move right**. Hold a drag near either edge to reach hidden
|
|
66
|
+
panels; press `Escape` to cancel. Edits, undo history, and save destinations
|
|
67
|
+
travel with the panel. Adjacent diffs and copy arrows follow the new order.
|
|
68
|
+
Comparisons built from the commit selector keep revision order and cannot be
|
|
69
|
+
rearranged. Explicitly opened comparison panels (including command-line revision
|
|
70
|
+
comparisons) can still be moved. History and authored tours keep their original order.
|
|
71
|
+
|
|
61
72
|
- `Cmd/Ctrl+F` searches the active pane.
|
|
62
73
|
- `Cmd/Ctrl+Shift+F` searches either the panes currently displayed by the strip
|
|
63
74
|
or every loaded panel in the comparison, using the explicit scope selector.
|
|
@@ -4,6 +4,9 @@ Bygone treats an LLM as a narrative planner and evidence selector, not as the au
|
|
|
4
4
|
|
|
5
5
|
For agents that support repository skills, use the agent-agnostic [`pr-tour-guide` skill](../skills/pr-tour-guide/SKILL.md). It packages the complete evidence, authoring, validation, and handoff workflow without depending on a particular agent vendor.
|
|
6
6
|
|
|
7
|
+
For optional v5 audience metadata, expected-behavior framing, and the investigation
|
|
8
|
+
workflow for reader concerns, see [Expectations and reader feedback](../skills/pr-tour-guide/references/expectations-and-feedback.md).
|
|
9
|
+
|
|
7
10
|
Install it with the skills CLI:
|
|
8
11
|
|
|
9
12
|
```sh
|
|
@@ -50,7 +53,8 @@ Use `bygone tour schema` to print the current JSON Schema. The checked-in schema
|
|
|
50
53
|
|
|
51
54
|
## Narrative constraints
|
|
52
55
|
|
|
53
|
-
-
|
|
56
|
+
- Give each scene one explanatory job. Choose the number of steps needed to
|
|
57
|
+
develop it; do not split or pad an argument to meet a step-count target.
|
|
54
58
|
- Lead with contracts, invariants, or architectural boundaries before their consumers.
|
|
55
59
|
- Pair behavior with the tests or evidence that prove it.
|
|
56
60
|
- Keep mechanical, generated, and lockfile changes out of the authored narrative unless they alter the reviewer’s conclusion; they remain visible in the complete Files rail.
|
|
@@ -59,7 +63,50 @@ Use `bygone tour schema` to print the current JSON Schema. The checked-in schema
|
|
|
59
63
|
- Avoid claims about runtime behavior, safety, or intent that have no linked evidence.
|
|
60
64
|
- Use connections sparingly. A connection should answer “how are these two facts related?”
|
|
61
65
|
- Preserve access to the complete change instead of presenting the tour as exhaustive review.
|
|
62
|
-
-
|
|
66
|
+
- Put concepts, boundaries, and tradeoffs beside their evidence in scene or step narrative. Label unresolved questions explicitly and state the next check that would resolve them; do not present them as settled conclusions.
|
|
67
|
+
|
|
68
|
+
## Explain the causal link
|
|
69
|
+
|
|
70
|
+
Before selecting files, write what the reader should be able to explain after
|
|
71
|
+
each scene. “We inspected the handler” is an activity; “layout notifications
|
|
72
|
+
could invoke synchronization without a position change” is an understanding.
|
|
73
|
+
Merge scenes that produce the same answer, including a separate test scene
|
|
74
|
+
when its checks simply complete the explanation already underway.
|
|
75
|
+
|
|
76
|
+
Keep the connection from behavior to mechanism to evidence in the main path.
|
|
77
|
+
Do not hide the reason a change works behind a scope disclosure or replace it
|
|
78
|
+
with an inventory of files and revisions. Use enough prose to explain the
|
|
79
|
+
inference. A shorter description can require more reader effort when it removes
|
|
80
|
+
the causal link.
|
|
81
|
+
|
|
82
|
+
For example, “Ignore layout events” names an action. This explains its effect:
|
|
83
|
+
|
|
84
|
+
> Neither scroll position changed, so the guard redraws the connectors and
|
|
85
|
+
> returns before either synchronizer runs. This prevents a layout event from
|
|
86
|
+
> undoing the code reveal. Events that do change a position continue through
|
|
87
|
+
> the handler.
|
|
88
|
+
|
|
89
|
+
Use a title that states the important finding, then focus the code or assertion
|
|
90
|
+
that supports it. Include a preserved behavior, tradeoff, or uncertainty when
|
|
91
|
+
it affects that finding. These are writing responsibilities, not mandatory
|
|
92
|
+
claim/cause/proof fields or repeated labels on every slide.
|
|
93
|
+
|
|
94
|
+
Compare the small fix in [marker-focus.bygone](../examples/marker-focus.bygone)
|
|
95
|
+
with the multi-commit [navigation lab](../examples/navigation-lab.bygone.yaml).
|
|
96
|
+
The latter uses multiple questions within one comparison before deliberately
|
|
97
|
+
isolating the later correction. Its synthetic mode separates teaching stages
|
|
98
|
+
from real history; generated focus steps are not additional explanatory scenes.
|
|
99
|
+
Each constructed stage's narration appears at its first evidence step. Later
|
|
100
|
+
focuses retain their code targets and offer **Read stage explanation** instead
|
|
101
|
+
of repeating the paragraph. Write the stage narration to cover its argument
|
|
102
|
+
as a whole, and use the scene introduction to explain why the stages belong together.
|
|
103
|
+
|
|
104
|
+
After validation, walk the compiled route. Check for repeated stage narration,
|
|
105
|
+
unnecessary setup stops, and evidence that does not support the adjacent claim.
|
|
106
|
+
Compiling successfully establishes source validity, not reader understanding.
|
|
107
|
+
Ask an unfamiliar reader what changed, why the mechanism works, what evidence
|
|
108
|
+
supports it, and what remains unverified. At a transition, also ask whether the
|
|
109
|
+
comparison changed. Use those observations to choose further viewer changes.
|
|
63
110
|
|
|
64
111
|
## Anchor rules
|
|
65
112
|
|
|
@@ -75,7 +122,7 @@ The missing-tour buttons in History and Compare supply a short handoff like:
|
|
|
75
122
|
|
|
76
123
|
```text
|
|
77
124
|
Read and follow the Bygone tour skill at /path/to/SKILL.md.
|
|
78
|
-
Create a
|
|
125
|
+
Create a v5 deconstructed tour for /path/to/repository, from <base OID> to <head OID>.
|
|
79
126
|
Scope: <selected paths, or the whole repository>.
|
|
80
127
|
Additional context: …
|
|
81
128
|
```
|
|
@@ -95,46 +142,37 @@ use **Reset prompt** to regenerate their file reference and workspace context.
|
|
|
95
142
|
|
|
96
143
|
The generated prose remains a proposal. Validation proves that its evidence exists and is reproducible; a reviewer must still judge whether its interpretation is correct.
|
|
97
144
|
|
|
98
|
-
##
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
The `baseOid` pin is the resolved merge-base OID, which may differ from the
|
|
133
|
-
requested base ref; `headOid` is the resolved head OID. Both pins must match
|
|
134
|
-
the resolved range. Compilation rejects a review whose pins describe a changed
|
|
135
|
-
range, and imported manifests reject a review whose pins do not match the
|
|
136
|
-
manifest range. `tour validate` checks the shape, OIDs, and scene/step
|
|
137
|
-
grounding of review notes; it does not verify that an authored interpretation
|
|
138
|
-
is semantically correct. It also does not run or attest to external checks such
|
|
139
|
-
as tests, CI, or the `nextCheck` follow-up. Those claims belong in the note only
|
|
140
|
-
when the author has evidence for them.
|
|
145
|
+
## Frame the reading path
|
|
146
|
+
|
|
147
|
+
Use version 5 opening and conclusion passages to state the tour’s question and
|
|
148
|
+
recap what its evidence established. Give each authored mode its own framing.
|
|
149
|
+
The Intro is an explicit outline entry. Its “What you'll see” route links to
|
|
150
|
+
chapters, or scenes when there are no chapters. Lists use simple reference
|
|
151
|
+
numbers; headings and narration use plain titles.
|
|
152
|
+
Start the opening with the concrete behavior added or fixed and why it matters.
|
|
153
|
+
Keep that outcome to one or two sentences, then introduce the route.
|
|
154
|
+
Write the opening to explain the problem and the sequence of questions the route
|
|
155
|
+
will answer. Use scene titles that communicate those questions or findings.
|
|
156
|
+
The generated itinerary supplies navigation facts, not the reason the work matters.
|
|
157
|
+
|
|
158
|
+
Add optional v5 `chapter.summary` only when one or two brief sentences help
|
|
159
|
+
explain what comes next and why. Chapters without previews stay in the contents
|
|
160
|
+
but are skipped as presentation and narration stops; scene-title links are not
|
|
161
|
+
a substitute for preview prose.
|
|
162
|
+
|
|
163
|
+
A scene answers one reviewer question; steps provide the supporting evidence.
|
|
164
|
+
Multiple scenes may examine the same comparison when each has a different
|
|
165
|
+
question. Merge scenes that merely repeat a question across files.
|
|
166
|
+
|
|
167
|
+
Before the first step, explain why this scene comes next, what evidence will
|
|
168
|
+
appear, and what the reader should notice in connected prose. Do not repeat the
|
|
169
|
+
chapter route or list every file and revision in each introduction. Keep the
|
|
170
|
+
rationale visible; evidence headers and navigation carry reference details.
|
|
171
|
+
Use an explicit directory overview
|
|
172
|
+
only when the inventory itself supports that question, and state its `purpose`.
|
|
173
|
+
Without one, the viewer previews the first step. The comparison caption identifies
|
|
174
|
+
resolved revisions or synthetic stages; prose should explain why a transition
|
|
175
|
+
matters. A new scene or file does not inherently mean a new comparison. Close
|
|
176
|
+
by connecting the mechanism back to the promised behavior and stating material
|
|
177
|
+
limits, rather than reciting the chapter titles. Include any remaining checks without adding
|
|
178
|
+
fake code stops. See [the format](change-tour-format.md) for the fields.
|