@lenne.tech/cli 1.27.0 → 1.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,603 @@
1
+ <!doctype html>
2
+ <html lang="de">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>lt dev × lt ticket — Parallel entwickeln ohne Reibung</title>
7
+ <style>
8
+ :root {
9
+ --indigo:#6366f1; --indigo-d:#4f46e5; --violet:#8b5cf6;
10
+ --cyan:#06b6d4; --emerald:#10b981; --amber:#f59e0b; --rose:#f43f5e;
11
+ --ink:#0f172a; --ink-2:#334155; --muted:#64748b; --line:#e2e8f0;
12
+ --bg:#ffffff; --bg-soft:#f8fafc; --bg-soft2:#f1f5f9;
13
+ --code-bg:#0f172a; --code-ink:#e2e8f0;
14
+ --font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, "Noto Sans", sans-serif;
15
+ --mono: "SF Mono", "JetBrains Mono", "Fira Code", Menlo, Consolas, monospace;
16
+ }
17
+ * { box-sizing:border-box; }
18
+ html { -webkit-print-color-adjust:exact; print-color-adjust:exact; }
19
+ body {
20
+ margin:0; font-family:var(--font); color:var(--ink); background:var(--bg);
21
+ line-height:1.6; font-size:15px; letter-spacing:.1px;
22
+ }
23
+ .page { max-width:980px; margin:0 auto; padding:0 40px; }
24
+ h1,h2,h3 { line-height:1.18; letter-spacing:-.02em; }
25
+ h2 { font-size:30px; margin:6px 0 4px; }
26
+ h3 { font-size:20px; margin:26px 0 8px; }
27
+ p { margin:10px 0; color:var(--ink-2); }
28
+ a { color:var(--indigo-d); text-decoration:none; }
29
+ code, .mono { font-family:var(--mono); font-size:.88em; }
30
+ :not(pre) > code { background:var(--bg-soft2); border:1px solid var(--line); border-radius:6px; padding:1px 6px; color:#0b2545; white-space:nowrap; }
31
+ .lead { font-size:18px; color:var(--ink-2); }
32
+ .small { font-size:13px; }
33
+ .muted { color:var(--muted); }
34
+
35
+ /* ---------- HERO ---------- */
36
+ .hero {
37
+ background:
38
+ radial-gradient(1200px 500px at 85% -10%, rgba(6,182,212,.35), transparent 60%),
39
+ radial-gradient(900px 500px at 5% 120%, rgba(139,92,246,.40), transparent 55%),
40
+ linear-gradient(135deg, #1e1b4b 0%, #312e81 48%, #155e75 100%);
41
+ color:#fff; padding:64px 0 56px; position:relative; overflow:hidden;
42
+ }
43
+ .hero .page { position:relative; z-index:2; }
44
+ .hero .kicker { text-transform:uppercase; letter-spacing:.28em; font-size:12px; font-weight:700; color:#a5f3fc; opacity:.95; }
45
+ .hero h1 { font-size:50px; margin:14px 0 10px; font-weight:800; color:#fff; }
46
+ .hero h1 .grad { background:linear-gradient(90deg,#a5b4fc,#67e8f9 60%,#6ee7b7); -webkit-background-clip:text; background-clip:text; color:transparent; }
47
+ .hero .sub { font-size:19px; color:#dbeafe; max-width:760px; }
48
+ .hero .badges { margin-top:24px; display:flex; flex-wrap:wrap; gap:10px; }
49
+ .pill { display:inline-flex; align-items:center; gap:7px; font-size:13px; font-weight:600;
50
+ background:rgba(255,255,255,.10); border:1px solid rgba(255,255,255,.22); color:#f0f9ff;
51
+ padding:7px 13px; border-radius:999px; backdrop-filter:blur(6px); }
52
+ .pill .dot { width:8px; height:8px; border-radius:50%; }
53
+ .meta-row { margin-top:30px; display:flex; gap:26px; flex-wrap:wrap; color:#c7d2fe; font-size:13px; }
54
+ .meta-row b { color:#fff; }
55
+
56
+ /* ---------- LAYOUT BLOCKS ---------- */
57
+ section { padding:40px 0; border-bottom:1px solid var(--line); }
58
+ section.alt { background:var(--bg-soft); }
59
+ .eyebrow { display:inline-block; font-size:12px; font-weight:800; letter-spacing:.22em; text-transform:uppercase;
60
+ color:var(--indigo-d); background:#eef2ff; border:1px solid #e0e7ff; padding:4px 11px; border-radius:999px; margin-bottom:10px; }
61
+ .grid { display:grid; gap:18px; }
62
+ .g2 { grid-template-columns:1fr 1fr; }
63
+ .g3 { grid-template-columns:1fr 1fr 1fr; }
64
+ @media (max-width:760px){ .g2,.g3 { grid-template-columns:1fr; } }
65
+
66
+ .card { background:var(--bg); border:1px solid var(--line); border-radius:16px; padding:20px 22px;
67
+ box-shadow:0 1px 2px rgba(15,23,42,.04), 0 8px 24px -16px rgba(15,23,42,.18); }
68
+ .card h3 { margin-top:0; }
69
+ .card .ico { width:42px; height:42px; border-radius:12px; display:flex; align-items:center; justify-content:center;
70
+ font-size:20px; margin-bottom:12px; color:#fff; }
71
+
72
+ .badge { display:inline-block; font-size:11px; font-weight:800; letter-spacing:.04em; padding:2px 9px; border-radius:999px; vertical-align:middle; }
73
+ .b-indigo{ background:#eef2ff; color:#4338ca; } .b-cyan{ background:#ecfeff; color:#0e7490; }
74
+ .b-emerald{ background:#ecfdf5; color:#047857; } .b-amber{ background:#fffbeb; color:#b45309; }
75
+ .b-rose{ background:#fff1f2; color:#be123c; } .b-slate{ background:#f1f5f9; color:#334155; }
76
+
77
+ /* ---------- CODE ---------- */
78
+ pre { background:var(--code-bg); color:var(--code-ink); border-radius:14px; padding:18px 20px; overflow:auto;
79
+ font-family:var(--mono); font-size:13px; line-height:1.7; margin:14px 0; border:1px solid #1e293b; }
80
+ pre .c { color:#7c93b3; } /* comment */
81
+ pre .k { color:#67e8f9; } /* command */
82
+ pre .a { color:#fcd34d; } /* arg/flag */
83
+ pre .s { color:#86efac; } /* string/url */
84
+ pre .m { color:#c4b5fd; } /* meta */
85
+
86
+ /* ---------- TABLE ---------- */
87
+ table { width:100%; border-collapse:collapse; margin:14px 0; font-size:14px; }
88
+ th,td { text-align:left; padding:11px 14px; border-bottom:1px solid var(--line); vertical-align:top; }
89
+ th { font-size:12px; text-transform:uppercase; letter-spacing:.06em; color:var(--muted); background:var(--bg-soft); }
90
+ tbody tr:nth-child(even){ background:var(--bg-soft); }
91
+ td code { font-size:.86em; }
92
+
93
+ /* ---------- CALLOUTS ---------- */
94
+ .note { border-radius:14px; padding:16px 18px 16px 18px; margin:16px 0; border:1px solid; display:flex; gap:13px; }
95
+ .note .ni { font-size:20px; line-height:1; }
96
+ .note.tip { background:#f0fdfa; border-color:#99f6e4; }
97
+ .note.warn { background:#fffbeb; border-color:#fde68a; }
98
+ .note.key { background:#eef2ff; border-color:#c7d2fe; }
99
+ .note b { color:var(--ink); }
100
+
101
+ .steps { counter-reset:s; display:grid; gap:14px; }
102
+ .step { display:flex; gap:15px; align-items:flex-start; }
103
+ .step .n { counter-increment:s; flex:0 0 34px; height:34px; border-radius:50%;
104
+ background:linear-gradient(135deg,var(--indigo),var(--violet)); color:#fff; font-weight:800;
105
+ display:flex; align-items:center; justify-content:center; font-size:15px; }
106
+ .step .n::before { content:counter(s); }
107
+
108
+ .kpi { display:grid; grid-template-columns:repeat(4,1fr); gap:16px; margin:18px 0; }
109
+ @media (max-width:760px){ .kpi { grid-template-columns:1fr 1fr; } }
110
+ .kpi .k { background:var(--bg); border:1px solid var(--line); border-radius:14px; padding:16px; text-align:center; }
111
+ .kpi .big { font-size:30px; font-weight:800; background:linear-gradient(135deg,var(--indigo),var(--cyan)); -webkit-background-clip:text; background-clip:text; color:transparent; }
112
+ .kpi .lbl { font-size:12px; color:var(--muted); margin-top:2px; }
113
+
114
+ figure { margin:18px 0 6px; }
115
+ figure svg { width:100%; height:auto; display:block; border:1px solid var(--line); border-radius:16px; background:#fff; }
116
+ figcaption { font-size:12.5px; color:var(--muted); margin-top:8px; text-align:center; }
117
+
118
+ .footer { padding:30px 0 50px; color:var(--muted); font-size:13px; }
119
+ .footer .brand { font-weight:800; color:var(--ink); letter-spacing:-.01em; }
120
+
121
+ /* ---------- PRINT ---------- */
122
+ @page { size:A4; margin:14mm 0; }
123
+ @media print {
124
+ body { font-size:11.4pt; }
125
+ .page { max-width:none; padding:0 16mm; }
126
+ section { padding:18px 0; }
127
+ .hero { padding:30mm 0 22mm; }
128
+ .hero h1 { font-size:34pt; }
129
+ .no-print { display:none !important; }
130
+ .card, figure svg, pre, .note, .kpi .k { box-shadow:none; }
131
+ pre { white-space:pre-wrap; word-break:break-word; font-size:9.5pt; line-height:1.55; }
132
+ h2, h3 { break-after:avoid; }
133
+ .card, .note, figure, table, pre, .step { break-inside:avoid; }
134
+ .break { break-before:page; }
135
+ }
136
+ </style>
137
+ </head>
138
+ <body>
139
+
140
+ <!-- ============================ HERO ============================ -->
141
+ <header class="hero">
142
+ <div class="page">
143
+ <div class="kicker">lenne.Tech · Developer Workflow Guide</div>
144
+ <h1>Parallel entwickeln —<br><span class="grad">ohne Reibung, ohne Kollisionen.</span></h1>
145
+ <p class="sub">Mit <b>lt&nbsp;dev</b> und <b>lt&nbsp;ticket</b> betreibst du beliebig viele Projekte <i>und</i> beliebig viele Tickets gleichzeitig — jedes mit eigener URL, eigener Datenbank, eigenen Ports. Ein Befehl, und du legst los.</p>
146
+ <div class="badges">
147
+ <span class="pill"><span class="dot" style="background:#67e8f9"></span> Pro Projekt isoliert</span>
148
+ <span class="pill"><span class="dot" style="background:#a5b4fc"></span> Pro Ticket isoliert</span>
149
+ <span class="pill"><span class="dot" style="background:#6ee7b7"></span> Parallele E2E-Tests</span>
150
+ <span class="pill"><span class="dot" style="background:#fcd34d"></span> Claude-aware</span>
151
+ <span class="pill"><span class="dot" style="background:#fda4af"></span> Schutz vor Datenverlust</span>
152
+ </div>
153
+ <div class="meta-row">
154
+ <div>Voraussetzung&nbsp; <b>lt&nbsp;CLI&nbsp;≥&nbsp;1.28.0 · neuestes&nbsp;lt-dev&nbsp;Plugin</b></div>
155
+ <div>Stack&nbsp; <b>Nest&nbsp;Server · Nuxt&nbsp;Base</b></div>
156
+ <div>Routing&nbsp; <b>Caddy · *.localhost (HTTPS)</b></div>
157
+ <div>Zielgruppe&nbsp; <b>lenne.Tech Entwickler:innen</b></div>
158
+ </div>
159
+ </div>
160
+ </header>
161
+
162
+ <!-- ============================ WARUM ============================ -->
163
+ <section class="alt">
164
+ <div class="page">
165
+ <span class="eyebrow">Warum das alles?</span>
166
+ <h2>Schluss mit „erst runterfahren, dann das andere starten"</h2>
167
+ <p class="lead">Bisher band jedes Projekt die Framework-Default-Ports <code>3000</code>/<code>3001</code>. Zwei Projekte gleichzeitig? Port-Kollision. Auth über Cookies? Cross-wiring. Ein zweites Ticket testen, während das erste läuft? Ging nicht.</p>
168
+ <div class="grid g2" style="margin-top:18px">
169
+ <div class="card" style="border-color:#fecaca; background:#fff7f7">
170
+ <span class="badge b-rose">VORHER</span>
171
+ <h3 style="margin-top:8px">Sequenziell &amp; fragil</h3>
172
+ <p style="margin:6px 0 0">Ein Projekt zur Zeit. Feste Ports kollidieren. Branch wechseln heißt: Server neu starten, DB-Zustand verlieren, Kontext verlieren. Tickets parallel? Nur über getrennte Klone — langsam und unübersichtlich.</p>
173
+ </div>
174
+ <div class="card" style="border-color:#bbf7d0; background:#f3fdf7">
175
+ <span class="badge b-emerald">NACHHER</span>
176
+ <h3 style="margin-top:8px">Parallel &amp; isoliert</h3>
177
+ <p style="margin:6px 0 0">Jedes Projekt und jedes Ticket läuft hinter Caddy unter <code>https://&lt;name&gt;.localhost</code> — eigene Ports, eigene DB, eigener Caddy-Block. Mehrere Browser-Tabs, mehrere Claude-Sessions, mehrere Test-Läufe — alles gleichzeitig, nichts beeinflusst sich.</p>
178
+ </div>
179
+ </div>
180
+ <div class="kpi">
181
+ <div class="k"><div class="big">0&nbsp;s</div><div class="lbl">Worktree anlegen (geteiltes&nbsp;.git)</div></div>
182
+ <div class="k"><div class="big">1</div><div class="lbl">Befehl bis „läuft im Browser"</div></div>
183
+ <div class="k"><div class="big">N</div><div class="lbl">Tickets &amp; Projekte gleichzeitig</div></div>
184
+ <div class="k"><div class="big">~2×</div><div class="lbl">schnellere E2E durch Sharding</div></div>
185
+ </div>
186
+ </div>
187
+ </section>
188
+
189
+ <!-- ============================ VORAUSSETZUNGEN ============================ -->
190
+ <section>
191
+ <div class="page">
192
+ <span class="eyebrow">Voraussetzungen</span>
193
+ <h2>Bevor du loslegst — einmal aktuell ziehen</h2>
194
+ <p class="lead">Dieser Workflow braucht die <b>lt&nbsp;CLI ≥ 1.28.0</b> (enthält <code>lt&nbsp;dev</code> + <code>lt&nbsp;ticket</code>) und das <b>neueste lt-dev Claude Plugin</b> (macht Claude ticket-aware). Beides ist in Sekunden installiert bzw. aktualisiert.</p>
195
+ <div class="grid g2" style="margin-top:16px">
196
+ <div class="card">
197
+ <div class="ico" style="background:linear-gradient(135deg,#6366f1,#4338ca)">⬇️</div>
198
+ <h3>lt&nbsp;CLI&nbsp;<span class="badge b-indigo">≥&nbsp;1.28.0</span></h3>
199
+ <p class="small" style="margin-top:4px">Version prüfen mit <code>lt --version</code> — muss <b>1.28.0 oder neuer</b> sein.</p>
200
+ <pre><span class="c"># Neu installieren (global)</span>
201
+ <span class="k">npm</span> <span class="a">install -g</span> <span class="s">@lenne.tech/cli</span>
202
+
203
+ <span class="c"># Auf die neueste Version aktualisieren</span>
204
+ <span class="k">lt update</span>
205
+
206
+ <span class="c"># Version prüfen (≥ 1.28.0)</span>
207
+ <span class="k">lt</span> <span class="a">--version</span></pre>
208
+ </div>
209
+ <div class="card">
210
+ <div class="ico" style="background:linear-gradient(135deg,#06b6d4,#0e7490)">🧩</div>
211
+ <h3>Neuestes lt-dev Plugin</h3>
212
+ <p class="small" style="margin-top:4px">Aus dem <b>lenne-tech Marketplace</b> ziehen — installiert/aktualisiert lt-dev (+ weitere lt-Plugins) und richtet die Berechtigungen ein.</p>
213
+ <pre><span class="c"># lt-dev Claude Plugin installieren / aktualisieren</span>
214
+ <span class="k">lt claude plugins</span></pre>
215
+ <p class="small muted" style="margin-top:8px">Aktualisiert sich zusätzlich automatisch beim Start einer Claude-Code-Session.</p>
216
+ </div>
217
+ </div>
218
+ <div class="note key"><div class="ni">🚀</div><div><b>In 3 Schritten startklar:</b> <code>lt update</code> (CLI auf ≥&nbsp;1.28.0) → <code>lt claude plugins</code> (Plugin ziehen) → im Projekt <code>lt dev init</code>, dann <code>lt ticket start &lt;ticket&gt;</code>.</div></div>
219
+ </div>
220
+ </section>
221
+
222
+ <!-- ============================ LT DEV ============================ -->
223
+ <section class="alt">
224
+ <div class="page">
225
+ <span class="eyebrow">Baustein 1</span>
226
+ <h2><code style="font-size:.8em">lt dev</code> — der isolierte Stack pro Projekt</h2>
227
+ <p class="lead">Ein Projekt, eine eigene Welt. <b>lt dev up</b> startet API + App hinter Caddy unter projekteigenen URLs — beliebig viele Projekte nebeneinander, garantiert kollisionsfrei.</p>
228
+
229
+ <figure>
230
+ <!-- DIAGRAM A: multi-project isolation -->
231
+ <svg viewBox="0 0 920 360" role="img" aria-label="Mehrere Projekte hinter Caddy, jeweils mit eigenen URLs, Ports und Datenbank">
232
+ <defs>
233
+ <linearGradient id="gCaddy" x1="0" y1="0" x2="1" y2="0">
234
+ <stop offset="0" stop-color="#6366f1"/><stop offset="1" stop-color="#06b6d4"/>
235
+ </linearGradient>
236
+ <marker id="arr" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
237
+ <path d="M0 0 L10 5 L0 10 z" fill="#94a3b8"/>
238
+ </marker>
239
+ </defs>
240
+ <rect x="0" y="0" width="920" height="360" fill="#ffffff"/>
241
+ <!-- Caddy bar -->
242
+ <rect x="60" y="36" width="800" height="56" rx="14" fill="url(#gCaddy)"/>
243
+ <text x="460" y="60" text-anchor="middle" fill="#fff" font-family="sans-serif" font-size="16" font-weight="700">Caddy · Reverse Proxy · HTTPS auf *.localhost</text>
244
+ <text x="460" y="80" text-anchor="middle" fill="#e0e7ff" font-family="sans-serif" font-size="12">eine lokale CA · keine Port-Angabe in URLs · automatisch verwaltet</text>
245
+ <!-- three project columns -->
246
+ <g font-family="sans-serif">
247
+ <!-- helper via repeated groups -->
248
+ <g>
249
+ <line x1="200" y1="92" x2="200" y2="140" stroke="#94a3b8" stroke-width="2" marker-end="url(#arr)"/>
250
+ <rect x="80" y="140" width="240" height="170" rx="14" fill="#f8fafc" stroke="#e2e8f0"/>
251
+ <text x="100" y="168" font-size="15" font-weight="800" fill="#0f172a">Projekt&nbsp;„crm"</text>
252
+ <text x="100" y="194" font-size="12.5" fill="#0e7490" font-family="monospace">crm.localhost</text>
253
+ <text x="100" y="214" font-size="12.5" fill="#0e7490" font-family="monospace">api.crm.localhost</text>
254
+ <text x="100" y="240" font-size="12" fill="#475569" font-family="monospace">DB&nbsp;crm-local</text>
255
+ <text x="100" y="262" font-size="12" fill="#475569" font-family="monospace">Ports&nbsp;4000/4001</text>
256
+ <rect x="100" y="276" width="120" height="20" rx="10" fill="#ecfdf5"/><text x="160" y="290" text-anchor="middle" font-size="11" font-weight="700" fill="#047857">● up</text>
257
+ </g>
258
+ <g>
259
+ <line x1="460" y1="92" x2="460" y2="140" stroke="#94a3b8" stroke-width="2" marker-end="url(#arr)"/>
260
+ <rect x="340" y="140" width="240" height="170" rx="14" fill="#f8fafc" stroke="#e2e8f0"/>
261
+ <text x="360" y="168" font-size="15" font-weight="800" fill="#0f172a">Projekt&nbsp;„svl"</text>
262
+ <text x="360" y="194" font-size="12.5" fill="#0e7490" font-family="monospace">svl.localhost</text>
263
+ <text x="360" y="214" font-size="12.5" fill="#0e7490" font-family="monospace">api.svl.localhost</text>
264
+ <text x="360" y="240" font-size="12" fill="#475569" font-family="monospace">DB&nbsp;svl-…-local</text>
265
+ <text x="360" y="262" font-size="12" fill="#475569" font-family="monospace">Ports&nbsp;4002/4003</text>
266
+ <rect x="360" y="276" width="120" height="20" rx="10" fill="#ecfdf5"/><text x="420" y="290" text-anchor="middle" font-size="11" font-weight="700" fill="#047857">● up</text>
267
+ </g>
268
+ <g>
269
+ <line x1="720" y1="92" x2="720" y2="140" stroke="#94a3b8" stroke-width="2" marker-end="url(#arr)"/>
270
+ <rect x="600" y="140" width="240" height="170" rx="14" fill="#f8fafc" stroke="#e2e8f0"/>
271
+ <text x="620" y="168" font-size="15" font-weight="800" fill="#0f172a">Projekt&nbsp;„shop"</text>
272
+ <text x="620" y="194" font-size="12.5" fill="#0e7490" font-family="monospace">shop.localhost</text>
273
+ <text x="620" y="214" font-size="12.5" fill="#0e7490" font-family="monospace">api.shop.localhost</text>
274
+ <text x="620" y="240" font-size="12" fill="#475569" font-family="monospace">DB&nbsp;shop-local</text>
275
+ <text x="620" y="262" font-size="12" fill="#475569" font-family="monospace">Ports&nbsp;4004/4005</text>
276
+ <rect x="620" y="276" width="120" height="20" rx="10" fill="#ecfdf5"/><text x="680" y="290" text-anchor="middle" font-size="11" font-weight="700" fill="#047857">● up</text>
277
+ </g>
278
+ </g>
279
+ </svg>
280
+ <figcaption>Drei Projekte, gleichzeitig „up" — eigene URLs, eigene DBs, eigene Ports. Caddy routet alles über HTTPS, ganz ohne Port-Angabe.</figcaption>
281
+ </figure>
282
+
283
+ <h3>Der Lebenszyklus</h3>
284
+ <pre><span class="c"># Einmal pro Rechner</span>
285
+ <span class="k">lt dev install</span> <span class="c"># Caddy + lokale CA + Service einrichten</span>
286
+
287
+ <span class="c"># Einmal pro Projekt (idempotent)</span>
288
+ <span class="k">lt dev init</span> <span class="c"># env-aware patchen + registrieren (idempotent)</span>
289
+
290
+ <span class="c"># Täglich</span>
291
+ <span class="k">lt dev up</span> <span class="c">→ <span class="s">https://svl.localhost</span> · <span class="s">https://api.svl.localhost</span></span>
292
+ <span class="k">lt dev status</span> <span class="a">--all</span> <span class="c"># was läuft gerade? (alle Projekte)</span>
293
+ <span class="k">lt dev down</span> <span class="c"># sauber stoppen + Caddy-Block entfernen</span></pre>
294
+
295
+ <h3>Befehlsübersicht</h3>
296
+ <table>
297
+ <thead><tr><th>Befehl</th><th>Was es tut</th></tr></thead>
298
+ <tbody>
299
+ <tr><td><code>lt dev install</code></td><td>Einmal pro Rechner: Caddy, lokale CA und Hintergrund-Service einrichten.</td></tr>
300
+ <tr><td><code>lt dev init</code></td><td>Einmal pro Projekt: Ports env-aware machen, registrieren, <code>ignoreHTTPSErrors</code> + shard-aware Test-Timeouts injizieren. Idempotent.</td></tr>
301
+ <tr><td><code>lt dev up</code></td><td>API + App hinter Caddy starten: <code>https://&lt;slug&gt;.localhost</code> / <code>api.&lt;slug&gt;.localhost</code>, DB <code>&lt;slug&gt;-local</code>.</td></tr>
302
+ <tr><td><code>lt dev down</code></td><td>Prozesse stoppen, Caddy-Block entfernen, etwaige Test-Stacks abräumen.</td></tr>
303
+ <tr><td><code>lt dev status</code> · <code>--all</code></td><td>URLs, Ports, PIDs, Live-Zustand — fürs aktuelle Projekt oder alle registrierten.</td></tr>
304
+ <tr><td><code>lt dev doctor</code></td><td>Caddy/CA/DNS/Ports prüfen — <span class="badge b-cyan">NEU</span> warnt auch, wenn ein DB-löschendes <code>global-setup</code> die Ticket-/Shard-Test-DBs nicht zurücksetzen würde.</td></tr>
305
+ <tr><td><code>lt dev test</code></td><td>E2E in einem <b>isolierten, parallelen</b> Stack auf dedizierter DB <code>&lt;slug&gt;-test</code> — restfreier Auto-Teardown.</td></tr>
306
+ <tr><td><code>lt dev test --shard N</code></td><td>Suite auf N isolierte Stacks aufteilen (Default&nbsp;2) — lokale CI-Parität, ~2× schneller.</td></tr>
307
+ <tr><td><code>lt dev tunnel</code></td><td>Öffentliche <code>*.trycloudflare.com</code>-URL für ein laufendes Projekt (Demo/Review).</td></tr>
308
+ </tbody>
309
+ </table>
310
+ <div class="note key"><div class="ni">🔌</div><div><b>Nie wieder <code>localhost:3000</code>.</b> Alle URLs kommen von <code>lt dev</code> über die Env-Bridge (<code>.lt-dev/.env</code>) — Playwright, IDE und Skripte ziehen sie automatisch.</div></div>
311
+ </div>
312
+ </section>
313
+
314
+ <!-- ============================ LT TICKET ============================ -->
315
+ <section class="break">
316
+ <div class="page">
317
+ <span class="eyebrow">Baustein 2</span>
318
+ <h2><code style="font-size:.8em">lt ticket</code> — mehrere Tickets gleichzeitig</h2>
319
+ <p class="lead">Ein Repo, beliebig viele Tickets — jedes in einem eigenen <b>git&nbsp;worktree</b> mit eigenem <code>lt dev</code>-Stack. Frisch aus <code>origin/dev</code>, in Sekunden startklar, voneinander komplett unabhängig.</p>
320
+
321
+ <figure>
322
+ <!-- DIAGRAM B: one repo -> N worktrees -> N stacks -->
323
+ <svg viewBox="0 0 920 380" role="img" aria-label="Ein Repository, mehrere Worktrees, jeweils mit eigenem Stack">
324
+ <defs>
325
+ <marker id="arr2" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
326
+ <path d="M0 0 L10 5 L0 10 z" fill="#a78bfa"/>
327
+ </marker>
328
+ <linearGradient id="gRepo" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#312e81"/><stop offset="1" stop-color="#4338ca"/></linearGradient>
329
+ </defs>
330
+ <rect x="0" y="0" width="920" height="380" fill="#ffffff"/>
331
+ <!-- repo -->
332
+ <rect x="40" y="150" width="180" height="90" rx="14" fill="url(#gRepo)"/>
333
+ <text x="130" y="184" text-anchor="middle" fill="#fff" font-size="15" font-weight="800" font-family="sans-serif">svl-sports-system</text>
334
+ <text x="130" y="206" text-anchor="middle" fill="#c7d2fe" font-size="12" font-family="monospace">ein .git (geteilt)</text>
335
+ <text x="130" y="224" text-anchor="middle" fill="#a5b4fc" font-size="11.5" font-family="monospace">branch: dev</text>
336
+ <!-- 3 worktrees + stacks -->
337
+ <g font-family="sans-serif">
338
+ <g>
339
+ <path d="M220 178 C 280 130, 300 110, 360 110" stroke="#a78bfa" stroke-width="2" fill="none" marker-end="url(#arr2)"/>
340
+ <rect x="360" y="78" width="210" height="66" rx="12" fill="#f5f3ff" stroke="#ddd6fe"/>
341
+ <text x="376" y="104" font-size="13.5" font-weight="800" fill="#5b21b6">worktree · svl-2200</text>
342
+ <text x="376" y="124" font-size="11.5" fill="#6d28d9" font-family="monospace">branch feat/DEV-2200</text>
343
+ <path d="M570 111 H 610" stroke="#94a3b8" stroke-width="2" marker-end="url(#arr2)"/>
344
+ <rect x="610" y="78" width="270" height="66" rx="12" fill="#ecfeff" stroke="#a5f3fc"/>
345
+ <text x="626" y="100" font-size="12" fill="#0e7490" font-family="monospace">svl-2200.localhost</text>
346
+ <text x="626" y="118" font-size="12" fill="#0e7490" font-family="monospace">api.svl-2200.localhost</text>
347
+ <text x="626" y="136" font-size="11.5" fill="#475569" font-family="monospace">DB svl-…-2200 · Ports 40xx</text>
348
+ </g>
349
+ <g>
350
+ <path d="M220 195 H 360" stroke="#a78bfa" stroke-width="2" fill="none" marker-end="url(#arr2)"/>
351
+ <rect x="360" y="162" width="210" height="66" rx="12" fill="#f5f3ff" stroke="#ddd6fe"/>
352
+ <text x="376" y="188" font-size="13.5" font-weight="800" fill="#5b21b6">worktree · svl-2201</text>
353
+ <text x="376" y="208" font-size="11.5" fill="#6d28d9" font-family="monospace">branch feat/DEV-2201</text>
354
+ <path d="M570 195 H 610" stroke="#94a3b8" stroke-width="2" marker-end="url(#arr2)"/>
355
+ <rect x="610" y="162" width="270" height="66" rx="12" fill="#ecfeff" stroke="#a5f3fc"/>
356
+ <text x="626" y="184" font-size="12" fill="#0e7490" font-family="monospace">svl-2201.localhost</text>
357
+ <text x="626" y="202" font-size="12" fill="#0e7490" font-family="monospace">api.svl-2201.localhost</text>
358
+ <text x="626" y="220" font-size="11.5" fill="#475569" font-family="monospace">DB svl-…-2201 · Ports 40xx</text>
359
+ </g>
360
+ <g>
361
+ <path d="M220 212 C 280 260, 300 280, 360 280" stroke="#a78bfa" stroke-width="2" fill="none" marker-end="url(#arr2)"/>
362
+ <rect x="360" y="246" width="210" height="66" rx="12" fill="#f5f3ff" stroke="#ddd6fe"/>
363
+ <text x="376" y="272" font-size="13.5" font-weight="800" fill="#5b21b6">worktree · svl-login-fix</text>
364
+ <text x="376" y="292" font-size="11.5" fill="#6d28d9" font-family="monospace">branch feat/login-fix</text>
365
+ <path d="M570 279 H 610" stroke="#94a3b8" stroke-width="2" marker-end="url(#arr2)"/>
366
+ <rect x="610" y="246" width="270" height="66" rx="12" fill="#ecfeff" stroke="#a5f3fc"/>
367
+ <text x="626" y="268" font-size="12" fill="#0e7490" font-family="monospace">svl-login-fix.localhost</text>
368
+ <text x="626" y="286" font-size="12" fill="#0e7490" font-family="monospace">api.svl-login-fix.localhost</text>
369
+ <text x="626" y="304" font-size="11.5" fill="#475569" font-family="monospace">DB svl-…-login-fix · Ports 40xx</text>
370
+ </g>
371
+ </g>
372
+ <text x="460" y="356" text-anchor="middle" font-size="12.5" fill="#64748b" font-family="sans-serif">Ticket-ID auch ohne Ticket möglich: ein freier Feature-Name funktioniert genauso (z.&nbsp;B. „login-fix").</text>
373
+ </svg>
374
+ <figcaption>Ein Repo → mehrere Worktrees (geteiltes <code>.git</code>, sofort) → je ein vollständig isolierter Stack. Ordnername = URL = DB = Ticket — du weißt immer, wo du bist.</figcaption>
375
+ </figure>
376
+
377
+ <h3>So einfach geht's</h3>
378
+ <pre><span class="k">lt ticket start</span> <span class="a">DEV-2200</span> <span class="c"># fetch + worktree aus origin/dev + install + lt dev up</span>
379
+ <span class="c">→ <span class="s">https://svl-2200.localhost</span> · DB svl-…-2200 (leer)</span>
380
+ <span class="k">lt ticket start</span> <span class="a">login-fix</span> <span class="c"># kein Ticket? freier Name → svl-login-fix.localhost</span>
381
+ <span class="k">lt ticket start</span> <span class="a">DEV-2200 --as cof</span> <span class="c"># Kurzname überschreiben; --branch / --base ebenso</span>
382
+
383
+ <span class="k">lt ticket list</span> <span class="c"># Dashboard: alle Tickets + URLs + Branch + Status + DB</span>
384
+ <span class="k">lt ticket switch</span> <span class="a">2200</span> <span class="c"># Pfad zeigen + im Editor öffnen</span>
385
+ <span class="k">lt ticket test</span> <span class="a">2200 --shard 2</span> <span class="c"># E2E im isolierten Ticket-Stack/-DB</span>
386
+ <span class="k">lt ticket stop</span> <span class="a">2200 --drop-db</span> <span class="c"># down + worktree entfernen (Branch bleibt); --drop-db löscht DBs</span></pre>
387
+
388
+ <div class="grid g3" style="margin-top:8px">
389
+ <div class="card"><div class="ico" style="background:linear-gradient(135deg,#6366f1,#8b5cf6)">🎯</div>
390
+ <h3>Eigene Identität, überall</h3>
391
+ <p class="small">Jedes Ticket bekommt <code>&lt;slug&gt;-&lt;id&gt;</code> in URL, DB, Ports, Caddy-Block, Ordnername. Verwechslung ausgeschlossen.</p></div>
392
+ <div class="card"><div class="ico" style="background:linear-gradient(135deg,#06b6d4,#0e7490)">🌱</div>
393
+ <h3>Immer frisch aus dev</h3>
394
+ <p class="small">Jeder Start macht <code>git fetch</code> und zweigt von <code>origin/dev</code> ab — alle Tickets unabhängig. <code>--base</code> für Ausnahmen.</p></div>
395
+ <div class="card"><div class="ico" style="background:linear-gradient(135deg,#10b981,#047857)">⚡</div>
396
+ <h3>0&nbsp;s &amp; leicht</h3>
397
+ <p class="small">Worktree teilt das <code>.git</code> — kein Re-Clone. Ein <code>git fetch</code> aktualisiert alle. pnpm hardlinkt aus dem Store.</p></div>
398
+ </div>
399
+ </div>
400
+ </section>
401
+
402
+ <!-- ============================ WORKFLOW VISUELL ============================ -->
403
+ <section class="alt">
404
+ <div class="page">
405
+ <span class="eyebrow">Ablauf</span>
406
+ <h2>Ein Ticket — von „los" bis „weg"</h2>
407
+ <figure>
408
+ <!-- DIAGRAM C: lifecycle -->
409
+ <svg viewBox="0 0 920 200" role="img" aria-label="Ticket-Lebenszyklus: start, arbeiten, testen, stop">
410
+ <defs>
411
+ <marker id="arr3" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse"><path d="M0 0 L10 5 L0 10 z" fill="#cbd5e1"/></marker>
412
+ </defs>
413
+ <rect width="920" height="200" fill="#f8fafc"/>
414
+ <g font-family="sans-serif" text-anchor="middle">
415
+ <!-- 1 start -->
416
+ <circle cx="120" cy="80" r="40" fill="#eef2ff" stroke="#c7d2fe"/>
417
+ <text x="120" y="74" font-size="22">🚀</text>
418
+ <text x="120" y="100" font-size="11.5" font-weight="700" fill="#4338ca">start</text>
419
+ <text x="120" y="150" font-size="12" fill="#334155" font-weight="700">lt ticket start</text>
420
+ <text x="120" y="168" font-size="11" fill="#64748b">Worktree + Stack</text>
421
+ <line x1="168" y1="80" x2="232" y2="80" stroke="#cbd5e1" stroke-width="3" marker-end="url(#arr3)"/>
422
+ <!-- 2 develop -->
423
+ <circle cx="280" cy="80" r="40" fill="#ecfeff" stroke="#a5f3fc"/>
424
+ <text x="280" y="74" font-size="22">💻</text>
425
+ <text x="280" y="100" font-size="11.5" font-weight="700" fill="#0e7490">entwickeln</text>
426
+ <text x="280" y="150" font-size="12" fill="#334155" font-weight="700">Browser + Claude</text>
427
+ <text x="280" y="168" font-size="11" fill="#64748b">eigene URL, eigene Session</text>
428
+ <line x1="328" y1="80" x2="392" y2="80" stroke="#cbd5e1" stroke-width="3" marker-end="url(#arr3)"/>
429
+ <!-- 3 test -->
430
+ <circle cx="440" cy="80" r="40" fill="#f5f3ff" stroke="#ddd6fe"/>
431
+ <text x="440" y="74" font-size="22">🧪</text>
432
+ <text x="440" y="100" font-size="11.5" font-weight="700" fill="#6d28d9">testen</text>
433
+ <text x="440" y="150" font-size="12" fill="#334155" font-weight="700">lt ticket test</text>
434
+ <text x="440" y="168" font-size="11" fill="#64748b">isolierte Test-DB</text>
435
+ <line x1="488" y1="80" x2="552" y2="80" stroke="#cbd5e1" stroke-width="3" marker-end="url(#arr3)"/>
436
+ <!-- 4 commit/push -->
437
+ <circle cx="600" cy="80" r="40" fill="#ecfdf5" stroke="#a7f3d0"/>
438
+ <text x="600" y="74" font-size="22">⬆️</text>
439
+ <text x="600" y="100" font-size="11.5" font-weight="700" fill="#047857">abliefern</text>
440
+ <text x="600" y="150" font-size="11" font-weight="700" fill="#334155">/lt-dev:git:ship</text>
441
+ <text x="600" y="168" font-size="11" fill="#64748b">rebase → MR → merge</text>
442
+ <line x1="648" y1="80" x2="712" y2="80" stroke="#cbd5e1" stroke-width="3" marker-end="url(#arr3)"/>
443
+ <!-- 5 stop -->
444
+ <circle cx="760" cy="80" r="40" fill="#fff1f2" stroke="#fecdd3"/>
445
+ <text x="760" y="74" font-size="22">🧹</text>
446
+ <text x="760" y="100" font-size="11.5" font-weight="700" fill="#be123c">stop</text>
447
+ <text x="760" y="150" font-size="12" fill="#334155" font-weight="700">lt ticket stop</text>
448
+ <text x="760" y="168" font-size="11" fill="#64748b">restfrei aufgeräumt</text>
449
+ </g>
450
+ </svg>
451
+ <figcaption>Vor dem Aufräumen warnt <code>lt ticket stop</code>, falls noch <b>uncommittete</b> oder <b>ungepushte</b> Arbeit existiert — nichts geht versehentlich verloren.</figcaption>
452
+ </figure>
453
+
454
+ <div class="note key"><div class="ni">🚢</div><div><b>Ein Befehl bis in <code>dev</code> — der Claude-Command <code>/lt-dev:git:ship</code>.</b> Bringt deinen fertig entwickelten Ticket-Branch <b>autonom</b> nach <code>dev</code>: <code>check</code>-Skript grün → committen → auf <code>dev</code> <b>rebasen</b> → testen → <b>Merge Request</b> (Squash + Auto-Merge) → wartet auf die CI-Pipeline (<b>Auto-Retry</b> bei Fehlschlag) → <b>squash-merged</b> → löscht den Branch. Die automatisierte <b>Schlussklammer</b> zu <code>/lt-dev:take-ticket</code> — genau der Ablauf, den du sonst von Hand machst. Flags: <code>--base=&lt;branch&gt;</code>, <code>--no-squash</code>, <code>--keep-branch</code>, <code>--max-pipeline-retries=&lt;n&gt;</code>.</div></div>
455
+
456
+ <h3>Ein Tag mit drei Tickets — gleichzeitig</h3>
457
+ <div class="steps">
458
+ <div class="step"><div class="n"></div><div><b>Morgens:</b> <code>lt ticket start DEV-2200</code>, <code>lt ticket start DEV-2201</code>, <code>lt ticket start login-fix</code> — drei Tabs, drei VS-Code-Fenster, drei Claude-Sessions. Jede Umgebung ist sofort im Browser unter ihrer eigenen URL.</div></div>
459
+ <div class="step"><div class="n"></div><div><b>Mittags:</b> Review-Feedback zu 2201 kommt rein — du wechselst per <code>lt ticket switch 2201</code>, fixst, <code>lt ticket test 2201</code> läuft <i>parallel</i> während 2200 weiter im Browser offen ist.</div></div>
460
+ <div class="step"><div class="n"></div><div><b>Nachmittags:</b> 2200 ist fertig → committen, pushen, MR. <code>lt ticket stop 2200 --drop-db</code> räumt restlos auf. 2201 und login-fix laufen ungestört weiter.</div></div>
461
+ <div class="step"><div class="n"></div><div><b>Überblick jederzeit:</b> <code>lt ticket list</code> zeigt alle Umgebungen mit URLs, Branch, Status und DB — du verlierst nie den Faden.</div></div>
462
+ </div>
463
+ </div>
464
+ </section>
465
+
466
+ <!-- ============================ OHNE WORKTREE / TAKE-TICKET ============================ -->
467
+ <section>
468
+ <div class="page">
469
+ <span class="eyebrow">Auch ohne neues Verzeichnis</span>
470
+ <h2>Schnell mal ein Ticket im aktuellen Checkout</h2>
471
+ <p class="lead">Nicht jedes Ticket braucht einen eigenen Worktree. Willst du <i>im aktuellen</i> Projektverzeichnis ein Ticket angehen — ohne neuen Ordner — startest du es direkt mit dem Claude-Command <code>/lt-dev:take-ticket</code>.</p>
472
+ <div class="grid g2" style="margin-top:8px">
473
+ <div class="card" style="border-color:#c7d2fe; background:#fbfbff">
474
+ <span class="badge b-indigo">PARALLEL</span>
475
+ <h3 style="margin-top:8px"><code>lt ticket start</code></h3>
476
+ <p class="small" style="margin-top:6px">Eigener Worktree + eigener Stack. <b>Wenn du mehrere Tickets gleichzeitig</b> bearbeiten, im Browser vergleichen oder parallel testen willst. Volle Isolation, ein Befehl.</p>
477
+ </div>
478
+ <div class="card" style="border-color:#a5f3fc; background:#fbffff">
479
+ <span class="badge b-cyan">IN-PLACE</span>
480
+ <h3 style="margin-top:8px"><code>/lt-dev:take-ticket</code></h3>
481
+ <p class="small" style="margin-top:6px">Im <b>aktuellen</b> Verzeichnis &amp; Branch — kein neuer Ordner. Claude holt sich Ticket-Kontext (Linear, Figma, Flows), plant und setzt um. Ideal für <b>ein</b> Ticket nacheinander, ohne Worktree-Overhead.</p>
482
+ </div>
483
+ </div>
484
+ <div class="note tip"><div class="ni">🧭</div><div><b>Faustregel:</b> Mehrere Tickets gleichzeitig oder im Browser nebeneinander testen → <code>lt ticket</code>. Ein Ticket fokussiert im aktuellen Checkout → <code>/lt-dev:take-ticket</code>. Beide nutzen denselben isolierten <code>lt dev</code>-Unterbau.</div></div>
485
+ </div>
486
+ </section>
487
+
488
+ <!-- ============================ PARALLELE TESTS ============================ -->
489
+ <section class="alt break">
490
+ <div class="page">
491
+ <span class="eyebrow">Tests</span>
492
+ <h2>Parallele E2E — pro Ticket <i>und</i> per Sharding</h2>
493
+ <p class="lead">Jeder Ticket-Test fährt seinen <b>eigenen</b> Test-Stack hoch — eigene Test-DB <code>&lt;base&gt;-&lt;id&gt;-test</code>, eigene Ports. Ein Registry-Lock garantiert atomare Port-Vergabe, sodass selbst zwei <i>gleichzeitig</i> gestartete Test-Läufe nie kollidieren.</p>
494
+ <figure>
495
+ <!-- DIAGRAM D: parallel tests -->
496
+ <svg viewBox="0 0 920 250" role="img" aria-label="Zwei Ticket-Test-Stacks parallel mit eigenen DBs und Ports">
497
+ <rect width="920" height="250" fill="#ffffff"/>
498
+ <g font-family="sans-serif">
499
+ <rect x="60" y="40" width="370" height="170" rx="16" fill="#f5f3ff" stroke="#ddd6fe"/>
500
+ <text x="84" y="72" font-size="15" font-weight="800" fill="#5b21b6">Ticket 2200 · Test-Stack</text>
501
+ <rect x="84" y="92" width="150" height="26" rx="8" fill="#fff" stroke="#ddd6fe"/><text x="159" y="110" text-anchor="middle" font-size="12" fill="#6d28d9" font-family="monospace">api · Port 4500</text>
502
+ <rect x="248" y="92" width="150" height="26" rx="8" fill="#fff" stroke="#ddd6fe"/><text x="323" y="110" text-anchor="middle" font-size="12" fill="#6d28d9" font-family="monospace">app · Port 4501</text>
503
+ <rect x="84" y="128" width="314" height="26" rx="8" fill="#ede9fe"/><text x="241" y="146" text-anchor="middle" font-size="12" fill="#5b21b6" font-family="monospace">DB svl-…-2200-test (eigener Reset)</text>
504
+ <rect x="84" y="166" width="314" height="26" rx="8" fill="#ecfdf5"/><text x="241" y="184" text-anchor="middle" font-size="12" font-weight="700" fill="#047857">✓ 2 passed</text>
505
+
506
+ <rect x="490" y="40" width="370" height="170" rx="16" fill="#ecfeff" stroke="#a5f3fc"/>
507
+ <text x="514" y="72" font-size="15" font-weight="800" fill="#0e7490">Ticket 2201 · Test-Stack</text>
508
+ <rect x="514" y="92" width="150" height="26" rx="8" fill="#fff" stroke="#a5f3fc"/><text x="589" y="110" text-anchor="middle" font-size="12" fill="#0e7490" font-family="monospace">api · Port 4502</text>
509
+ <rect x="678" y="92" width="150" height="26" rx="8" fill="#fff" stroke="#a5f3fc"/><text x="753" y="110" text-anchor="middle" font-size="12" fill="#0e7490" font-family="monospace">app · Port 4503</text>
510
+ <rect x="514" y="128" width="314" height="26" rx="8" fill="#cffafe"/><text x="671" y="146" text-anchor="middle" font-size="12" fill="#0e7490" font-family="monospace">DB svl-…-2201-test (eigener Reset)</text>
511
+ <rect x="514" y="166" width="314" height="26" rx="8" fill="#ecfdf5"/><text x="671" y="184" text-anchor="middle" font-size="12" font-weight="700" fill="#047857">✓ 2 passed</text>
512
+ </g>
513
+ <text x="460" y="234" text-anchor="middle" font-size="12.5" fill="#64748b" font-family="sans-serif">Gleichzeitig gebunden · distinkte Ports 4500/4501 vs. 4502/4503 · keine Kollision (live verifiziert)</text>
514
+ </svg>
515
+ <figcaption>Zwei Ticket-Test-Suites liefen gleichzeitig auf distinkten Ports und eigenen Test-DBs — beide grün, null Interferenz.</figcaption>
516
+ </figure>
517
+ <div class="grid g2">
518
+ <div class="card"><h3>Sharding <span class="badge b-indigo">in einem Stack</span></h3>
519
+ <p class="small"><code>lt dev test --shard N</code> teilt die Suite auf N isolierte Stacks (Default&nbsp;2) — die lokale Entsprechung der CI-Matrix, ~2× schneller. Die Timeouts werden nur unter Shard-Last gelockert (CI bleibt schnell).</p></div>
520
+ <div class="card"><h3>Pro Ticket <span class="badge b-cyan">über Worktrees</span></h3>
521
+ <p class="small"><code>lt ticket test &lt;id&gt;</code> testet im eigenen Ticket-Stack mit eigener Test-DB. Mehrere Tickets können <b>gleichzeitig</b> testen — atomare Port-Vergabe per Lock verhindert jede Kollision.</p></div>
522
+ </div>
523
+ <div class="note warn"><div class="ni">⚠️</div><div><b>Voraussetzung für DB-Reset:</b> Projekte mit DB-löschendem <code>global-setup</code> müssen die Allow-List ticket-/shard-sicher halten (<code>/^&lt;base&gt;-(?:[a-z0-9-]+-)?test(?:-\d+)?$/</code>). <code>lt dev doctor</code> warnt, falls nicht — neue Projekte aus dem Starter brauchen hier nichts.</div></div>
524
+ </div>
525
+ </section>
526
+
527
+ <!-- ============================ SICHERHEIT & KOMFORT ============================ -->
528
+ <section>
529
+ <div class="page">
530
+ <span class="eyebrow">Eingebaut</span>
531
+ <h2>Sicherheit &amp; Komfort, ohne dass du dran denkst</h2>
532
+ <div class="grid g2">
533
+ <div class="card"><div class="ico" style="background:linear-gradient(135deg,#f43f5e,#be123c)">🛡️</div>
534
+ <h3>Kein versehentlicher Datenverlust</h3>
535
+ <p class="small"><code>lt ticket stop</code> verweigert das Entfernen, solange <b>uncommittete</b> oder <b>ungepushte</b> Arbeit existiert — mit klarer Auflistung. <code>--force</code> überschreibt bewusst. Generierte Dateien (<code>.nuxtrc</code> &amp; Co.) blockieren nicht.</p></div>
536
+ <div class="card"><div class="ico" style="background:linear-gradient(135deg,#f59e0b,#b45309)">🩺</div>
537
+ <h3>Selbstdiagnose</h3>
538
+ <p class="small"><code>lt dev doctor</code> prüft Caddy, CA, DNS, Ports — und warnt, wenn ein <code>global-setup</code> Ticket-Test-DBs nicht zurücksetzen würde, samt exaktem Fix.</p></div>
539
+ <div class="card"><div class="ico" style="background:linear-gradient(135deg,#6366f1,#4338ca)">🤖</div>
540
+ <h3>Claude weiß Bescheid</h3>
541
+ <p class="small">Jede Claude-Session in einem Ticket-Worktree erkennt am <code>.lt-dev/ticket</code>-Marker automatisch ihr Ticket — und sieht jede Runde Ticket-ID, URLs und DB. Keine getrackte Datei wird verändert.</p></div>
542
+ <div class="card"><div class="ico" style="background:linear-gradient(135deg,#10b981,#047857)">🧹</div>
543
+ <h3>Restfreier Teardown</h3>
544
+ <p class="small">Prozesse, Caddy-Block, Session, Registry-Eintrag, Ports — alles wird sauber zurückgegeben. <code>lt ticket stop</code> ohne ID räumt sogar das <i>aktuelle</i> Worktree auf.</p></div>
545
+ </div>
546
+ </div>
547
+ </section>
548
+
549
+ <!-- ============================ CHEAT SHEET ============================ -->
550
+ <section class="alt break">
551
+ <div class="page">
552
+ <span class="eyebrow">Spickzettel</span>
553
+ <h2>Alles auf einen Blick</h2>
554
+ <div class="grid g2">
555
+ <div>
556
+ <h3>Setup &amp; Projekt</h3>
557
+ <pre><span class="k">lt dev install</span> <span class="c"># 1× pro Rechner</span>
558
+ <span class="k">lt dev init</span> <span class="c"># 1× pro Projekt</span>
559
+ <span class="k">lt dev up</span> / <span class="k">down</span> <span class="c"># Stack an/aus</span>
560
+ <span class="k">lt dev status</span> <span class="a">--all</span> <span class="c"># Überblick</span>
561
+ <span class="k">lt dev doctor</span> <span class="c"># Diagnose</span>
562
+ <span class="k">lt dev test</span> <span class="a">--shard 2</span> <span class="c"># schnelle E2E</span>
563
+ <span class="k">lt dev tunnel</span> <span class="c"># öffentliche URL</span></pre>
564
+ </div>
565
+ <div>
566
+ <h3>Tickets parallel</h3>
567
+ <pre><span class="k">lt ticket start</span> <span class="a">DEV-2200</span> <span class="c"># neues Ticket-Env</span>
568
+ <span class="k">lt ticket start</span> <span class="a">login-fix</span> <span class="c"># freier Name</span>
569
+ <span class="k">lt ticket list</span> <span class="c"># Dashboard</span>
570
+ <span class="k">lt ticket switch</span> <span class="a">2200</span> <span class="c"># öffnen</span>
571
+ <span class="k">lt ticket test</span> <span class="a">2200</span> <span class="c"># isolierte E2E</span>
572
+ <span class="k">lt ticket stop</span> <span class="a">2200</span> <span class="c"># aufräumen (Branch bleibt)</span>
573
+ <span class="m">/lt-dev:take-ticket</span> <span class="c"># Ticket im aktuellen Checkout</span>
574
+ <span class="m">/lt-dev:git:ship</span> <span class="c"># fertig → autonom nach dev</span></pre>
575
+ </div>
576
+ </div>
577
+ <div class="note key"><div class="ni">🚦</div><div><b>In 3 Schritten startklar:</b> <code>lt dev install</code> (einmalig) → im Projekt <code>lt dev init</code> → <code>lt ticket start &lt;ticket&gt;</code>. Fertig — die URL steht im Terminal und in <code>lt ticket list</code>.</div></div>
578
+ </div>
579
+ </section>
580
+
581
+ <!-- ============================ WARUM SCHNELLER ============================ -->
582
+ <section>
583
+ <div class="page">
584
+ <span class="eyebrow">Der Gewinn</span>
585
+ <h2>Warum dich das spürbar schneller macht</h2>
586
+ <div class="grid g3">
587
+ <div class="card"><h3>🧠 Kein Kontext-Verlust</h3><p class="small">Jedes Ticket behält seinen eigenen, laufenden Zustand — Server, DB, Browser-Tab, Claude-Session. Du springst zwischen Tickets, ohne irgendetwas neu aufzusetzen.</p></div>
588
+ <div class="card"><h3>⏱️ Kein Warten</h3><p class="small">Worktrees entstehen in 0&nbsp;s, Stacks starten in Sekunden, Tests laufen parallel statt nacheinander. Review-Feedback fixst du sofort, ohne dein Hauptticket zu unterbrechen.</p></div>
589
+ <div class="card"><h3>🛟 Kein Risiko</h3><p class="small">Volle Isolation + Schutz vor Datenverlust + Selbstdiagnose. Du experimentierst frei — die Werkzeuge fangen die Fehler ab, bevor sie wehtun.</p></div>
590
+ </div>
591
+ <div class="note tip" style="margin-top:22px"><div class="ni">✨</div><div><b>Probier es heute:</b> Such dir zwei offene Tickets und starte sie parallel mit <code>lt ticket start</code>. Du wirst nicht mehr zurückwollen.</div></div>
592
+ </div>
593
+ </section>
594
+
595
+ <footer class="footer">
596
+ <div class="page">
597
+ <span class="brand">lenne.Tech</span> · <code>lt dev</code> × <code>lt ticket</code> — Parallel entwickeln ohne Reibung.<br>
598
+ Lebendes Dokument in der lt CLI unter <code>docs/lt-dev-ticket-workflow.html</code> — Beiträge &amp; Erweiterungen willkommen.
599
+ </div>
600
+ </footer>
601
+
602
+ </body>
603
+ </html>