dsh-brief-sidebar 0.4.0 → 0.5.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.de.md ADDED
@@ -0,0 +1,198 @@
1
+ # dsh-brief-sidebar
2
+
3
+ [简体中文](README.md) | [Français](README.fr.md) | [Deutsch](README.de.md) | [Italiano](README.it.md) | [Русский](README.ru.md) | [Español](README.es.md)
4
+
5
+ DSH-Web-Plugin (Verbraucher von `dsh-better-sidebar`), Repo-/Paketname **`dsh-brief-sidebar`** (Sitzungs-Briefing-Seitenleiste).
6
+ Es rendet das **Briefing („brief“)** der Sitzung als Tab „Übersicht“ in der rechten Seitenleiste; das Briefing besteht aus zwei Listen:
7
+
8
+ - **todo-Liste** — das **Fortschritts**-Board der `todos`-Projektion, das die drei Zustände und die Fortschrittszusammenfassung der Aufgaben der aktuellen Sitzung zeigt;
9
+ - **Deliverables-Liste** — der **Deliverables**-Abschnitt der `dshSummaryDeliverables`-Projektion, der im Turn in Echtzeit die erfolgreich geschriebenen/geänderten Dateien zeigt;
10
+ codeplan-Planungsdeliverables werden inline mit einer „Planung“-Pill markiert.
11
+
12
+ Gleichzeitig **überdeckt** es das offizielle DSH-todo-Panel über dem composer, sodass das Board der einzige sichtbare Träger der Todos wird.
13
+
14
+ Rein lesende Anzeige: kein Editieren, kein Zurückschreiben, keine Multi-Session-Aggregation, keine Kopie einer Drittanbieter-Renderingschicht.
15
+
16
+ **Kompatibilitätsbereich**: Diese Linie (Zweig `main`, befördert aus `compat/0.2.0`) zielt auf die **DSH-0.2.0-Linie** — `engines.dsh` ist `>=0.2.0-rc.1 <0.2.1-0`, getestete Basis ist DSH 0.2.0-rc.1, Veröffentlichung über den npm dist-tag **`dsh-0.2.0`**. 0.2.0 ist für alle Host-APIs, die dieses Plugin nutzt, rein additiv (die konsumierte Fläche besteht nur aus reinen `ctx.get(...)`-Aufrufern, null Entfernungen) — die Unterstützungslinie wird daher insgesamt nach vorn verschoben, ein Laufzeit-Kompatibilitätszweig ist nicht nötig. **Plugin-Version immer nach DSH-Version wählen** (nicht blind `latest` auf älteren Hosts — die `engines` des alten Hosts werden dann nicht erfüllt und das Plugin wird von der Start-Vorprüfung still deaktiviert; Caret-Bereiche gelten auch nicht über Host-Minor-Versionen hinweg):
17
+
18
+ | DSH-Host | Neueste Plugin-Version | Installations-dist-tag |
19
+ |---|---|---|
20
+ | 0.2.0 | **0.4.0** (latest) | `dsh-0.2.0` |
21
+ | 0.1.7 | 0.3.1 | `dsh-0.1.7` |
22
+ | 0.1.5 | 0.3.1 | `dsh-0.1.5` |
23
+ | 0.1.2 und älter | nicht unterstützt (die 0.1.x-Linie hat die Untergrenze 0.1.5-rc.1, npm hat keinen entsprechenden dist-tag) | — |
24
+
25
+ (Stand: 2026-09-30; die 0.1.x-Linie wird weiter von den eingefrorenen Zweigen `compat/0.1.7` / `compat/0.1.5` (≤0.3.1) versorgt.)
26
+
27
+ ![brief-sidebar](assets/brief.png)
28
+
29
+ **Namensgrenze**: Die Identität dieses Plugins (Paketname / Plugin-ID / cordis-Bundle-ID / Locale-Namespace / DOM-Hook
30
+ `data-dsh-brief-sidebar`) verwendet durchweg `brief`; die `todos`-Projektion, das `todo_write`-Tool, die offizielle dock cell `{ id: 'todo' }` und `dsh-tool-todo` gehören dagegen zur DSH-Upstream-Domäne — der Originalbegriff `todo` bleibt erhalten, das Plugin benennt nichts um.
31
+
32
+ **Gedächtnissystem**: Der dritte Abschnitt des Briefings (Memory-Recall) ist derzeit nur ein **reservierter Layout-Slot**, befindet sich **in Planung** und wird in dieser Version nicht gerendert — siehe R11 / K4.
33
+
34
+ ## Anforderungsmapping
35
+
36
+ | Nr. | Anforderung | Implementierungsort |
37
+ |---|---|---|
38
+ | R1 | Während des Plugin-Mountens wird die offizielle todo-Leiste überhaupt nicht gerendert | `src/client/brief/dock-shadow.tsx` |
39
+ | R2 | Eigenständiges Plugin, das den Tab „Übersicht“ bei better-sidebar registriert | `src/client/index.tsx` |
40
+ | R3 | Daten stammen ausschließlich aus der vom Host berechneten `todos`-Projektion; keine clientseitige Zusammenführung, kein Zurückschreiben | `src/client/brief/use-todos.ts` + `board.ts` |
41
+ | R4 | Gewöhnliches React + `--dsw-alias-*`-Tokens; null Code-/Namensbeziehung zum Canvas-Plugin | `src/client/TodoBoardTab.tsx` (TodoSection) + `BriefIcon.tsx` |
42
+ | R5 | Reversibel: Nach Deaktivierung/Deinstallation des Plugins stellt sich der offizielle dock automatisch wieder her | Alle Registrierungen laufen über `ctx.effect`, die Disposer werden mit der fiber eingesammelt |
43
+ | R6 | Nicht destruktiv: keine Änderung am DSH-Checkout / better-sidebar / Canvas-Plugin | Dieses Paket trägt sich selbst, keine der genannten Repos wird berührt |
44
+ | R7 | Der Tab wird zu „Übersicht“ hochgestuft, `TAB_ID` unverändert (Ersatz an Ort und Stelle, bereits geöffnete Tabs bleiben verbunden) | `src/client/SummaryTab.tsx` + `index.tsx` |
45
+ | R8 | Abschnitt 1 „Fortschritt“: der Drei-Zustände-Vertrag von todos wird auf Abschnittsebene abgesenkt | `src/client/TodoBoardTab.tsx` |
46
+ | R9 | Abschnitt 2 „Deliverables“: Echtzeitliste des letzten Turns + Sitzungskumulation; die Host-Hälfte registriert die Projektion | `src/projection/*` + `src/client/summary/*` |
47
+ | R10 | codeplan-Deliverables sind eine annotierte Teilmenge des Deliverables-Abschnitts (Inline-„Planung“-Pill), kein eigenständiger Abschnitt | `src/client/summary/deliverables.ts` + `DeliverablesSection.tsx` |
48
+ | R11 | Memory-Recall: nur reservierter Layout-Slot (ganz unten in der Abschnittsfolge), **in Planung**, wird in dieser Version nicht gerendert | Slot-Kommentar in `src/client/SummaryTab.tsx` / K4 |
49
+ | R12 | Verhaltensbewahrung: Überdeckung, badge, `visible`-Pause, Höhenvertrag, 0.1.5-Adaption | An verschiedenen Stellen, siehe unten |
50
+ | R13 | Die Host-Hälfte macht keine synchrone I/O; die Projektion ist ein optionaler Beitrag (Warten via `ctx.inject`) | `src/index.ts` + `src/projection/register.ts` |
51
+
52
+ ## Installation
53
+
54
+ ```powershell
55
+ # dist-tag je nach DSH-Host-Version wählen (empfohlen, kein blindes latest)
56
+ dsh plugin --profile web add dsh-brief-sidebar@dsh-0.2.0 # DSH-0.2.0-Linie (0.4.0)
57
+ dsh plugin --profile web add dsh-brief-sidebar@dsh-0.1.7 # DSH-0.1.7-Linie (0.3.1)
58
+ dsh plugin --profile web add dsh-brief-sidebar@dsh-0.1.5 # DSH-0.1.5-Linie (0.3.1)
59
+ # Alternative 1: lokales Tarball (diese Linie: dsh-brief-sidebar-0.4.0.tgz)
60
+ dsh plugin --profile web add <dsh-brief-sidebar-0.4.0.tgz>
61
+ # Alternative 2: direkte Installation aus GitHub (Build in Eigenregie)
62
+ dsh plugin --profile web add github:drscrewdriver/dsh-brief-sidebar#main
63
+ ```
64
+
65
+ `--profile` muss unmittelbar auf `plugin` folgen. Nach der Installation `http://127.0.0.1:3080` neu laden.
66
+
67
+ ## Designpunkte
68
+
69
+ ### Datenkette: die Projektions-Face direkt auflösen statt des `useProjection` des Frameworks
70
+
71
+ Der Tab-Körper von better-sidebar **befindet sich nicht im DSH-Slot-Baum** und bekommt die standardmäßigen Props im Session-Scope nicht; daher:
72
+
73
+ ```ts
74
+ ctx.get('sessions') // sicherer Zugriff (kein direktes Proxy-Lesen)
75
+ ?.binding(scope.sessionId)?.session.projections // SessionBinding.session = SessionFace
76
+ ?.faceOf(key) // ProjectionsFace
77
+ => useSyncExternalStore(...) // kein lokaler Spiegel, keine Zusammenführung
78
+ ```
79
+
80
+ Diese Kette wird von beiden Projektionen geteilt (`src/client/use-projection.ts` ist die key-unabhängige generische Auflösung):
81
+
82
+ - `todos` — von `dsh-tool-todo` registriert, der Host ist der einzige Berechnungspunkt, `TodoItem[] | null`.
83
+ - `dshSummaryDeliverables` — von der Host-Hälfte dieses Plugins registriert (siehe nächster Abschnitt), `DeliverablesView`.
84
+
85
+ **Die drei Zustände des Fortschritts-Abschnitts müssen unterscheidbar bleiben** (Vertrag von `readTodos`, durch Tests verriegelt):
86
+
87
+ | Wert | Bedeutung | Rendering |
88
+ |---|---|---|
89
+ | `undefined` | Fähigkeit fehlt (keine Sitzung / Host-Unit nicht montiert / noch keine baseline) | „Aufgaben derzeit nicht verfügbar“ |
90
+ | `null` → `[]` | Projektion vorhanden und leer | leerer Zustand |
91
+ | Array | echte Einträge | Liste + Fortschrittszusammenfassung |
92
+
93
+ Die ersten beiden zu vermischen, behauptet gegenüber dem Leser „diese Sitzung hat keine Aufgaben“, obwohl die Realität „Daten nicht abrufbar“ lautet.
94
+
95
+ Der Deliverables-Abschnitt ist anders: Er ist eine **optionale Erweiterungsfähigkeit**; fehlt die Projektion (die Host-Hälfte hat diese unit nicht registriert), wird der ganze Abschnitt ausgeblendet, ohne „nicht verfügbar“-Rauschen zu rendern; ist die Projektion da, sind `latest: null` und `sessionTotal: 0` sein leerer Zustand (die unit publiziert ab Registrierung).
96
+
97
+ ### Deliverables-Datenkette: die Host-Hälfte registriert eine Projektions-unit
98
+
99
+ Die Daten der offiziellen „Ergebnis dieses Turns“-Zeile (`ui-deliverables`) akkumulieren im Turn bereits eintragsweise mit jedem erfolgreichen `tool/result`; nur hängt die offizielle UI an `conversation.chat.turnTail` und rendert erst am Turn-Ende, während der Sidebar-Tab an die Turn-Daten der Conversation-Engine nicht herankommt (`SessionFace` legt das Ereignisfenster nicht offen, `IConversation` legt die Turn-Daten nicht offen). Deshalb trägt die Host-Hälfte dieses Plugins ihre eigene unit über `ctx.sessionProjections.register()` bei:
100
+
101
+ - Das **fold-Kriterium** ist deckungsgleich mit dem offiziellen `turn-deliverables.ts`: nur Pfade erfolgreicher `write` / `edit` /
102
+ `str_replace_editor` (Varianten create/str_replace/insert) zählen, dedupliziert, Fehlschläge zählen nicht, Leseoperationen zählen nicht;
103
+ im Turn erst schreiben dann ändern zählt als ein Eintrag (`src/projection/deliverables-fold.ts`, reine Funktion, durch Tests verriegelt).
104
+ - **Echtzeit im Turn**: jedes Commit-Ereignis der registry treibt das `apply` aller units; jede erfolgreich festgemachte Dateiänderung schiebt sofort eine Frame.
105
+ - **Optionaler Beitrag**: `ctx.inject(['sessionProjections'], …)` wartet auf den Service; ein Deployment ohne registry lädt dieses Plugin ganz normal
106
+ (der Deliverables-Abschnitt blendet sich still aus); die Registrierung ist ein effect — bei Deinstallation verschwindet der key, und der Client liest „Fähigkeit fehlt“.
107
+ - **Kapazität**: Pfade des letzten Turns cap 50, Sitzungskumulation cap 100 (die neuesten bleiben erhalten); `sessionTotal` hat kein Limit,
108
+ die Kumulationszeile „N Dateien insgesamt in dieser Sitzung“ bleibt stets wahrheitsgemäß.
109
+ - **key mit Namespace** (`dshSummaryDeliverables`): die registry verweigert das Teilen desselben key mit anderem `stateVersion`,
110
+ um eine harte Kollision mit einer möglichen künftigen offiziellen Host-Projektion zu vermeiden.
111
+
112
+ ### codeplan-Deliverables: annotierte Teilmenge des Deliverables-Abschnitts
113
+
114
+ Das **Kriterium der „Planung“-Pill ist eine reine Pfadregel**: trifft der Dateipfad des Ergebnisses nach Normalisierung der Trennzeichen auf das Segment `.agents/plans/` (Vor- und Rückwärtsstrich gleichermaßen), wird die „Planung“-Pill gesetzt und das erste Segment nach `.agents/plans/` (Aufgabenname) in `title` abgelegt.
115
+ Das Plugin liest keine Dateiinhalte und prüft nicht, ob der Schreiber das codeplan-Skill ist — jede Datei, die in dieses Verzeichnis geschrieben wird, wird markiert;
116
+ der Vorteil dieses Kriteriums ist die null zusätzliche Datenkette, der Preis ist, dass die Pfadkonvention selbst die einzige Wahrheitsquelle ist (siehe Lücke K5).
117
+
118
+ Das codeplan-Skill schreibt `spec.md` / `findings.md` / `checklist.md` / `tasks.md` per write unter
119
+ `$workspace\.agents\plans\<任务名>\` — diese Dateien erscheinen von selbst im Deliverables-fold, ohne zusätzliche Sammlung.
120
+ Planungs-Deliverables haben keinen eigenen Abschnitt: sie sind von Natur aus Teil der Deliverables.
121
+
122
+ ### Klick-Öffnen: derselbe Sidebar-Vorschaukanal wie der Konversationsfluss
123
+
124
+ Im Deliverables-Abschnitt ist jede Pfadzeile ein Button; ein Klick geht über `ctx.sidebarRight.openResource(<address>)` — exakt derselbe Kanal wie die „Ergebnis dieses Turns“-chips im Chat und Inline-`code`-Erwähnungen (das Vorgehen von ui-chat `openFile`). Die Adresse konstruiert das inline portierte `fileAddressFor` (Quelle `@deepseek-ai/dsh-util-workspace-path`): relativer Pfad oder absoluter Pfad innerhalb des Sitzungsarbeitsbereichs, adressiert nach `dsh-resource://file/session/<id>/<相对路径>` (der Arbeitsbereichs-Präfix wird abgestreift); absolute Pfade außerhalb des Arbeitsbereichs behalten ihre absolute Schreibweise in derselben Sitzungsadresse. Das Sitzungs-cwd wird aus dem `sessions.list`-Snapshot gelesen, bei jedem Klick frisch.
125
+ Fehlt der `sidebarRight`-Service, degradieren die Zeilen zu reinem Text (dieselbe Degradierungsdisziplin wie bei fehlender Deliverables-Projektion).
126
+
127
+ ### Überdecken des offiziellen docks: cell-Wettbewerb im list-Slot
128
+
129
+ `conversation.input.dock` ist ein **list-Slot**, cells werden über die `id` des Eintrags identifiziert. Das Verhalten von SlotCore:
130
+
131
+ 1. Der Duplikatschlüssel von `register()` ist `(id, priority)` — dieselbe `id` mit anderer `priority` ist eine legale Registrierung;
132
+ 2. Einträge werden nach aufsteigender `priority` (dann nach `order`) sortiert, der Fehlertext trägt selbst die Semantik "lowest renders";
133
+ 3. `entriesOfSlot()` nimmt beim list-Slot die cells nach `options.id` und **behält pro cell nur den nach der Sortierung ersten Eintrag**.
134
+
135
+ Der offizielle Eintrag registriert `{ id: 'todo', order: 0 }` (priority-Default = 0); dieses Plugin gewinnt mit **`{ id: 'todo', priority: -1 }**.
136
+ Die Registrierung läuft über `ctx.slots.inject('conversation.input.dock', …)` (wartet auf die Slot-Deklaration und installiert sich bei deren Neuaufbau neu),
137
+ nicht über nacktes `register` (das mit der children-Deklarationstabelle des Parent-Eintrags in eine Race geriete). Dasselbe Vorgehen ist bei `dsh-input-traffic` gegenüber der Nachbar-cell `queue` bereits ein laufendes Präzedenzbeispiel.
138
+
139
+ **Nur überdecken, wenn `betterSidebar` verfügbar ist**, sonst wäre das Panel versteckt und die Aufgaben nirgends sichtbar.
140
+
141
+ ### Trägerfläche: die native rechte Seitenleiste von DSH
142
+
143
+ Ab 0.1.5 gehört die rechte Seitenleiste DSH-nativ; das `openTab` von better-sidebar registriert mit dem Default `target: 'right'` den Inhalt als nativen Tab-Typ,
144
+ das `+`-Menü ist die native guide-Seite (`description` wird nur gerendert, wenn die guide-Seite ≤4 Einträge hat). Der Tab-Körper bekommt weiterhin
145
+ `TabComponentProps = { ctx, store, scope, tab, visible, … }`; dieses Plugin nutzt daraus nur `ctx` / `scope` / `visible`.
146
+
147
+ Bei `visible === false` wird die ganze Karte (inklusive Hülle) nicht gerendert, damit der versteckte Tab nicht bei jeder Projektions-Frame neu rendert.
148
+
149
+ ## Kopplungsrisiken und Selbstprüfung
150
+
151
+ | Risiko | Folge | Selbstprüfmethode |
152
+ |---|---|---|
153
+ | Der Upstream benennt die `todo`-cell-id um | Überdeckung versagt still, das offizielle Panel taucht wieder auf (**fail-open**: Daten gehen nicht verloren, sie werden nur doppelt angezeigt) | In der Konsole `ctx.slots.entriesOfSlot('conversation.input.dock').filter(e => e.options.id === 'todo')` ausführen; übrig bleiben darf nur der Eintrag dieses Plugins (`registrant: 'dsh-brief-sidebar'`, `priority: -1`) |
154
+ | better-sidebar-Panel/Seitenleiste geschlossen | Aufgaben unsichtbar | Das Tab-badge zeigt die Anzahl unerledigter Aufgaben als Hinweis |
155
+ | Der Upstream ändert key oder Felder der `todos`-Projektion | Das Board zeigt „nicht verfügbar“ oder verwirft ungültige Einträge | `SessionProjectionMap.todos` in den `types.d.ts` von `dsh-tool-todo` bleibt die einzige Wahrheitsquelle |
156
+ | better-sidebar-API-Drift | Registrierungsfläche fällt aus | Nur die Grundfelder von `registerTab` verwenden (`id/title/description/icon/order/single/badge/component`); `peerDependencies` auf `>=0.18.1` gelockert, `devDependencies` auf die aktuell laufende Version gepinnt |
157
+ | Drift im offiziellen fold-Kriterium (neue Mutations-Tools kommen in die Liste usw.) | Die Deliverables-Liste dieses Plugins entfernt sich zunehmend vom offiziellen „Ergebnis dieses Turns“ | Als Ausrichtungsbasis des Kriteriums gilt der `mutationPath` von `ui-deliverables/turn-deliverables.ts`; bei jedem Upgrade einmal diffen |
158
+ | Der Upstream ändert die Form der `tool/call` / `tool/result`-Ereignisse | Der Deliverables-fold verliert Daten (`readTodos`-Art Verteidigung verengt sich, kein Absturz) | Die Einträge `'tool/call'` / `'tool/result'` im `SessionEventMap` von `dsh-session` sind die Wahrheitsquelle |
159
+
160
+ ## Bekannte Lücken
161
+
162
+ - **K1** Deaktiviert der Nutzer diesen Tab-Typ in der Side-Karte, bleibt der dock versteckt → Aufgaben nirgends sichtbar.
163
+ Später möglich: gate on `prefs.tabsEnabled`; diesmal nicht getan (der Nutzer hat „vollständig verstecken“ gewählt).
164
+ - **K2** better-sidebar-Panel/Seitenleiste geschlossen → Aufgaben unsichtbar (als akzeptiert bestätigt).
165
+ - **K3** Der Upstream benennt die `todo`-cell um → Überdeckung versagt still (fail-open, siehe Tabelle oben).
166
+ - **K4** Der Memory-Recall-Abschnitt hat nur einen Layout-Slot (**in Planung**): Das System hat kein Default-Gedächtnis; die Datenkette wird angedockt, sobald ein Gedächtnis-Plugin einen Projektions-key registriert.
167
+ - **K5** Die „Planung“-Pill ist eine reine Pfadpräfix-Entscheidung (Segment `.agents/plans/`) und prüft den Schreiber nicht: auch Dateien, die andere Quellen als codeplan in dieses Verzeichnis schreiben, werden markiert; wechselt codeplan seine Deliverables-Verzeichniskonvention, muss die Konstante in `summary/deliverables.ts` nachgezogen werden.
168
+ - **K6** Das Klick-Öffnen der Pfadzeilen hängt vom Host-Service `sidebarRight` ab (optionale Nutzung); auf Deployments ohne diesen Service sind die Deliverables-Zeilen nicht klickbar und werden nur als reiner Text angezeigt.
169
+
170
+ ## Entwicklung
171
+
172
+ ```powershell
173
+ pnpm install # Abhängigkeiten: react / @deepseek-ai/cordis / zod als devDep, zur Laufzeit von der Host-Modultabelle geliefert oder mit dem Paket gebündelt
174
+ pnpm typecheck # tsc -p tsconfig.json && tsc -p tsconfig.client.json
175
+ pnpm test # vitest (jsdom)
176
+ pnpm build # tsc erzeugt lib/types + tsdown erzeugt lib/index.mjs / lib/client.js (zod ins host-Paket gebündelt, in sich geschlossen)
177
+ npm pack # erzeugt das Tarball (dieses Verzeichnis hat ein pnpm-workspace.yaml ohne packages-Feld, pnpm pack ist unbrauchbar)
178
+ ```
179
+
180
+ `lib/` **muss eingecheckt sein**: Installiert das profile über eine GitHub-ref, gibt es keinen Build-Schritt.
181
+
182
+ ## Kompatibilität
183
+
184
+ Die einzeln nachgetesteten Aufzeichnungen der 0.1.x-Linie stehen in den READMEs der Zweige `compat/0.1.7` / `compat/0.1.5` (≤0.3.1); diese Linie (`main`) zielt auf die **DSH-0.2.0-Linie**, getestete Basis ist **DSH 0.2.0-rc.1 + dsh-better-sidebar 0.19.1**.
185
+ 0.2.0-rc.1 ist zur Plugin-API von 0.1.7 voll kompatibel (manifest/settings/HMR/slot/Sitzung V4 unangetastet); die gesamte konsumierte Fläche dieses Plugins besteht aus reinen `ctx.get(...)`-Aufrufern (`slots` / `locale` / `betterSidebar` / `sidebarRight` / `sessions`, mit eigenen lokalen Interface-Definitionen), ohne Override der Host-Verträge — diese Linie ist daher eine reine Metadaten-Adaption mit null Codeänderungen.
186
+ `engines.dsh` ist `>=0.2.0-rc.1 <0.2.1-0`, und die drei Stellen — `engines.dsh` in `package.json`, der DSH-Client-Paketbereich in `peerDependencies` und `engines.dsh` in `dsh.plugin.json` — **müssen übereinstimmen** (derzeit stimmig).
187
+ Die neueste Plugin-Version je Host-Linie samt Installations-dist-tag steht in der Tabelle unter „Kompatibilitätsbereich" am Dateianfang (0.2.0 → 0.4.0 / 0.1.7 → 0.3.1 / 0.1.5 → 0.3.1; 0.1.2 und älter werden nicht unterstützt).
188
+ **Host-Linien ab 0.2.1 sind von dieser Linie nicht abgedeckt**: rc-Fenster-Pinning-Disziplin; ab 0.2.1 muss die Adaption neu bewertet werden (dann wird eine neue Versionslinie eröffnet).
189
+
190
+ ## Sprachhinweise / Sprachen / Langues / Языки / Idiomas / Lingue
191
+
192
+ Das ursprüngliche README ist auf Chinesisch verfasst; dieses Dokument ist seine deutsche Übersetzung. Installations- und Kompatibilitätsüberblick (diese Linie erfordert DSH 0.2.0: `>=0.2.0-rc.1 <0.2.1-0`; dist-tag je nach Host-Linie: 0.2.0 → `dsh-0.2.0` (0.4.0) / 0.1.7 → `dsh-0.1.7` (0.3.1) / 0.1.5 → `dsh-0.1.5` (0.3.1); DSH 0.1.2 und früher werden nicht unterstützt, kein blindes `latest` auf alten Hosts):
193
+
194
+ - **Deutsch** — benötigt DSH 0.2.0 (`>=0.2.0-rc.1 <0.2.1-0`), getestet gegen DSH 0.2.0-rc.1. dist-tag je nach Host-Linie: `dsh plugin --profile web add dsh-brief-sidebar@dsh-0.2.0` (0.2.0 → 0.4.0), `…@dsh-0.1.7` (0.1.7 → 0.3.1), `…@dsh-0.1.5` (0.1.5 → 0.3.1); DSH 0.1.2 und früher werden nicht unterstützt. Kein blindes `latest` auf alten Hosts (die Start-Vorprüfung deaktiviert das Plugin still). Tabelle: Abschnitt „Kompatibilitätsbereich".
195
+ - **Français** — nécessite DSH 0.2.0 (`>=0.2.0-rc.1 <0.2.1-0`), testé avec DSH 0.2.0-rc.1. dist-tag selon la ligne d'hôte : `dsh plugin --profile web add dsh-brief-sidebar@dsh-0.2.0` (0.2.0 → 0.4.0), `…@dsh-0.1.7` (0.1.7 → 0.3.1), `…@dsh-0.1.5` (0.1.5 → 0.3.1) ; DSH 0.1.2 et antérieurs ne sont pas pris en charge. Pas de `latest` aveugle sur un hôte ancien (la prévérification de démarrage le désactive en silence). Tableau : section « Périmètre de compatibilité ».
196
+ - **Русский** — требуется DSH 0.2.0 (`>=0.2.0-rc.1 <0.2.1-0`), протестировано на DSH 0.2.0-rc.1. dist-tag по линии хоста: `dsh plugin --profile web add dsh-brief-sidebar@dsh-0.2.0` (0.2.0 → 0.4.0), `…@dsh-0.1.7` (0.1.7 → 0.3.1), `…@dsh-0.1.5` (0.1.5 → 0.3.1); DSH 0.1.2 и ранее не поддерживаются. Не используйте `latest` вслепую на старых хостах (плагин молча отключается стартовой предпроверкой). Таблица: раздел «Диапазон совместимости».
197
+ - **Español** — requiere DSH 0.2.0 (`>=0.2.0-rc.1 <0.2.1-0`), probado con DSH 0.2.0-rc.1. dist-tag según la línea del host: `dsh plugin --profile web add dsh-brief-sidebar@dsh-0.2.0` (0.2.0 → 0.4.0), `…@dsh-0.1.7` (0.1.7 → 0.3.1), `…@dsh-0.1.5` (0.1.5 → 0.3.1); DSH 0.1.2 y anteriores no están soportados. No use `latest` a ciegas en hosts antiguos (la preverificación de arranque lo desactiva en silencio). Tabla: sección «Alcance de compatibilidad».
198
+ - **Italiano** — richiede DSH 0.2.0 (`>=0.2.0-rc.1 <0.2.1-0`), testato su DSH 0.2.0-rc.1. dist-tag in base alla linea dell'host: `dsh plugin --profile web add dsh-brief-sidebar@dsh-0.2.0` (0.2.0 → 0.4.0), `…@dsh-0.1.7` (0.1.7 → 0.3.1), `…@dsh-0.1.5` (0.1.5 → 0.3.1); DSH 0.1.2 e precedenti non sono supportati. Niente `latest` alla cieca su host vecchi (la preverifica di avvio lo disattiva in silenzio). Tabella: sezione «Perimetro di compatibilità».
package/README.es.md ADDED
@@ -0,0 +1,198 @@
1
+ # dsh-brief-sidebar
2
+
3
+ [简体中文](README.md) | [Français](README.fr.md) | [Deutsch](README.de.md) | [Italiano](README.it.md) | [Русский](README.ru.md) | [Español](README.es.md)
4
+
5
+ Plugin web para DSH (consumidor de `dsh-better-sidebar`), nombre del repo/paquete **`dsh-brief-sidebar`** (barra lateral de briefs de sesión).
6
+ Renderiza el **brief** de la sesión como una pestaña «Resumen» en la barra lateral derecha; el brief se compone de dos listas:
7
+
8
+ - **lista todo** — el tablero de **progreso** de la proyección `todos`, que muestra los tres estados y el resumen de avance de las tareas de la sesión actual;
9
+ - **lista de entregables** — la sección de **entregables** de la proyección `dshSummaryDeliverables`, que muestra en tiempo real, a lo largo del turno, los archivos escritos/modificados con éxito;
10
+ los entregables de planificación de codeplan se anotan en línea con una pill «Planificación».
11
+
12
+ Al mismo tiempo **oculta** el panel todo oficial de DSH situado sobre el composer, haciendo del tablero el único soporte visible de los todos.
13
+
14
+ Visualización de solo lectura: sin edición, sin escritura de vuelta, sin agregación multi-sesión, sin copiar ninguna capa de renderizado de terceros.
15
+
16
+ **Alcance de compatibilidad**: esta línea (rama `main`, ascendida desde `compat/0.2.0`) apunta a la **línea DSH 0.2.0** — `engines.dsh` es `>=0.2.0-rc.1 <0.2.1-0`, línea base probada DSH 0.2.0-rc.1, publicaciones por el dist-tag de npm **`dsh-0.2.0`**. 0.2.0 es puramente aditivo para todas las API del host que usa este plugin (la superficie consumida son solo callers puros de `ctx.get(...)`, cero eliminaciones de exportaciones), por lo que la línea de soporte se desplaza en bloque hacia delante sin necesidad de rama de compatibilidad en tiempo de ejecución. **Elija siempre la versión del plugin según la versión de DSH** (no use `latest` a ciegas en hosts antiguos: no se cumplen las `engines` del host antiguo y la preverificación de arranque lo desactiva en silencio; los rangos caret tampoco cruzan minor del host):
17
+
18
+ | Host DSH | Última versión del plugin | dist-tag de instalación |
19
+ |---|---|---|
20
+ | 0.2.0 | **0.4.0** (latest) | `dsh-0.2.0` |
21
+ | 0.1.7 | 0.3.1 | `dsh-0.1.7` |
22
+ | 0.1.5 | 0.3.1 | `dsh-0.1.5` |
23
+ | 0.1.2 y anteriores | no soportado (la línea 0.1.x tiene como límite inferior 0.1.5-rc.1; npm no tiene un dist-tag correspondiente) | — |
24
+
25
+ (a fecha de 2026-09-30; la línea 0.1.x sigue siendo atendida por las ramas congeladas `compat/0.1.7` / `compat/0.1.5` (≤0.3.1).)
26
+
27
+ ![brief-sidebar](assets/brief.png)
28
+
29
+ **Frontera de nombres**: la identidad de este plugin (nombre de paquete / plugin id / cordis bundle id / namespace de locale / hook de DOM
30
+ `data-dsh-brief-sidebar`) usa siempre `brief`; en cambio, la proyección `todos`, la herramienta `todo_write`, la celda de dock oficial `{ id: 'todo' }` y `dsh-tool-todo` pertenecen al dominio upstream de DSH: se conserva la palabra original `todo`, sin renombrado por parte de este plugin.
31
+
32
+ **Sistema de memoria**: la tercera sección del brief (recuperación de memoria) es por ahora solo un **hueco de layout reservado**, está **en planificación** y en esta versión no se renderiza — ver R11 / K4.
33
+
34
+ ## Mapa de requisitos
35
+
36
+ | N.º | Requisito | Ubicación de la implementación |
37
+ |---|---|---|
38
+ | R1 | Durante el montaje del plugin, la barra todo oficial no se renderiza en absoluto | `src/client/brief/dock-shadow.tsx` |
39
+ | R2 | Plugin independiente dedicado, que registra la pestaña «Resumen» en better-sidebar | `src/client/index.tsx` |
40
+ | R3 | Los datos provienen únicamente de la proyección `todos` calculada por el host; sin colapso en el cliente, sin escritura de vuelta | `src/client/brief/use-todos.ts` + `board.ts` |
41
+ | R4 | React ordinario + tokens `--dsw-alias-*`; cero relación de código/nombres con el plugin Canvas | `src/client/TodoBoardTab.tsx` (TodoSection) + `BriefIcon.tsx` |
42
+ | R5 | Reversible: tras deshabilitar/desinstalar el plugin, el dock oficial se recupera automáticamente | Todos los registros van por `ctx.effect`, los disposers se recogen con la fiber |
43
+ | R6 | No destructivo: sin modificar el checkout de DSH / better-sidebar / el plugin canvas | Este paquete se sostiene por sí mismo, no toca ninguno de los repos mencionados |
44
+ | R7 | La pestaña pasa a ser «Resumen», `TAB_ID` sin cambios (reemplazo en sitio, las pestañas ya abiertas no pierden el enlace) | `src/client/SummaryTab.tsx` + `index.tsx` |
45
+ | R8 | Sección 1 «Progreso»: el contrato de los tres estados de todos baja a nivel de sección | `src/client/TodoBoardTab.tsx` |
46
+ | R9 | Sección 2 «Entregables»: lista en tiempo real del último turno + acumulado de sesión, la parte host registra la proyección | `src/projection/*` + `src/client/summary/*` |
47
+ | R10 | Los entregables de codeplan son un subconjunto anotado de la sección de entregables (pill «Planificación» en línea), no una sección independiente | `src/client/summary/deliverables.ts` + `DeliverablesSection.tsx` |
48
+ | R11 | Recuperación de memoria: solo hueco de layout reservado (al final de la secuencia de secciones), **en planificación**, sin renderizar en esta versión | Comentario del hueco en `src/client/SummaryTab.tsx` / K4 |
49
+ | R12 | Conservación del comportamiento: ocultamiento, badge, pausa vía `visible`, contrato de altura, adaptación 0.1.5 | En varios puntos, ver abajo |
50
+ | R13 | La parte host no hace E/S síncrona; la proyección es una contribución opcional (espera vía `ctx.inject`) | `src/index.ts` + `src/projection/register.ts` |
51
+
52
+ ## Instalación
53
+
54
+ ```powershell
55
+ # elija el dist-tag según la versión del host DSH (recomendado, no use latest a ciegas)
56
+ dsh plugin --profile web add dsh-brief-sidebar@dsh-0.2.0 # línea DSH 0.2.0 (0.4.0)
57
+ dsh plugin --profile web add dsh-brief-sidebar@dsh-0.1.7 # línea DSH 0.1.7 (0.3.1)
58
+ dsh plugin --profile web add dsh-brief-sidebar@dsh-0.1.5 # línea DSH 0.1.5 (0.3.1)
59
+ # Alternativa 1: tarball local (esta línea: dsh-brief-sidebar-0.4.0.tgz)
60
+ dsh plugin --profile web add <dsh-brief-sidebar-0.4.0.tgz>
61
+ # Alternativa 2: instalación directa desde GitHub (compilación por cuenta propia)
62
+ dsh plugin --profile web add github:drscrewdriver/dsh-brief-sidebar#main
63
+ ```
64
+
65
+ `--profile` debe ir inmediatamente después de `plugin`. Tras la instalación, recargue `http://127.0.0.1:3080`.
66
+
67
+ ## Puntos de diseño
68
+
69
+ ### Cadena de datos: resolver directamente la face de proyecciones en lugar del `useProjection` del framework
70
+
71
+ El cuerpo de la pestaña de better-sidebar **no está dentro del árbol de slots de DSH** y no recibe las props estándar con scope de sesión, por lo que:
72
+
73
+ ```ts
74
+ ctx.get('sessions') // acceso seguro (sin leer el Proxy directamente)
75
+ ?.binding(scope.sessionId)?.session.projections // SessionBinding.session = SessionFace
76
+ ?.faceOf(key) // ProjectionsFace
77
+ => useSyncExternalStore(...) // sin espejo local, sin colapso
78
+ ```
79
+
80
+ Esta cadena la comparten las dos proyecciones (`src/client/use-projection.ts` es la resolución genérica independiente de la key):
81
+
82
+ - `todos` — registrada por `dsh-tool-todo`, el host es el único punto de cálculo, `TodoItem[] | null`.
83
+ - `dshSummaryDeliverables` — registrada por la parte host de este plugin (ver la sección siguiente), `DeliverablesView`.
84
+
85
+ **Los tres estados de la sección de progreso deben mantenerse distinguibles** (contrato de `readTodos`, fijado por tests):
86
+
87
+ | Valor | Significado | Render |
88
+ |---|---|---|
89
+ | `undefined` | capacidad ausente (sin sesión / unidad del host no montada / aún sin baseline) | «Tareas no disponibles por ahora» |
90
+ | `null` → `[]` | proyección presente y vacía | estado vacío |
91
+ | array | entradas reales | lista + resumen de progreso |
92
+
93
+ Confundir los dos primeros equivale a decirle al lector «esta sesión no tiene tareas», cuando la realidad es «no se pueden obtener los datos».
94
+
95
+ La sección de entregables es distinta: es una **capacidad de enriquecimiento opcional**; cuando la proyección falta (la parte host no registró esa unit), toda la sección se oculta, sin renderizar ruido de «no disponible»; cuando la proyección está, `latest: null` y `sessionTotal: 0` son su estado vacío (la unit publica en cuanto se registra).
96
+
97
+ ### Cadena de datos de los entregables: la parte host registra una unit de proyección
98
+
99
+ Los datos de la línea oficial «producción del turno» (`ui-deliverables`) ya se acumulan durante el turno, entrada por entrada, con cada `tool/result` exitoso; solo que la UI oficial cuelga de `conversation.chat.turnTail` y se renderiza solo al final del turno, mientras que la pestaña lateral no accede a los datos de turno del motor conversation (`SessionFace` no expone la ventana de eventos, `IConversation` no expone los datos de turno). Por eso la parte host del plugin contribuye su propia unit mediante `ctx.sessionProjections.register()`:
100
+
101
+ - el **criterio de fold** es idéntico al del `turn-deliverables.ts` oficial: solo cuentan los paths de los `write` / `edit` /
102
+ `str_replace_editor` exitosos (variantes create/str_replace/insert), con deduplicación, los fallos no cuentan, las lecturas no cuentan;
103
+ escribir y luego modificar en el mismo turno cuenta como una sola entrada (`src/projection/deliverables-fold.ts`, función pura, fijada por tests).
104
+ - **tiempo real en el turno**: cada evento de commit del registro impulsa el `apply` de todas las units; cada cambio de archivo que se consolida con éxito empuja de inmediato un frame.
105
+ - **contribución opcional**: `ctx.inject(['sessionProjections'], …)` espera el servicio; un deployment sin registro carga igualmente este plugin
106
+ (la sección de entregables se oculta en silencio); el registro es un effect, al desinstalar desaparece la key y el cliente lee «capacidad ausente».
107
+ - **capacidad**: paths del último turno con tope de 50, acumulado de sesión con tope de 100 (se conservan los más recientes); `sessionTotal` no tiene tope,
108
+ la línea de acumulado «N archivos en total en esta sesión» siempre es fiel a la realidad.
109
+ - **key con namespace** (`dshSummaryDeliverables`): el registro rechaza compartir la misma key con un `stateVersion` distinto,
110
+ para evitar una colisión frontal con una posible futura proyección host oficial.
111
+
112
+ ### Entregables de codeplan: subconjunto anotado de la sección de entregables
113
+
114
+ El **criterio de la pill «Planificación» es una regla puramente de rutas**: si el path del archivo producido, tras normalizar los separadores, impacta el segmento `.agents/plans/` (slash o backslash), se coloca la pill «Planificación» y el primer segmento tras `.agents/plans/` (nombre de la tarea) se pone en `title`.
115
+ El plugin no lee el contenido de los archivos ni verifica que quien escribe sea el skill codeplan — todo archivo escrito en ese directorio queda anotado;
116
+ la ventaja de este criterio es que no hace falta ninguna cadena de datos adicional, el precio es que la convención de rutas es ella misma la única fuente de verdad (ver el hueco K5).
117
+
118
+ El skill codeplan escribe `spec.md` / `findings.md` / `checklist.md` / `tasks.md` con write bajo
119
+ `$workspace\.agents\plans\<任务名>\` — estos archivos aparecen por sí solos en el fold de entregables, sin recolección adicional.
120
+ Los entregables de planificación no tienen una sección independiente: forman parte de los entregables por naturaleza.
121
+
122
+ ### Abrir al hacer clic: el mismo canal de vista previa de Sidebar que el flujo de conversación
123
+
124
+ En la sección de entregables cada línea de path es un botón; el clic va por `ctx.sidebarRight.openResource(<address>)` — exactamente el mismo canal que los chips de «producción del turno» en la conversación y las menciones `code` en línea (el enfoque de ui-chat `openFile`). La dirección la construye el `fileAddressFor` portado en línea (fuente `@deepseek-ai/dsh-util-workspace-path`): path relativo, o path absoluto dentro del workspace de la sesión, direccionado según `dsh-resource://file/session/<id>/<相对路径>` (el prefijo del workspace se elimina); un path absoluto fuera del workspace conserva su escritura absoluta en la misma dirección de sesión. El cwd de la sesión se lee de la instantánea de `sessions.list`, relectura en cada clic.
125
+ Cuando el servicio `sidebarRight` falta, la línea degrada a texto plano (la misma disciplina de degradación que para la ausencia de la proyección de entregables).
126
+
127
+ ### Ocultar el dock oficial: competencia de celdas en el slot list
128
+
129
+ `conversation.input.dock` es un **slot list**; las celdas se identifican por el `id` de la entrada. El comportamiento de SlotCore es:
130
+
131
+ 1. la clave de deduplicación de `register()` es `(id, priority)` — la misma `id` con otra `priority` es un registro legítimo;
132
+ 2. las entradas se ordenan por `priority` ascendente (y luego por `order`), el texto de error lleva consigo la semántica "lowest renders";
133
+ 3. `entriesOfSlot()` en el slot list toma las celdas por `options.id`, **conservando por celda solo la primera entrada tras el ordenamiento**.
134
+
135
+ La entrada oficial registra `{ id: 'todo', order: 0 }` (priority por defecto = 0); este plugin gana con **`{ id: 'todo', priority: -1 }**.
136
+ El registro va por `ctx.slots.inject('conversation.input.dock', …)` (espera la declaración del slot y se reinstala cuando se reconstruye),
137
+ y no por un `register` desnudo (que competiría con la tabla de declaración children de la entrada padre). La misma técnica ya es un precedente en funcionamiento con `dsh-input-traffic` frente a la celda hermana `queue`.
138
+
139
+ **Ocultar solo si `betterSidebar` está disponible**, de lo contrario se escondería el panel y las tareas no serían visibles en ningún sitio.
140
+
141
+ ### Superficie de soporte: la barra lateral derecha nativa de DSH
142
+
143
+ Desde 0.1.5 la barra lateral derecha es propiedad nativa de DSH; el `openTab` de better-sidebar, con su `target: 'right'` por defecto, registra el contenido como tipo de pestaña nativo,
144
+ y el menú `+` es la página guide nativa (`description` solo se renderiza si la página guide tiene ≤4 entradas). El cuerpo de la pestaña sigue recibiendo
145
+ `TabComponentProps = { ctx, store, scope, tab, visible, … }`; este plugin solo usa de ahí `ctx` / `scope` / `visible`.
146
+
147
+ Con `visible === false` toda la tarjeta (incluida la carcasa) no se renderiza, para evitar que la pestaña oculta se re-renderice en cada frame de proyección.
148
+
149
+ ## Riesgos de acoplamiento y autoverificación
150
+
151
+ | Riesgo | Consecuencia | Método de autoverificación |
152
+ |---|---|---|
153
+ | El upstream renombra el id de la celda `todo` | El ocultamiento falla en silencio, el panel oficial reaparece (**fail-open**: los datos no se pierden, solo se muestran duplicados) | Ejecutar en la consola `ctx.slots.entriesOfSlot('conversation.input.dock').filter(e => e.options.id === 'todo')`; debe quedar solo la entrada de este plugin (`registrant: 'dsh-brief-sidebar'`, `priority: -1`) |
154
+ | Panel/barra lateral de better-sidebar cerrados | Las tareas son invisibles | El badge de la pestaña muestra el número de tareas incompletas como pista |
155
+ | El upstream cambia la key o los campos de la proyección `todos` | El tablero muestra «no disponible» o descarta entradas inválidas | `SessionProjectionMap.todos` en los `types.d.ts` de `dsh-tool-todo` sigue siendo la única fuente de verdad |
156
+ | Deriva de la API de better-sidebar | La superficie de registro deja de funcionar | Usar solo los campos básicos de `registerTab` (`id/title/description/icon/order/single/badge/component`); `peerDependencies` relajado a `>=0.18.1`, `devDependencies` fijado a la versión que corre actualmente |
157
+ | Deriva del criterio de fold oficial (nuevas herramientas de mutación entran en la lista, etc.) | La lista de entregables de este plugin se aleja progresivamente de la «producción del turno» oficial | El criterio toma como base de alineación el `mutationPath` de `ui-deliverables/turn-deliverables.ts`; en cada actualización, comparar con un diff |
158
+ | El upstream cambia la forma de los eventos `tool/call` / `tool/result` | El fold de entregables pierde datos (defensa al estilo `readTodos` que se estrecha, sin crash) | Las entradas `'tool/call'` / `'tool/result'` del `SessionEventMap` de `dsh-session` son la fuente de verdad |
159
+
160
+ ## Huecos conocidos
161
+
162
+ - **K1** Si el usuario deshabilita este tipo de pestaña en la tarjeta Side, el dock queda oculto → las tareas no son visibles en ningún sitio.
163
+ Más adelante se podría condicionar con `prefs.tabsEnabled`; esta vez no se hizo (el usuario eligió «ocultar por completo»).
164
+ - **K2** Con el panel/barra lateral de better-sidebar cerrados, las tareas son invisibles (aceptación confirmada).
165
+ - **K3** El upstream renombra la celda `todo` → el ocultamiento falla en silencio (fail-open, ver la tabla de arriba).
166
+ - **K4** La sección de recuperación de memoria tiene solo un hueco de layout (**en planificación**): el sistema no tiene memoria por defecto; la cadena de datos se conectará cuando un plugin de memoria registre una key de proyección.
167
+ - **K5** La pill «Planificación» es un juicio puro de prefijo de path (segmento `.agents/plans/`) y no verifica quién escribe: los archivos escritos en ese directorio por fuentes distintas de codeplan también quedan anotados; si codeplan cambia su convención de directorio de entregables, habrá que sincronizar la constante de `summary/deliverables.ts`.
168
+ - **K6** La apertura de las líneas de path al hacer clic depende del servicio host `sidebarRight` (consumo opcional); en deployments sin él, las líneas de entregables no son clicables y se muestran como texto plano.
169
+
170
+ ## Desarrollo
171
+
172
+ ```powershell
173
+ pnpm install # dependencias: react / @deepseek-ai/cordis / zod como devDep, en runtime las provee la tabla de módulos del host o se empaquetan con el paquete
174
+ pnpm typecheck # tsc -p tsconfig.json && tsc -p tsconfig.client.json
175
+ pnpm test # vitest (jsdom)
176
+ pnpm build # tsc produce lib/types + tsdown produce lib/index.mjs / lib/client.js (zod empaquetado dentro del paquete host, autocontenido)
177
+ npm pack # produce el tarball (este directorio tiene un pnpm-workspace.yaml pero sin campo packages, pnpm pack no se puede usar)
178
+ ```
179
+
180
+ `lib/` **debe ir versionado**: cuando el profile instala vía una ref de GitHub no hay paso de compilación.
181
+
182
+ ## Compatibilidad
183
+
184
+ Los registros de pruebas caso por caso de la línea 0.1.x están en los README de las ramas `compat/0.1.7` / `compat/0.1.5` (≤0.3.1); esta línea (`main`) apunta a la **línea DSH 0.2.0**, con línea base probada **DSH 0.2.0-rc.1 + dsh-better-sidebar 0.19.1**.
185
+ 0.2.0-rc.1 es totalmente compatible con la API de plugins de 0.1.7 (manifest/settings/HMR/slot/sesión V4 intactos); toda la superficie consumida de este plugin son callers puros de `ctx.get(...)` (`slots` / `locale` / `betterSidebar` / `sidebarRight` / `sessions`, con definiciones de interfaces locales), sin override de los contratos del host, por lo que esta línea es una adaptación puramente de metadatos, cero cambios de código.
186
+ `engines.dsh` es `>=0.2.0-rc.1 <0.2.1-0`, y los tres lugares — `engines.dsh` de `package.json`, el rango del paquete cliente DSH en `peerDependencies` y `engines.dsh` de `dsh.plugin.json` — **deben mantenerse coherentes** (actualmente coherentes).
187
+ La última versión del plugin por línea de host, junto con su dist-tag de instalación, está en la tabla de «Alcance de compatibilidad» al principio del archivo (0.2.0 → 0.4.0 / 0.1.7 → 0.3.1 / 0.1.5 → 0.3.1; 0.1.2 y anteriores no están soportados).
188
+ **Las líneas anfitrionas a partir de 0.2.1 no están cubiertas por esta línea**: disciplina de fijación a la ventana rc; a partir de 0.2.1 habrá que reevaluar la adaptación (entonces se abrirá una nueva línea de versiones).
189
+
190
+ ## Nota multilingüe / Sprachen / Langues / Языки / Idiomas / Lingue
191
+
192
+ El README original está escrito en chino; este documento es su traducción al español. Resumen de instalación y compatibilidad (esta línea requiere DSH 0.2.0: `>=0.2.0-rc.1 <0.2.1-0`; dist-tag según la línea del host: 0.2.0 → `dsh-0.2.0` (0.4.0) / 0.1.7 → `dsh-0.1.7` (0.3.1) / 0.1.5 → `dsh-0.1.5` (0.3.1); DSH 0.1.2 y anteriores no están soportados, no use `latest` a ciegas en hosts antiguos):
193
+
194
+ - **Deutsch** — benötigt DSH 0.2.0 (`>=0.2.0-rc.1 <0.2.1-0`), getestet gegen DSH 0.2.0-rc.1. dist-tag je nach Host-Linie: `dsh plugin --profile web add dsh-brief-sidebar@dsh-0.2.0` (0.2.0 → 0.4.0), `…@dsh-0.1.7` (0.1.7 → 0.3.1), `…@dsh-0.1.5` (0.1.5 → 0.3.1); DSH 0.1.2 und früher werden nicht unterstützt. Kein blindes `latest` auf alten Hosts (die Start-Vorprüfung deaktiviert das Plugin still). Tabelle: Abschnitt „Kompatibilitätsbereich".
195
+ - **Français** — nécessite DSH 0.2.0 (`>=0.2.0-rc.1 <0.2.1-0`), testé avec DSH 0.2.0-rc.1. dist-tag selon la ligne d'hôte : `dsh plugin --profile web add dsh-brief-sidebar@dsh-0.2.0` (0.2.0 → 0.4.0), `…@dsh-0.1.7` (0.1.7 → 0.3.1), `…@dsh-0.1.5` (0.1.5 → 0.3.1) ; DSH 0.1.2 et antérieurs ne sont pas pris en charge. Pas de `latest` aveugle sur un hôte ancien (la prévérification de démarrage le désactive en silence). Tableau : section « Périmètre de compatibilité ».
196
+ - **Русский** — требуется DSH 0.2.0 (`>=0.2.0-rc.1 <0.2.1-0`), протестировано на DSH 0.2.0-rc.1. dist-tag по линии хоста: `dsh plugin --profile web add dsh-brief-sidebar@dsh-0.2.0` (0.2.0 → 0.4.0), `…@dsh-0.1.7` (0.1.7 → 0.3.1), `…@dsh-0.1.5` (0.1.5 → 0.3.1); DSH 0.1.2 и ранее не поддерживаются. Не используйте `latest` вслепую на старых хостах (плагин молча отключается стартовой предпроверкой). Таблица: раздел «Диапазон совместимости».
197
+ - **Español** — requiere DSH 0.2.0 (`>=0.2.0-rc.1 <0.2.1-0`), probado con DSH 0.2.0-rc.1. dist-tag según la línea del host: `dsh plugin --profile web add dsh-brief-sidebar@dsh-0.2.0` (0.2.0 → 0.4.0), `…@dsh-0.1.7` (0.1.7 → 0.3.1), `…@dsh-0.1.5` (0.1.5 → 0.3.1); DSH 0.1.2 y anteriores no están soportados. No use `latest` a ciegas en hosts antiguos (la preverificación de arranque lo desactiva en silencio). Tabla: sección «Alcance de compatibilidad».
198
+ - **Italiano** — richiede DSH 0.2.0 (`>=0.2.0-rc.1 <0.2.1-0`), testato su DSH 0.2.0-rc.1. dist-tag in base alla linea dell'host: `dsh plugin --profile web add dsh-brief-sidebar@dsh-0.2.0` (0.2.0 → 0.4.0), `…@dsh-0.1.7` (0.1.7 → 0.3.1), `…@dsh-0.1.5` (0.1.5 → 0.3.1); DSH 0.1.2 e precedenti non sono supportati. Niente `latest` alla cieca su host vecchi (la preverifica di avvio lo disattiva in silenzio). Tabella: sezione «Perimetro di compatibilità».