transcript-viewer 0.14.0__tar.gz → 0.14.1__tar.gz

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.
Files changed (40) hide show
  1. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/PKG-INFO +11 -12
  2. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/README.md +10 -11
  3. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/pyproject.toml +1 -1
  4. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/src/transcript_viewer/page.html +6 -6
  5. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/tests/page.test.js +20 -1
  6. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/uv.lock +1 -1
  7. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/.coverage +0 -0
  8. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/.github/workflows/publish.yml +0 -0
  9. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/.github/workflows/test.yml +0 -0
  10. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/.gitignore +0 -0
  11. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/design/Anchor.dc.html +0 -0
  12. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/design/Dense.dc.html +0 -0
  13. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/design/Hover.dc.html +0 -0
  14. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/design/Main.dc.html +0 -0
  15. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/design/Quiet.dc.html +0 -0
  16. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/design/canvas.json +0 -0
  17. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/design/delegation-timeline.html +0 -0
  18. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/src/transcript_viewer/__init__.py +0 -0
  19. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/src/transcript_viewer/ai.py +0 -0
  20. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/src/transcript_viewer/cli.py +0 -0
  21. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/src/transcript_viewer/config.py +0 -0
  22. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/src/transcript_viewer/corpus.py +0 -0
  23. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/src/transcript_viewer/fetch.py +0 -0
  24. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/src/transcript_viewer/library.py +0 -0
  25. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/src/transcript_viewer/store.py +0 -0
  26. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/src/transcript_viewer/viewer.py +0 -0
  27. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/tests/fixtures/big-command.json +0 -0
  28. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/tests/test_ai.py +0 -0
  29. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/tests/test_cli.py +0 -0
  30. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/tests/test_config.py +0 -0
  31. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/tests/test_corpus.py +0 -0
  32. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/tests/test_fetch.py +0 -0
  33. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/tests/test_library.py +0 -0
  34. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/tests/test_page.py +0 -0
  35. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/tests/test_readme.py +0 -0
  36. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/tests/test_store.py +0 -0
  37. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/tests/test_stream.py +0 -0
  38. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/tests/test_style.py +0 -0
  39. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/tests/test_tidiness.py +0 -0
  40. {transcript_viewer-0.14.0 → transcript_viewer-0.14.1}/tests/test_viewer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: transcript-viewer
3
- Version: 0.14.0
3
+ Version: 0.14.1
4
4
  Summary: Browse agent transcripts in a local, dependency-free web viewer.
5
5
  License: MIT
6
6
  Requires-Python: >=3.12
@@ -179,17 +179,16 @@ If that directory is still there, the first run moves it to
179
179
  `~/.transcript-viewer` — index, annotations and stored keys together — and says
180
180
  so. Nothing is left behind and nothing is copied twice.
181
181
 
182
- A run that delegated shows what it farmed out, above its steps, as a **list**
183
- or a **timeline**. The list leads because the common question is what was asked
184
- and what came back, and the median subagent here is two steps — a bar for which
185
- says almost nothing. It carries the task, the kind, the steps, how long it took
186
- and the tools it reached for, sorted however you ask.
187
-
188
- The timeline is for when the question is *when*, and alongside what. A row is
189
- shared by everything that did not overlap, so a second row exists only because
190
- two things ran at once: thirty subagents in one session pack into eight rows,
191
- and a session of fifteen packs into one, which is the honest picture of a run
192
- that never did two things at a time. Either way a subagent is called what it was asked to
182
+ A run that delegated shows what it farmed out, above its steps, as a
183
+ **timeline** or a **list**. The timeline leads: a row is shared by everything
184
+ that did not overlap, so a second row exists only because two things ran at
185
+ once. Thirty subagents in one session pack into eight rows, and a session of
186
+ fifteen packs into one, which is the honest picture of a run that never did two
187
+ things at a time.
188
+
189
+ The list is one chip away, and carries what a chart cannot: the task, the kind,
190
+ the steps, how long it took and the tools it reached for, sorted however you
191
+ ask. Whichever you pick is remembered. Either way a subagent is called what it was asked to
193
192
  do — "Review backend for bugs and DRY" rather than "general-purpose" — wherever
194
193
  that was written down, which is 50 of the 53 Claude Code subagents here; the
195
194
  kind is the fallback, and reads as a handle rather than as prose so the
@@ -166,17 +166,16 @@ If that directory is still there, the first run moves it to
166
166
  `~/.transcript-viewer` — index, annotations and stored keys together — and says
167
167
  so. Nothing is left behind and nothing is copied twice.
168
168
 
169
- A run that delegated shows what it farmed out, above its steps, as a **list**
170
- or a **timeline**. The list leads because the common question is what was asked
171
- and what came back, and the median subagent here is two steps — a bar for which
172
- says almost nothing. It carries the task, the kind, the steps, how long it took
173
- and the tools it reached for, sorted however you ask.
174
-
175
- The timeline is for when the question is *when*, and alongside what. A row is
176
- shared by everything that did not overlap, so a second row exists only because
177
- two things ran at once: thirty subagents in one session pack into eight rows,
178
- and a session of fifteen packs into one, which is the honest picture of a run
179
- that never did two things at a time. Either way a subagent is called what it was asked to
169
+ A run that delegated shows what it farmed out, above its steps, as a
170
+ **timeline** or a **list**. The timeline leads: a row is shared by everything
171
+ that did not overlap, so a second row exists only because two things ran at
172
+ once. Thirty subagents in one session pack into eight rows, and a session of
173
+ fifteen packs into one, which is the honest picture of a run that never did two
174
+ things at a time.
175
+
176
+ The list is one chip away, and carries what a chart cannot: the task, the kind,
177
+ the steps, how long it took and the tools it reached for, sorted however you
178
+ ask. Whichever you pick is remembered. Either way a subagent is called what it was asked to
180
179
  do — "Review backend for bugs and DRY" rather than "general-purpose" — wherever
181
180
  that was written down, which is 50 of the 53 Claude Code subagents here; the
182
181
  kind is the fallback, and reads as a handle rather than as prose so the
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "transcript-viewer"
3
- version = "0.14.0"
3
+ version = "0.14.1"
4
4
  description = "Browse agent transcripts in a local, dependency-free web viewer."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -2686,13 +2686,13 @@ function axisMarks(lo, hi) {
2686
2686
 
2687
2687
  let LANES = [];
2688
2688
 
2689
- /* Which of the two views the box is showing. A list by default: the common
2690
- question is what was farmed out and what came back, and the median subagent
2691
- here is two steps — a bar for which says almost nothing. The timeline is for
2692
- when the question is when, and alongside what. */
2689
+ /* Which of the two views the box is showing, remembered between runs. The
2690
+ timeline by default: packed, its rows carry the shape of the run and the
2691
+ parallelism in it at a glance, which is what the box is above the transcript
2692
+ for. The list is where the names and numbers are, one chip away. */
2693
2693
  let LANEVIEW = (() => {
2694
- try { return localStorage.getItem("transcript-viewer.delegation") || "list"; }
2695
- catch (e) { return "list"; }
2694
+ try { return localStorage.getItem("transcript-viewer.delegation") || "time"; }
2695
+ catch (e) { return "time"; }
2696
2696
  })();
2697
2697
 
2698
2698
  function setLaneView(v) {
@@ -2338,13 +2338,32 @@ test("a second row exists only because two things ran at once", () => {
2338
2338
  assert.deepStrictEqual(out.on, [0, 1], "the overlap is what made the row");
2339
2339
  });
2340
2340
 
2341
- test("the list is what the box shows first", () => {
2341
+ test("the timeline is what the box shows first", () => {
2342
+ // Nothing stored: the timeline, whose packed rows carry the shape of the run.
2343
+ const html = run(`
2344
+ localStorage.getItem = () => null;
2345
+ LANEVIEW = localStorage.getItem("transcript-viewer.delegation") || "time";
2346
+ return drawLanes(${JSON.stringify(TWO_AT_ONCE)});
2347
+ `);
2348
+ assert.match(html, /class="track"/, "the chart is drawn");
2349
+ assert.ok(!/class="lanelist"/.test(html));
2350
+ });
2351
+
2352
+ test("the list is one chip away, and shows what a chart cannot", () => {
2342
2353
  const html = run(`LANEVIEW="list"; return drawLanes(${JSON.stringify(TWO_AT_ONCE)})`);
2343
2354
  assert.match(html, /class="lanelist"/);
2344
2355
  assert.match(html, /what it was asked to do/, "the task leads");
2345
2356
  assert.ok(!/class="track"/.test(html), "and no chart is drawn");
2346
2357
  });
2347
2358
 
2359
+ test("what was stored is what is shown", () => {
2360
+ const stored = run(`
2361
+ localStorage.getItem = (k) => (k === "transcript-viewer.delegation" ? "list" : null);
2362
+ return localStorage.getItem("transcript-viewer.delegation") || "time";
2363
+ `);
2364
+ assert.strictEqual(stored, "list", "a choice made once is kept");
2365
+ });
2366
+
2348
2367
  test("the list names each one and says what it cost", () => {
2349
2368
  const html = run(`LANEVIEW="list"; return drawLanes(${JSON.stringify(TWO_AT_ONCE)})`);
2350
2369
  assert.match(html, /find the theme/, "the task, where there was one");
@@ -388,7 +388,7 @@ wheels = [
388
388
 
389
389
  [[package]]
390
390
  name = "transcript-viewer"
391
- version = "0.14.0"
391
+ version = "0.14.1"
392
392
  source = { editable = "." }
393
393
  dependencies = [
394
394
  { name = "atif-make" },