system-diff 0.3.4__tar.gz → 0.4.0__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 (56) hide show
  1. {system_diff-0.3.4 → system_diff-0.4.0}/PKG-INFO +23 -1
  2. {system_diff-0.3.4 → system_diff-0.4.0}/README.md +22 -0
  3. {system_diff-0.3.4 → system_diff-0.4.0}/docs/diagrams/system.json +81 -15
  4. {system_diff-0.3.4 → system_diff-0.4.0}/docs/diagrams/system.svg +44 -37
  5. {system_diff-0.3.4 → system_diff-0.4.0}/mods/system-diff/.claude-plugin/plugin.json +1 -1
  6. {system_diff-0.3.4 → system_diff-0.4.0}/mods/system-diff/hooks/page.tsx +2 -2
  7. {system_diff-0.3.4 → system_diff-0.4.0}/mods/system-diff/hooks/pane.test.tsx +5 -2
  8. {system_diff-0.3.4 → system_diff-0.4.0}/mods/system-diff/hooks/register.tsx +6 -2
  9. {system_diff-0.3.4 → system_diff-0.4.0}/pyproject.toml +1 -1
  10. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/__init__.py +1 -1
  11. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/agent.py +32 -12
  12. system_diff-0.4.0/src/system_diff/agents.py +296 -0
  13. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/cli.py +1 -1
  14. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/mcp_server.py +44 -2
  15. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/pane.py +107 -2
  16. {system_diff-0.3.4 → system_diff-0.4.0}/system-diff.toml +8 -0
  17. {system_diff-0.3.4 → system_diff-0.4.0}/tests/test_checkpoint_watch_mcp.py +2 -1
  18. {system_diff-0.3.4 → system_diff-0.4.0}/tests/test_design_and_pane.py +43 -0
  19. {system_diff-0.3.4 → system_diff-0.4.0}/tests/test_terminal_and_learning.py +7 -1
  20. {system_diff-0.3.4 → system_diff-0.4.0}/.claude-plugin/marketplace.json +0 -0
  21. {system_diff-0.3.4 → system_diff-0.4.0}/.gitattributes +0 -0
  22. {system_diff-0.3.4 → system_diff-0.4.0}/.github/workflows/ci.yml +0 -0
  23. {system_diff-0.3.4 → system_diff-0.4.0}/.github/workflows/release.yml +0 -0
  24. {system_diff-0.3.4 → system_diff-0.4.0}/.github/workflows/system-diff.yml +0 -0
  25. {system_diff-0.3.4 → system_diff-0.4.0}/.gitignore +0 -0
  26. {system_diff-0.3.4 → system_diff-0.4.0}/LICENSE +0 -0
  27. {system_diff-0.3.4 → system_diff-0.4.0}/mods/system-diff/hooks/hooks.json +0 -0
  28. {system_diff-0.3.4 → system_diff-0.4.0}/mods/system-diff/types/index.d.ts +0 -0
  29. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/__main__.py +0 -0
  30. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/activity.py +0 -0
  31. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/architecture.py +0 -0
  32. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/canvas.py +0 -0
  33. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/companion.py +0 -0
  34. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/compare.py +0 -0
  35. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/config.py +0 -0
  36. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/design.py +0 -0
  37. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/diff.py +0 -0
  38. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/extract.py +0 -0
  39. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/graph.py +0 -0
  40. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/inside.py +0 -0
  41. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/learn.py +0 -0
  42. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/narrate.py +0 -0
  43. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/panel.py +0 -0
  44. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/pictures.py +0 -0
  45. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/png.py +0 -0
  46. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/profile.py +0 -0
  47. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/readme.py +0 -0
  48. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/sources.py +0 -0
  49. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/statusline.py +0 -0
  50. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/textmap.py +0 -0
  51. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/topics.py +0 -0
  52. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/tui.py +0 -0
  53. {system_diff-0.3.4 → system_diff-0.4.0}/src/system_diff/watch.py +0 -0
  54. {system_diff-0.3.4 → system_diff-0.4.0}/tests/conftest.py +0 -0
  55. {system_diff-0.3.4 → system_diff-0.4.0}/tests/test_capture.py +0 -0
  56. {system_diff-0.3.4 → system_diff-0.4.0}/tests/test_system_diff.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: system-diff
3
- Version: 0.3.4
3
+ Version: 0.4.0
4
4
  Summary: Draws your system from its code (parts, entry points, data, outside systems) and what each change adds, changes or removes. No dependencies; SVG pictures for PRs and READMEs.
5
5
  Project-URL: Homepage, https://github.com/simplifiedmachine/system-diff
6
6
  Project-URL: Documentation, https://github.com/simplifiedmachine/system-diff/wiki
@@ -100,6 +100,9 @@ Claude is changing in it. `/system-diff close` (or "× close" in its tab row) hi
100
100
  - **What just happened**: the system diff, step by step. Each change an edit made is said in plain words, with why
101
101
  it matters and the file it came from. Edits that changed no structure are told once.
102
102
  - **Map**: the system diagram since your checkpoint, every box to pick and zoom into.
103
+ - **Agents**: the team at work. Each agent's area, the blocks it owns and edited, and unread messages; the system
104
+ diagram with `@agent` after each block it works on; the bus, newest first; and a warning when two agents edit one
105
+ block, or one edits a block claimed for another.
103
106
  - **Changes**: every change since your checkpoint, and this turn, read for design. Once you have understood it, tell
104
107
  Claude "mark it as seen" (or run `system-diff checkpoint`): from then on you see only what is new to you.
105
108
  - **Topics**: the stack, technology by technology. Pick one and the parts that use it light up in the diagram; space
@@ -116,6 +119,25 @@ One meaning per colour, so your eye goes where it should:
116
119
 
117
120
  `n` `m` `c` `t` switch views.
118
121
 
122
+ ### A team of agents, by the system's blocks
123
+
124
+ Claude does most work alone unless asked otherwise, so system-diff asks it to plan a team:
125
+
126
+ - **Planning:** at each prompt, the hook tells Claude to call `plan_agents` with the task. The plan splits the task by
127
+ the system's blocks, one agent per area it touches (a container, else a part). Each agent gets the blocks it owns
128
+ (claimed for it), the blocks it depends on, and a brief to launch it with. Claude then launches the agents in
129
+ parallel as subagents. Turn this off with `[agents] orchestrate = false` in `system-diff.toml`.
130
+ - **The bus:** an async publish/subscribe channel whose topics are the blocks. Each agent follows the blocks its own
131
+ depend on. Every change an agent makes to a block's structure is published on that block's topic as it happens
132
+ ("API no longer answers DELETE /orders/{id}"), with why it matters. Agents publish their own notes with `publish`
133
+ (to a block, to "all", or to "agent:<name>"). Each agent's unread messages reach it with its next tool result:
134
+ nobody waits on anybody.
135
+ - **Claims:** `claim` gives an agent its blocks. An edit to someone else's block is published to its owner and shown
136
+ under Needs your attention.
137
+
138
+ The MCP tools: `plan_agents`, `claim`, `publish`, `subscribe`, `inbox`, `team`. It all stays in `.git/system-diff/`
139
+ (`agents.json`, `bus.jsonl`), never pushed.
140
+
119
141
  ### In the conversation
120
142
 
121
143
  - **After an edit that changes the system's structure**, one line under it: "System diff: API now answers GET
@@ -68,6 +68,9 @@ Claude is changing in it. `/system-diff close` (or "× close" in its tab row) hi
68
68
  - **What just happened**: the system diff, step by step. Each change an edit made is said in plain words, with why
69
69
  it matters and the file it came from. Edits that changed no structure are told once.
70
70
  - **Map**: the system diagram since your checkpoint, every box to pick and zoom into.
71
+ - **Agents**: the team at work. Each agent's area, the blocks it owns and edited, and unread messages; the system
72
+ diagram with `@agent` after each block it works on; the bus, newest first; and a warning when two agents edit one
73
+ block, or one edits a block claimed for another.
71
74
  - **Changes**: every change since your checkpoint, and this turn, read for design. Once you have understood it, tell
72
75
  Claude "mark it as seen" (or run `system-diff checkpoint`): from then on you see only what is new to you.
73
76
  - **Topics**: the stack, technology by technology. Pick one and the parts that use it light up in the diagram; space
@@ -84,6 +87,25 @@ One meaning per colour, so your eye goes where it should:
84
87
 
85
88
  `n` `m` `c` `t` switch views.
86
89
 
90
+ ### A team of agents, by the system's blocks
91
+
92
+ Claude does most work alone unless asked otherwise, so system-diff asks it to plan a team:
93
+
94
+ - **Planning:** at each prompt, the hook tells Claude to call `plan_agents` with the task. The plan splits the task by
95
+ the system's blocks, one agent per area it touches (a container, else a part). Each agent gets the blocks it owns
96
+ (claimed for it), the blocks it depends on, and a brief to launch it with. Claude then launches the agents in
97
+ parallel as subagents. Turn this off with `[agents] orchestrate = false` in `system-diff.toml`.
98
+ - **The bus:** an async publish/subscribe channel whose topics are the blocks. Each agent follows the blocks its own
99
+ depend on. Every change an agent makes to a block's structure is published on that block's topic as it happens
100
+ ("API no longer answers DELETE /orders/{id}"), with why it matters. Agents publish their own notes with `publish`
101
+ (to a block, to "all", or to "agent:<name>"). Each agent's unread messages reach it with its next tool result:
102
+ nobody waits on anybody.
103
+ - **Claims:** `claim` gives an agent its blocks. An edit to someone else's block is published to its owner and shown
104
+ under Needs your attention.
105
+
106
+ The MCP tools: `plan_agents`, `claim`, `publish`, `subscribe`, `inbox`, `team`. It all stays in `.git/system-diff/`
107
+ (`agents.json`, `bus.jsonl`), never pushed.
108
+
87
109
  ### In the conversation
88
110
 
89
111
  - **After an edit that changes the system's structure**, one line under it: "System diff: API now answers GET
@@ -17,7 +17,7 @@
17
17
  "label": "Agent activity",
18
18
  "layer": "",
19
19
  "kind": "data",
20
- "order": 23,
20
+ "order": 24,
21
21
  "container": "",
22
22
  "declared": true,
23
23
  "files": 1,
@@ -33,7 +33,19 @@
33
33
  "container": "",
34
34
  "declared": true,
35
35
  "files": 1,
36
- "lines": 436,
36
+ "lines": 456,
37
+ "hub": false,
38
+ "quiet": false
39
+ },
40
+ "agents": {
41
+ "label": "Agent team",
42
+ "layer": "",
43
+ "kind": "logic",
44
+ "order": 14,
45
+ "container": "",
46
+ "declared": true,
47
+ "files": 1,
48
+ "lines": 296,
37
49
  "hub": false,
38
50
  "quiet": false
39
51
  },
@@ -53,7 +65,7 @@
53
65
  "label": "Pane pictures",
54
66
  "layer": "",
55
67
  "kind": "logic",
56
- "order": 15,
68
+ "order": 16,
57
69
  "container": "",
58
70
  "declared": true,
59
71
  "files": 1,
@@ -65,7 +77,7 @@
65
77
  "label": "Panes beside the agent",
66
78
  "layer": "",
67
79
  "kind": "logic",
68
- "order": 20,
80
+ "order": 21,
69
81
  "container": "",
70
82
  "declared": true,
71
83
  "files": 1,
@@ -101,7 +113,7 @@
101
113
  "label": "Design notes",
102
114
  "layer": "",
103
115
  "kind": "logic",
104
- "order": 14,
116
+ "order": 15,
105
117
  "container": "",
106
118
  "declared": true,
107
119
  "files": 1,
@@ -149,7 +161,7 @@
149
161
  "label": "Lessons and topics",
150
162
  "layer": "",
151
163
  "kind": "logic",
152
- "order": 18,
164
+ "order": 19,
153
165
  "container": "",
154
166
  "declared": true,
155
167
  "files": 3,
@@ -165,7 +177,7 @@
165
177
  "container": "",
166
178
  "declared": true,
167
179
  "files": 1,
168
- "lines": 240,
180
+ "lines": 282,
169
181
  "hub": false,
170
182
  "quiet": false
171
183
  },
@@ -173,7 +185,7 @@
173
185
  "label": "LLM summary",
174
186
  "layer": "",
175
187
  "kind": "logic",
176
- "order": 17,
188
+ "order": 18,
177
189
  "container": "",
178
190
  "declared": true,
179
191
  "files": 1,
@@ -189,7 +201,7 @@
189
201
  "container": "",
190
202
  "declared": true,
191
203
  "files": 2,
192
- "lines": 627,
204
+ "lines": 732,
193
205
  "hub": false,
194
206
  "quiet": false
195
207
  },
@@ -209,7 +221,7 @@
209
221
  "label": "PNG rendering",
210
222
  "layer": "",
211
223
  "kind": "logic",
212
- "order": 21,
224
+ "order": 22,
213
225
  "container": "",
214
226
  "declared": true,
215
227
  "files": 1,
@@ -221,7 +233,7 @@
221
233
  "label": "README section",
222
234
  "layer": "",
223
235
  "kind": "logic",
224
- "order": 16,
236
+ "order": 17,
225
237
  "container": "",
226
238
  "declared": true,
227
239
  "files": 1,
@@ -233,7 +245,7 @@
233
245
  "label": "Git and folder sources",
234
246
  "layer": "",
235
247
  "kind": "data",
236
- "order": 22,
248
+ "order": 23,
237
249
  "container": "",
238
250
  "declared": true,
239
251
  "files": 1,
@@ -257,7 +269,7 @@
257
269
  "label": "Terminal pictures",
258
270
  "layer": "",
259
271
  "kind": "logic",
260
- "order": 19,
272
+ "order": 20,
261
273
  "container": "",
262
274
  "declared": true,
263
275
  "files": 1,
@@ -296,6 +308,7 @@
296
308
  "activity>learn": 1,
297
309
  "activity>sources": 1,
298
310
  "agent>activity": 1,
311
+ "agent>agents": 1,
299
312
  "agent>companion": 1,
300
313
  "agent>compare": 1,
301
314
  "agent>config": 1,
@@ -303,6 +316,10 @@
303
316
  "agent>extract": 1,
304
317
  "agent>learn": 1,
305
318
  "agent>sources": 1,
319
+ "agents>activity": 1,
320
+ "agents>architecture": 1,
321
+ "agents>design": 1,
322
+ "agents>sources": 1,
306
323
  "architecture>design": 2,
307
324
  "architecture>diff": 1,
308
325
  "architecture>extract": 1,
@@ -347,6 +364,7 @@
347
364
  "learn>narrate": 1,
348
365
  "learn>sources": 1,
349
366
  "mcp>activity": 1,
367
+ "mcp>agents": 1,
350
368
  "mcp>compare": 1,
351
369
  "mcp>config": 1,
352
370
  "mcp>extract": 2,
@@ -356,6 +374,7 @@
356
374
  "mcp>sources": 1,
357
375
  "mcp>textmap": 1,
358
376
  "panel>activity": 2,
377
+ "panel>agents": 1,
359
378
  "panel>architecture": 2,
360
379
  "panel>canvas": 1,
361
380
  "panel>compare": 2,
@@ -412,6 +431,10 @@
412
431
  "write_state",
413
432
  "READ"
414
433
  ],
434
+ "agent>agents": [
435
+ "ORCHESTRATE",
436
+ "after_edit"
437
+ ],
415
438
  "agent>companion": [
416
439
  "add_vscode_task",
417
440
  "open_beside",
@@ -441,6 +464,27 @@
441
464
  "agent>sources": [
442
465
  "git"
443
466
  ],
467
+ "agents>activity": [
468
+ "EDIT",
469
+ "_replace",
470
+ "PROMPT",
471
+ "READ",
472
+ "is_system",
473
+ "part_of"
474
+ ],
475
+ "agents>architecture": [
476
+ "groups_of"
477
+ ],
478
+ "agents>design": [
479
+ "depends",
480
+ "and_list",
481
+ "fan_in",
482
+ "kinds",
483
+ "summarize"
484
+ ],
485
+ "agents>sources": [
486
+ "git_dir"
487
+ ],
444
488
  "architecture>design": [
445
489
  "kinds"
446
490
  ],
@@ -617,6 +661,14 @@
617
661
  "events",
618
662
  "now"
619
663
  ],
664
+ "mcp>agents": [
665
+ "claim",
666
+ "inbox",
667
+ "messages",
668
+ "plan",
669
+ "publish",
670
+ "state"
671
+ ],
620
672
  "mcp>compare": [
621
673
  "compare",
622
674
  "checkpoint",
@@ -659,12 +711,19 @@
659
711
  ],
660
712
  "panel>activity": [
661
713
  "events",
662
- "now",
663
714
  "label",
715
+ "now",
664
716
  "EDIT",
665
717
  "PROMPT",
666
718
  "STOP"
667
719
  ],
720
+ "panel>agents": [
721
+ "MAIN",
722
+ "state",
723
+ "inbox",
724
+ "messages",
725
+ "who_worked"
726
+ ],
668
727
  "panel>architecture": [
669
728
  "system",
670
729
  "container",
@@ -672,8 +731,8 @@
672
731
  "internals"
673
732
  ],
674
733
  "panel>canvas": [
675
- "Page",
676
734
  "cut",
735
+ "Page",
677
736
  "detail_rows",
678
737
  "Grid",
679
738
  "chips",
@@ -870,6 +929,13 @@
870
929
  "sys": 1,
871
930
  "typing": 1
872
931
  },
932
+ "agents": {
933
+ "json": 1,
934
+ "pathlib": 1,
935
+ "re": 1,
936
+ "time": 1,
937
+ "typing": 1
938
+ },
873
939
  "architecture": {
874
940
  "collections": 2,
875
941
  "typing": 2,
@@ -1,4 +1,4 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="756" height="998" viewBox="0 0 756 998" role="img" aria-label="System map">
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="756" height="1058" viewBox="0 0 756 1058" role="img" aria-label="System map">
2
2
  <style>
3
3
  text { font-family: 'Segoe UI', FreeSans, 'Helvetica Neue', Arial, sans-serif; }
4
4
  .bg { fill: #f8f9fb; stroke: #e1e5eb; }
@@ -47,23 +47,28 @@ text { font-family: 'Segoe UI', FreeSans, 'Helvetica Neue', Arial, sans-serif; }
47
47
  .note .box { fill: #fff3dd; stroke: #e9c98f; } .note text { font-size: 11.5px; fill: #9a5600; }
48
48
  </style>
49
49
  <defs><marker id="ar-call-same" class="ar k-call s-same" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z"/></marker></defs>
50
- <rect class="bg" x="0.5" y="0.5" width="755" height="997" rx="10"/>
50
+ <rect class="bg" x="0.5" y="0.5" width="755" height="1057" rx="10"/>
51
51
  <text class="col" x="14" y="18">ENTRY POINTS</text>
52
52
  <text class="col" x="278" y="18">LOGIC</text>
53
53
  <text class="col" x="542" y="18">DATA ACCESS</text>
54
54
  <path class="be k-call s-same" d="M542,112 C513,112 513,248 484,248" marker-end="url(#ar-call-same)"><title>activity → diff</title></path>
55
55
  <path class="be k-call s-same" d="M542,112 C513,112 513,188 484,188" marker-end="url(#ar-call-same)"><title>activity → extract</title></path>
56
- <path class="be k-call s-same" d="M542,112 C513,112 513,728 484,728" marker-end="url(#ar-call-same)"><title>activity → learn</title></path>
56
+ <path class="be k-call s-same" d="M542,112 C513,112 513,788 484,788" marker-end="url(#ar-call-same)"><title>activity → learn</title></path>
57
57
  <path class="be k-call s-same" d="M742,112 C778,112 778,52 748,52" marker-end="url(#ar-call-same)"><title>activity → sources</title></path>
58
58
  <path class="be k-call s-same" d="M214,172 C246,172 246,159 278,159 L478,159 C507,159 507,112 536,112" marker-end="url(#ar-call-same)"><title>agent → activity</title></path>
59
- <path class="be k-call s-same" d="M214,172 C243,172 243,848 272,848" marker-end="url(#ar-call-same)"><title>agent → companion</title></path>
59
+ <path class="be k-call s-same" d="M214,172 C243,172 243,488 272,488" marker-end="url(#ar-call-same)"><title>agent → agents</title></path>
60
+ <path class="be k-call s-same" d="M214,172 C243,172 243,908 272,908" marker-end="url(#ar-call-same)"><title>agent → companion</title></path>
60
61
  <path class="be k-call s-same" d="M214,172 C243,172 243,52 272,52" marker-end="url(#ar-call-same)"><title>agent → compare</title></path>
61
62
  <path class="be k-call s-same" d="M214,172 C243,172 243,128 272,128" marker-end="url(#ar-call-same)"><title>agent → config</title></path>
62
- <path class="be k-call s-same" d="M214,172 C243,172 243,488 272,488" marker-end="url(#ar-call-same)"><title>agent → design</title></path>
63
+ <path class="be k-call s-same" d="M214,172 C243,172 243,548 272,548" marker-end="url(#ar-call-same)"><title>agent → design</title></path>
63
64
  <path class="be k-call s-same" d="M214,172 C243,172 243,188 272,188" marker-end="url(#ar-call-same)"><title>agent → extract</title></path>
64
- <path class="be k-call s-same" d="M214,172 C243,172 243,728 272,728" marker-end="url(#ar-call-same)"><title>agent → learn</title></path>
65
+ <path class="be k-call s-same" d="M214,172 C243,172 243,788 272,788" marker-end="url(#ar-call-same)"><title>agent → learn</title></path>
65
66
  <path class="be k-call s-same" d="M214,172 C246,172 246,99 278,99 L478,99 C507,99 507,52 536,52" marker-end="url(#ar-call-same)"><title>agent → sources</title></path>
66
- <path class="be k-call s-same" d="M478,428 C514,428 514,488 484,488" marker-end="url(#ar-call-same)"><title>architecture → design</title></path>
67
+ <path class="be k-call s-same" d="M478,488 C507,488 507,112 536,112" marker-end="url(#ar-call-same)"><title>agents → activity</title></path>
68
+ <path class="be k-call s-same" d="M478,488 C514,488 514,428 484,428" marker-end="url(#ar-call-same)"><title>agents → architecture</title></path>
69
+ <path class="be k-call s-same" d="M478,488 C514,488 514,548 484,548" marker-end="url(#ar-call-same)"><title>agents → design</title></path>
70
+ <path class="be k-call s-same" d="M478,488 C507,488 507,52 536,52" marker-end="url(#ar-call-same)"><title>agents → sources</title></path>
71
+ <path class="be k-call s-same" d="M478,428 C524,428 524,548 484,548" marker-end="url(#ar-call-same)"><title>architecture → design</title></path>
67
72
  <path class="be k-call s-same" d="M478,428 C524,428 524,308 484,308" marker-end="url(#ar-call-same)"><title>architecture → graph</title></path>
68
73
  <path class="be k-call s-same" d="M478,428 C534,428 534,248 484,248" marker-end="url(#ar-call-same)"><title>architecture → diff</title></path>
69
74
  <path class="be k-call s-same" d="M478,428 C544,428 544,188 484,188" marker-end="url(#ar-call-same)"><title>architecture → extract</title></path>
@@ -72,37 +77,38 @@ text { font-family: 'Segoe UI', FreeSans, 'Helvetica Neue', Arial, sans-serif; }
72
77
  <path class="be k-call s-same" d="M214,52 C243,52 243,128 272,128" marker-end="url(#ar-call-same)"><title>cli → config</title></path>
73
78
  <path class="be k-call s-same" d="M214,52 C243,52 243,188 272,188" marker-end="url(#ar-call-same)"><title>cli → extract</title></path>
74
79
  <path class="be k-call s-same" d="M214,52 C243,52 243,308 272,308" marker-end="url(#ar-call-same)"><title>cli → graph</title></path>
75
- <path class="be k-call s-same" d="M214,52 C243,52 243,728 272,728" marker-end="url(#ar-call-same)"><title>cli → learn</title></path>
80
+ <path class="be k-call s-same" d="M214,52 C243,52 243,788 272,788" marker-end="url(#ar-call-same)"><title>cli → learn</title></path>
76
81
  <path class="be k-call s-same" d="M214,52 C246,52 246,99 278,99 L478,99 C507,99 507,112 536,112" marker-end="url(#ar-call-same)"><title>cli → activity</title></path>
77
- <path class="be k-call s-same" d="M214,52 C243,52 243,848 272,848" marker-end="url(#ar-call-same)"><title>cli → companion</title></path>
82
+ <path class="be k-call s-same" d="M214,52 C243,52 243,908 272,908" marker-end="url(#ar-call-same)"><title>cli → companion</title></path>
78
83
  <path class="be k-call s-same" d="M214,52 C243,52 243,52 272,52" marker-end="url(#ar-call-same)"><title>cli → compare</title></path>
79
84
  <path class="be k-call s-same" d="M214,52 C243,52 243,248 272,248" marker-end="url(#ar-call-same)"><title>cli → diff</title></path>
80
85
  <path class="be k-call s-same" d="M214,52 C250,52 250,112 220,112" marker-end="url(#ar-call-same)"><title>cli → mcp</title></path>
81
- <path class="be k-call s-same" d="M478,848 C507,848 507,52 536,52" marker-end="url(#ar-call-same)"><title>companion → sources</title></path>
86
+ <path class="be k-call s-same" d="M478,908 C507,908 507,52 536,52" marker-end="url(#ar-call-same)"><title>companion → sources</title></path>
82
87
  <path class="be k-call s-same" d="M478,52 C516.7,52 516.7,128 484,128" marker-end="url(#ar-call-same)"><title>compare → config</title></path>
83
88
  <path class="be k-call s-same" d="M478,52 C536.7,52 536.7,248 484,248" marker-end="url(#ar-call-same)"><title>compare → diff</title></path>
84
89
  <path class="be k-call s-same" d="M478,52 C526.7,52 526.7,188 484,188" marker-end="url(#ar-call-same)"><title>compare → extract</title></path>
85
90
  <path class="be k-call s-same" d="M478,52 C507,52 507,52 536,52" marker-end="url(#ar-call-same)"><title>compare → sources</title></path>
86
- <path class="be k-call s-same" d="M478,488 C534,488 534,308 484,308" marker-end="url(#ar-call-same)"><title>design → graph</title></path>
91
+ <path class="be k-call s-same" d="M478,548 C544,548 544,308 484,308" marker-end="url(#ar-call-same)"><title>design → graph</title></path>
87
92
  <path class="be k-call s-same" d="M478,248 C514,248 514,188 484,188" marker-end="url(#ar-call-same)"><title>diff → extract</title></path>
88
93
  <path class="be k-call s-same" d="M478,248 C507,248 507,52 536,52" marker-end="url(#ar-call-same)"><title>diff → sources</title></path>
89
94
  <path class="be k-call s-same" d="M478,188 C514,188 514,128 484,128" marker-end="url(#ar-call-same)"><title>extract → config</title></path>
90
95
  <path class="be k-call s-same" d="M478,308 C514,308 514,248 484,248" marker-end="url(#ar-call-same)"><title>graph → diff</title></path>
91
- <path class="be k-call s-same" d="M478,728 C507,728 507,112 536,112" marker-end="url(#ar-call-same)"><title>learn → activity</title></path>
92
- <path class="be k-call s-same" d="M478,728 C544,728 544,248 484,248" marker-end="url(#ar-call-same)"><title>learn → diff</title></path>
93
- <path class="be k-call s-same" d="M478,728 C544,728 544,188 484,188" marker-end="url(#ar-call-same)"><title>learn → extract</title></path>
94
- <path class="be k-call s-same" d="M478,728 C544,728 544,308 484,308" marker-end="url(#ar-call-same)"><title>learn → graph</title></path>
95
- <path class="be k-call s-same" d="M478,728 C514,728 514,668 484,668" marker-end="url(#ar-call-same)"><title>learn → narrate</title></path>
96
- <path class="be k-call s-same" d="M478,728 C507,728 507,52 536,52" marker-end="url(#ar-call-same)"><title>learn → sources</title></path>
96
+ <path class="be k-call s-same" d="M478,788 C507,788 507,112 536,112" marker-end="url(#ar-call-same)"><title>learn → activity</title></path>
97
+ <path class="be k-call s-same" d="M478,788 C544,788 544,248 484,248" marker-end="url(#ar-call-same)"><title>learn → diff</title></path>
98
+ <path class="be k-call s-same" d="M478,788 C544,788 544,188 484,188" marker-end="url(#ar-call-same)"><title>learn → extract</title></path>
99
+ <path class="be k-call s-same" d="M478,788 C544,788 544,308 484,308" marker-end="url(#ar-call-same)"><title>learn → graph</title></path>
100
+ <path class="be k-call s-same" d="M478,788 C514,788 514,728 484,728" marker-end="url(#ar-call-same)"><title>learn → narrate</title></path>
101
+ <path class="be k-call s-same" d="M478,788 C507,788 507,52 536,52" marker-end="url(#ar-call-same)"><title>learn → sources</title></path>
97
102
  <path class="be k-call s-same" d="M214,112 C243,112 243,188 272,188" marker-end="url(#ar-call-same)"><title>mcp → extract</title></path>
98
103
  <path class="be k-call s-same" d="M214,112 C246,112 246,99 278,99 L478,99 C507,99 507,112 536,112" marker-end="url(#ar-call-same)"><title>mcp → activity</title></path>
104
+ <path class="be k-call s-same" d="M214,112 C243,112 243,488 272,488" marker-end="url(#ar-call-same)"><title>mcp → agents</title></path>
99
105
  <path class="be k-call s-same" d="M214,112 C243,112 243,52 272,52" marker-end="url(#ar-call-same)"><title>mcp → compare</title></path>
100
106
  <path class="be k-call s-same" d="M214,112 C243,112 243,128 272,128" marker-end="url(#ar-call-same)"><title>mcp → config</title></path>
101
107
  <path class="be k-call s-same" d="M214,112 C243,112 243,308 272,308" marker-end="url(#ar-call-same)"><title>mcp → graph</title></path>
102
- <path class="be k-call s-same" d="M214,112 C243,112 243,728 272,728" marker-end="url(#ar-call-same)"><title>mcp → learn</title></path>
108
+ <path class="be k-call s-same" d="M214,112 C243,112 243,788 272,788" marker-end="url(#ar-call-same)"><title>mcp → learn</title></path>
103
109
  <path class="be k-call s-same" d="M214,112 C246,112 246,99 278,99 L478,99 C507,99 507,52 536,52" marker-end="url(#ar-call-same)"><title>mcp → sources</title></path>
104
- <path class="be k-call s-same" d="M214,112 C243,112 243,788 272,788" marker-end="url(#ar-call-same)"><title>mcp → textmap</title></path>
105
- <path class="be k-call s-same" d="M214,368 C243,368 243,728 272,728" marker-end="url(#ar-call-same)"><title>panel → learn</title></path>
110
+ <path class="be k-call s-same" d="M214,112 C243,112 243,848 272,848" marker-end="url(#ar-call-same)"><title>mcp → textmap</title></path>
111
+ <path class="be k-call s-same" d="M214,368 C243,368 243,788 272,788" marker-end="url(#ar-call-same)"><title>panel → learn</title></path>
106
112
  <path class="be k-call s-same" d="M214,368 C246,368 246,219 278,219 L478,219 C507,219 507,112 536,112" marker-end="url(#ar-call-same)"><title>panel → activity</title></path>
107
113
  <path class="be k-call s-same" d="M214,368 C243,368 243,428 272,428" marker-end="url(#ar-call-same)"><title>panel → architecture</title></path>
108
114
  <path class="be k-call s-same" d="M214,368 C243,368 243,52 272,52" marker-end="url(#ar-call-same)"><title>panel → compare</title></path>
@@ -110,26 +116,26 @@ text { font-family: 'Segoe UI', FreeSans, 'Helvetica Neue', Arial, sans-serif; }
110
116
  <path class="be k-call s-same" d="M214,368 C243,368 243,188 272,188" marker-end="url(#ar-call-same)"><title>panel → extract</title></path>
111
117
  <path class="be k-call s-same" d="M214,368 C243,368 243,308 272,308" marker-end="url(#ar-call-same)"><title>panel → graph</title></path>
112
118
  <path class="be k-call s-same" d="M214,368 C246,368 246,219 278,219 L478,219 C507,219 507,52 536,52" marker-end="url(#ar-call-same)"><title>panel → sources</title></path>
113
- <path class="be k-call s-same" d="M214,368 C243,368 243,548 272,548" marker-end="url(#ar-call-same)"><title>panel → canvas</title></path>
114
- <path class="be k-call s-same" d="M214,368 C243,368 243,488 272,488" marker-end="url(#ar-call-same)"><title>panel → design</title></path>
119
+ <path class="be k-call s-same" d="M214,368 C243,368 243,488 272,488" marker-end="url(#ar-call-same)"><title>panel → agents</title></path>
120
+ <path class="be k-call s-same" d="M214,368 C243,368 243,608 272,608" marker-end="url(#ar-call-same)"><title>panel → canvas</title></path>
115
121
  <path class="be k-call s-same" d="M214,428 C246,428 246,279 278,279 L478,279 C507,279 507,112 536,112" marker-end="url(#ar-call-same)"><title>statusline → activity</title></path>
116
122
  <path class="be k-call s-same" d="M214,428 C243,428 243,128 272,128" marker-end="url(#ar-call-same)"><title>statusline → config</title></path>
117
123
  <path class="be k-call s-same" d="M214,428 C243,428 243,188 272,188" marker-end="url(#ar-call-same)"><title>statusline → extract</title></path>
118
124
  <path class="be k-call s-same" d="M214,428 C246,428 246,219 278,219 L478,219 C507,219 507,52 536,52" marker-end="url(#ar-call-same)"><title>statusline → sources</title></path>
119
- <path class="be k-call s-same" d="M214,428 C243,428 243,788 272,788" marker-end="url(#ar-call-same)"><title>statusline → textmap</title></path>
125
+ <path class="be k-call s-same" d="M214,428 C243,428 243,848 272,848" marker-end="url(#ar-call-same)"><title>statusline → textmap</title></path>
120
126
  <path class="be k-call s-same" d="M214,308 C246,308 246,219 278,219 L478,219 C507,219 507,112 536,112" marker-end="url(#ar-call-same)"><title>tui → activity</title></path>
121
- <path class="be k-call s-same" d="M214,308 C243,308 243,848 272,848" marker-end="url(#ar-call-same)"><title>tui → companion</title></path>
127
+ <path class="be k-call s-same" d="M214,308 C243,308 243,908 272,908" marker-end="url(#ar-call-same)"><title>tui → companion</title></path>
122
128
  <path class="be k-call s-same" d="M214,308 C243,308 243,308 272,308" marker-end="url(#ar-call-same)"><title>tui → graph</title></path>
123
- <path class="be k-call s-same" d="M214,308 C243,308 243,728 272,728" marker-end="url(#ar-call-same)"><title>tui → learn</title></path>
129
+ <path class="be k-call s-same" d="M214,308 C243,308 243,788 272,788" marker-end="url(#ar-call-same)"><title>tui → learn</title></path>
124
130
  <path class="be k-call s-same" d="M214,308 C246,308 246,159 278,159 L478,159 C507,159 507,52 536,52" marker-end="url(#ar-call-same)"><title>tui → sources</title></path>
125
- <path class="be k-call s-same" d="M214,308 C243,308 243,788 272,788" marker-end="url(#ar-call-same)"><title>tui → textmap</title></path>
131
+ <path class="be k-call s-same" d="M214,308 C243,308 243,848 272,848" marker-end="url(#ar-call-same)"><title>tui → textmap</title></path>
126
132
  <path class="be k-call s-same" d="M214,308 C250,308 250,248 220,248" marker-end="url(#ar-call-same)"><title>tui → watch</title></path>
127
133
  <path class="be k-call s-same" d="M214,248 C246,248 246,159 278,159 L478,159 C507,159 507,112 536,112" marker-end="url(#ar-call-same)"><title>watch → activity</title></path>
128
134
  <path class="be k-call s-same" d="M214,248 C243,248 243,52 272,52" marker-end="url(#ar-call-same)"><title>watch → compare</title></path>
129
135
  <path class="be k-call s-same" d="M214,248 C243,248 243,248 272,248" marker-end="url(#ar-call-same)"><title>watch → diff</title></path>
130
136
  <path class="be k-call s-same" d="M214,248 C243,248 243,188 272,188" marker-end="url(#ar-call-same)"><title>watch → extract</title></path>
131
137
  <path class="be k-call s-same" d="M214,248 C243,248 243,308 272,308" marker-end="url(#ar-call-same)"><title>watch → graph</title></path>
132
- <path class="be k-call s-same" d="M214,248 C243,248 243,728 272,728" marker-end="url(#ar-call-same)"><title>watch → learn</title></path>
138
+ <path class="be k-call s-same" d="M214,248 C243,248 243,788 272,788" marker-end="url(#ar-call-same)"><title>watch → learn</title></path>
133
139
  <path class="be k-call s-same" d="M214,248 C246,248 246,159 278,159 L478,159 C507,159 507,52 536,52" marker-end="url(#ar-call-same)"><title>watch → sources</title></path>
134
140
  <g class="bn t-component s-same" transform="translate(14,30)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">Command line</text><text x="12" y="35" class="bn-s">3 files</text><title>Command line</title></g>
135
141
  <g class="bn t-component s-same" transform="translate(14,90)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">MCP server</text><text x="12" y="35" class="bn-s">1 file</text><title>MCP server</title></g>
@@ -145,16 +151,17 @@ text { font-family: 'Segoe UI', FreeSans, 'Helvetica Neue', Arial, sans-serif; }
145
151
  <g class="bn t-component s-same" transform="translate(278,286)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">Map layout</text><text x="12" y="35" class="bn-s">1 file</text><title>Map layout</title></g>
146
152
  <g class="bn t-component s-same" transform="translate(278,346)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">SVG pictures</text><text x="12" y="35" class="bn-s">used across the code</text><title>SVG pictures</title></g>
147
153
  <g class="bn t-component s-same" transform="translate(278,406)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">System diagram</text><text x="12" y="35" class="bn-s">2 files</text><title>System diagram</title></g>
148
- <g class="bn t-component s-same" transform="translate(278,466)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">Design notes</text><text x="12" y="35" class="bn-s">1 file</text><title>Design notes</title></g>
149
- <g class="bn t-component s-same" transform="translate(278,526)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">Pane pictures</text><text x="12" y="35" class="bn-s">1 file</text><title>Pane pictures</title></g>
150
- <g class="bn t-component s-same" transform="translate(278,586)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">README section</text><text x="12" y="35" class="bn-s">1 file</text><title>README section</title></g>
151
- <g class="bn t-component s-same" transform="translate(278,646)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">LLM summary</text><text x="12" y="35" class="bn-s">1 file</text><title>LLM summary</title></g>
152
- <g class="bn t-component s-same" transform="translate(278,706)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">Lessons and topics</text><text x="12" y="35" class="bn-s">3 files</text><title>Lessons and topics</title></g>
153
- <g class="bn t-component s-same" transform="translate(278,766)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">Terminal pictures</text><text x="12" y="35" class="bn-s">1 file</text><title>Terminal pictures</title></g>
154
- <g class="bn t-component s-same" transform="translate(278,826)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">Panes beside the agent</text><text x="12" y="35" class="bn-s">1 file</text><title>Panes beside the agent</title></g>
155
- <g class="bn t-component s-same" transform="translate(278,886)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">PNG rendering</text><text x="12" y="35" class="bn-s">1 file</text><title>PNG rendering</title></g>
154
+ <g class="bn t-component s-same" transform="translate(278,466)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">Agent team</text><text x="12" y="35" class="bn-s">1 file</text><title>Agent team</title></g>
155
+ <g class="bn t-component s-same" transform="translate(278,526)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">Design notes</text><text x="12" y="35" class="bn-s">1 file</text><title>Design notes</title></g>
156
+ <g class="bn t-component s-same" transform="translate(278,586)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">Pane pictures</text><text x="12" y="35" class="bn-s">1 file</text><title>Pane pictures</title></g>
157
+ <g class="bn t-component s-same" transform="translate(278,646)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">README section</text><text x="12" y="35" class="bn-s">1 file</text><title>README section</title></g>
158
+ <g class="bn t-component s-same" transform="translate(278,706)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">LLM summary</text><text x="12" y="35" class="bn-s">1 file</text><title>LLM summary</title></g>
159
+ <g class="bn t-component s-same" transform="translate(278,766)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">Lessons and topics</text><text x="12" y="35" class="bn-s">3 files</text><title>Lessons and topics</title></g>
160
+ <g class="bn t-component s-same" transform="translate(278,826)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">Terminal pictures</text><text x="12" y="35" class="bn-s">1 file</text><title>Terminal pictures</title></g>
161
+ <g class="bn t-component s-same" transform="translate(278,886)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">Panes beside the agent</text><text x="12" y="35" class="bn-s">1 file</text><title>Panes beside the agent</title></g>
162
+ <g class="bn t-component s-same" transform="translate(278,946)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">PNG rendering</text><text x="12" y="35" class="bn-s">1 file</text><title>PNG rendering</title></g>
156
163
  <g class="bn t-component s-same" transform="translate(542,30)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">Git and folder sources</text><text x="12" y="35" class="bn-s">1 file</text><title>Git and folder sources</title></g>
157
164
  <g class="bn t-component s-same" transform="translate(542,90)"><rect class="box" width="200" height="46" rx="8"/><text x="12" y="19" class="bn-t">Agent activity</text><text x="12" y="35" class="bn-s">1 file</text><title>Agent activity</title></g>
158
- <path class="be k-call" d="M16,972 L36,972" style="opacity:1"/>
159
- <text x="42" y="976" class="lg">calls</text>
165
+ <path class="be k-call" d="M16,1032 L36,1032" style="opacity:1"/>
166
+ <text x="42" y="1036" class="lg">calls</text>
160
167
  </svg>
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "system-diff",
3
- "version": "0.3.4",
3
+ "version": "0.4.0",
4
4
  "description": "A pane beside the chat: what Claude is working on in your system, zoomed in, what just happened and why it matters, and a topic to learn (system-diff)",
5
5
  "types": "./types/index.d.ts",
6
6
  "author": {
@@ -137,8 +137,8 @@ const PageView: ClientModule<JsonValue, State> = (raw, surface) => {
137
137
  surface.post({ back: true })
138
138
  } else if (e.key === 'f') {
139
139
  surface.post({ follow: true })
140
- } else if (['n', 'm', 'c', 't'].includes(e.key)) {
141
- surface.post({ view: { n: 'now', m: 'map', c: 'changes', t: 'topics' }[e.key] ?? 'now' })
140
+ } else if (['n', 'm', 'a', 'c', 't'].includes(e.key)) {
141
+ surface.post({ view: { n: 'now', m: 'map', a: 'agents', c: 'changes', t: 'topics' }[e.key] ?? 'now' })
142
142
  }
143
143
  })
144
144
  // The detail of the picked block, in the slot under its picture.
@@ -74,6 +74,7 @@ test('the pane paints the page in its own region, and its rows, on every surface
74
74
  await ui.unmount()
75
75
  }
76
76
  const terminal = await $.ui.mount({ ...PANE, surface: 'terminal' })
77
+ expect(await terminal.find({ type: 'Text', text: /^v\d+\.\d+\.\d+$/ })).toBeDefined() // the version, bottom right
77
78
  await terminal.key({ key: 'down', in: 'page' }) // the page's own region, taking the keys (throws if absent)
78
79
  await terminal.unmount()
79
80
  })
@@ -127,6 +128,8 @@ test('the arrows pick a block, Enter zooms in, b goes back', async ($, on) => {
127
128
  await ui.key({ key: 'return', in: 'page' }) // zoomed in again: Follow Claude shows
128
129
  await ui.key({ key: 'm', in: 'page' })
129
130
  expect(last()).toContain('--view map')
131
+ await ui.press({ key: 'view-agents' })
132
+ expect(last()).toContain('--view agents')
130
133
  await ui.press({ key: 'follow' })
131
134
  expect(last().endsWith('--view now --part ')).toBe(true)
132
135
  await ui.unmount()
@@ -142,7 +145,7 @@ test('space on a technology marks it new to you', async ($, on) => {
142
145
  await ui.unmount()
143
146
  })
144
147
 
145
- test('/system-diff and /system-diff-pane both open it, at the width the person keeps', async ($, on) => {
148
+ test('/system-diff and /system-diff-pane both open it, as wide as a dock goes', async ($, on) => {
146
149
  const registered: string[] = []
147
150
  const opened: Array<{ columns?: number }> = []
148
151
  on('ui.open', (_: unknown, e: { columns?: number }) => {
@@ -164,7 +167,7 @@ test('/system-diff and /system-diff-pane both open it, at the width the person k
164
167
  const got = await $.command.run({ ...RUN, command })
165
168
  expect((got as { text?: string }).text).toBe('System diff pane opened.')
166
169
  }
167
- expect(opened.every(o => o.columns === undefined)).toBe(true) // the width is the person's
170
+ expect(opened.every(o => (o.columns ?? 0) >= 200)).toBe(true) // as wide as a dock goes
168
171
  })
169
172
 
170
173
  test('/system-diff close closes the pane, and so does its close button', async ($, on) => {
@@ -14,8 +14,11 @@ import type { Act, Page, Row } from '../types'
14
14
  // green what is new, done or to learn, white what to read, gray the background, red only what was taken away.
15
15
 
16
16
  const PANE = 'system-diff'
17
+ const VERSION = '0.4.0' // the plugin's own, as .claude-plugin/plugin.json says (a test keeps them one)
18
+ const WIDEST = 999 // as wide as Claude Code docks a pane: 45% of the terminal
17
19
  const COMMANDS = ['system-diff', 'system-diff-pane'] as const
18
- const VIEWS = [['now', 'Now', 'n'], ['map', 'Map', 'm'], ['changes', 'Changes', 'c'], ['topics', 'Topics', 't']] as const
20
+ const VIEWS = [['now', 'Now', 'n'], ['map', 'Map', 'm'], ['agents', 'Agents', 'a'], ['changes', 'Changes', 'c'],
21
+ ['topics', 'Topics', 't']] as const
19
22
 
20
23
  const page = atom({ plugin: 'system-diff', key: 'page' } as const, null as Page | null, { shape: 'page-2' })
21
24
  const view = atom({ plugin: 'system-diff', key: 'view' } as const, 'now', { shape: 'view-1' })
@@ -153,7 +156,7 @@ async function scrollBy($: EngineInterface, rows: number): Promise<void> {
153
156
  // As wide as Claude Code docks a pane, the first time: a width the person set (dragged, or with the pane's keys:
154
157
  // ctrl+x ← →) is theirs from then on.
155
158
  function open($: EngineInterface) {
156
- return $.ui.open({ id: PANE, title: 'System diff' })
159
+ return $.ui.open({ id: PANE, title: 'System diff', columns: WIDEST })
157
160
  }
158
161
 
159
162
  export const register: Register = on => {
@@ -291,6 +294,7 @@ export const register: Register = on => {
291
294
  ))}
292
295
  </Box>
293
296
  )}
297
+ <Box flexDirection="row" justifyContent="flex-end"><Text dimColor>{`v${VERSION}`}</Text></Box>
294
298
  </Box>
295
299
  )
296
300
  })
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "system-diff"
7
- version = "0.3.4"
7
+ version = "0.4.0"
8
8
  description = "Draws your system from its code (parts, entry points, data, outside systems) and what each change adds, changes or removes. No dependencies; SVG pictures for PRs and READMEs."
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -5,4 +5,4 @@
5
5
  bp = extract.extract(DirSource(Path(".")), cfg)
6
6
  svg = graph.system_svg(bp, cfg)
7
7
  """
8
- __version__ = "0.3.4"
8
+ __version__ = "0.4.0"