@eltonssouza/development-utility-kit 1.0.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.
Files changed (137) hide show
  1. package/.claude/agents/analyst.md +198 -0
  2. package/.claude/agents/backend-developer.md +126 -0
  3. package/.claude/agents/brain-keeper.md +229 -0
  4. package/.claude/agents/code-reviewer.md +181 -0
  5. package/.claude/agents/database-engineer.md +94 -0
  6. package/.claude/agents/devops-engineer.md +141 -0
  7. package/.claude/agents/frontend-developer.md +97 -0
  8. package/.claude/agents/gate-keeper.md +118 -0
  9. package/.claude/agents/migrator.md +291 -0
  10. package/.claude/agents/mobile-developer.md +80 -0
  11. package/.claude/agents/n8n-specialist.md +94 -0
  12. package/.claude/agents/product-owner.md +115 -0
  13. package/.claude/agents/qa-engineer.md +232 -0
  14. package/.claude/agents/release-engineer.md +204 -0
  15. package/.claude/agents/scaffold.md +87 -0
  16. package/.claude/agents/security-engineer.md +199 -0
  17. package/.claude/agents/sprint-runner.md +44 -0
  18. package/.claude/agents/stack-resolver.md +84 -0
  19. package/.claude/agents/tech-lead.md +182 -0
  20. package/.claude/agents/update-template.md +54 -0
  21. package/.claude/agents/ux-designer.md +118 -0
  22. package/.claude/settings.json +44 -0
  23. package/.claude/skills/README.md +332 -0
  24. package/.claude/skills/active-project/SKILL.md +129 -0
  25. package/.claude/skills/api-integration-test/SKILL.md +64 -0
  26. package/.claude/skills/auto-test-guard/SKILL.md +237 -0
  27. package/.claude/skills/auto-test-guard/resources/backend-tests.md +20 -0
  28. package/.claude/skills/auto-test-guard/resources/e2e-tests.md +24 -0
  29. package/.claude/skills/auto-test-guard/resources/execution-report.md +49 -0
  30. package/.claude/skills/auto-test-guard/resources/frontend-tests.md +18 -0
  31. package/.claude/skills/auto-test-guard/resources/initial-setup.md +108 -0
  32. package/.claude/skills/auto-test-guard/resources/run-suite.md +48 -0
  33. package/.claude/skills/auto-test-guard/resources/senior-gate.md +19 -0
  34. package/.claude/skills/brain-keeper/SKILL.md +60 -0
  35. package/.claude/skills/brain-keeper/obsidian/app.json +9 -0
  36. package/.claude/skills/brain-keeper/obsidian/appearance.json +4 -0
  37. package/.claude/skills/brain-keeper/obsidian/core-plugins.json +20 -0
  38. package/.claude/skills/brain-keeper/obsidian/daily-notes.json +5 -0
  39. package/.claude/skills/brain-keeper/obsidian/graph.json +32 -0
  40. package/.claude/skills/brain-keeper/obsidian/snippets/folder-colors.css +90 -0
  41. package/.claude/skills/brain-keeper/obsidian/templates.json +5 -0
  42. package/.claude/skills/brain-keeper/templates/README.md +51 -0
  43. package/.claude/skills/brain-keeper/templates/adr.md +40 -0
  44. package/.claude/skills/brain-keeper/templates/bug.md +35 -0
  45. package/.claude/skills/brain-keeper/templates/daily.md +38 -0
  46. package/.claude/skills/brain-keeper/templates/feature.md +62 -0
  47. package/.claude/skills/brain-keeper/templates/meeting.md +34 -0
  48. package/.claude/skills/brain-keeper/templates/tech-debt.md +21 -0
  49. package/.claude/skills/caveman/SKILL.md +187 -0
  50. package/.claude/skills/create-stack-pack/SKILL.md +281 -0
  51. package/.claude/skills/grill-me/SKILL.md +79 -0
  52. package/.claude/skills/honcho-memory/SKILL.md +207 -0
  53. package/.claude/skills/honcho-memory/docs/api-endpoints-verified.md +75 -0
  54. package/.claude/skills/honcho-memory/hooks/on-prompt-submit.js +221 -0
  55. package/.claude/skills/honcho-memory/hooks/on-stop.js +193 -0
  56. package/.claude/skills/honcho-memory/lib/honcho-client.js +363 -0
  57. package/.claude/skills/honcho-memory/lib/memory-injector.js +93 -0
  58. package/.claude/skills/honcho-memory/package.json +32 -0
  59. package/.claude/skills/honcho-memory/scripts/cli.js +370 -0
  60. package/.claude/skills/honcho-memory/scripts/setup.js +109 -0
  61. package/.claude/skills/honcho-memory/tests/t001-api-endpoints-verified.test.js +89 -0
  62. package/.claude/skills/honcho-memory/tests/t002-structure.test.js +97 -0
  63. package/.claude/skills/honcho-memory/tests/t003-honcho-client.test.js +162 -0
  64. package/.claude/skills/honcho-memory/tests/t004-soft-delete.test.js +259 -0
  65. package/.claude/skills/honcho-memory/tests/t005-memory-injector.test.js +175 -0
  66. package/.claude/skills/honcho-memory/tests/t006-on-prompt-submit.test.js +215 -0
  67. package/.claude/skills/honcho-memory/tests/t007-on-stop.test.js +165 -0
  68. package/.claude/skills/honcho-memory/tests/t008-cli.test.js +214 -0
  69. package/.claude/skills/honcho-memory/tests/t009-setup.test.js +232 -0
  70. package/.claude/skills/honcho-memory/tests/t010-skill-md.test.js +114 -0
  71. package/.claude/skills/honcho-memory/tests/t011-settings-hooks.test.js +105 -0
  72. package/.claude/skills/honcho-memory/tests/t012-docs-update.test.js +106 -0
  73. package/.claude/skills/honcho-memory/tests/t013-smoke-e2e.test.js +90 -0
  74. package/.claude/skills/pair-debug/SKILL.md +288 -0
  75. package/.claude/skills/prd-ready-check/SKILL.md +58 -0
  76. package/.claude/skills/project-manager/SKILL.md +167 -0
  77. package/.claude/skills/quality-standards/SKILL.md +201 -0
  78. package/.claude/skills/quick-feature/SKILL.md +264 -0
  79. package/.claude/skills/run-sprint/SKILL.md +342 -0
  80. package/.claude/skills/scaffold/SKILL.md +58 -0
  81. package/.claude/skills/stack-discovery/SKILL.md +159 -0
  82. package/.claude/skills/test-coverage-auditor/SKILL.md +59 -0
  83. package/.claude/skills/to-issues/SKILL.md +163 -0
  84. package/.claude/skills/to-prd/SKILL.md +130 -0
  85. package/.claude/skills/update-template/SKILL.md +254 -0
  86. package/.claude/stacks/CODEOWNERS +30 -0
  87. package/.claude/stacks/README.md +88 -0
  88. package/.claude/stacks/_template.md +116 -0
  89. package/.claude/stacks/java/spring-boot-3.md +376 -0
  90. package/.claude/stacks/java/spring-boot-4.md +438 -0
  91. package/.claude/stacks/typescript/angular-18.md +420 -0
  92. package/.claude/stacks/typescript/angular-19.md +397 -0
  93. package/.claude/stacks/typescript/angular-21.md +494 -0
  94. package/CLAUDE.md +453 -0
  95. package/README.md +391 -0
  96. package/bin/cli.js +773 -0
  97. package/bin/lib/backup.js +62 -0
  98. package/bin/lib/detect-stack.js +476 -0
  99. package/bin/lib/help.js +233 -0
  100. package/bin/lib/identity.js +108 -0
  101. package/bin/lib/local-dir.js +69 -0
  102. package/bin/lib/manifest.js +236 -0
  103. package/bin/lib/sync-all.js +394 -0
  104. package/bin/lib/version-check.js +398 -0
  105. package/dashboard/db.js +199 -0
  106. package/dashboard/package.json +22 -0
  107. package/dashboard/public/app.js +709 -0
  108. package/dashboard/public/content/docs/agents-reference.en.md +911 -0
  109. package/dashboard/public/content/docs/architecture-overview.en.md +260 -0
  110. package/dashboard/public/content/docs/autonomy-matrix.en.md +186 -0
  111. package/dashboard/public/content/docs/git-flow.en.md +525 -0
  112. package/dashboard/public/content/docs/honcho-memory.en.md +394 -0
  113. package/dashboard/public/content/docs/hooks-reference.en.md +420 -0
  114. package/dashboard/public/content/docs/pipeline.en.md +400 -0
  115. package/dashboard/public/content/docs/quality-gate.en.md +315 -0
  116. package/dashboard/public/content/docs/skills-reference.en.md +500 -0
  117. package/dashboard/public/content/docs/stack-rules.en.md +362 -0
  118. package/dashboard/public/content/docs/troubleshooting.en.md +637 -0
  119. package/dashboard/public/content/manifest.json +102 -0
  120. package/dashboard/public/content/manual/backend.en.md +1138 -0
  121. package/dashboard/public/content/manual/existing-project.en.md +831 -0
  122. package/dashboard/public/content/manual/frontend.en.md +1065 -0
  123. package/dashboard/public/content/manual/fullstack.en.md +1508 -0
  124. package/dashboard/public/content/manual/mobile.en.md +866 -0
  125. package/dashboard/public/index.html +108 -0
  126. package/dashboard/public/style.css +610 -0
  127. package/dashboard/public/vendor/marked.min.js +69 -0
  128. package/dashboard/rtk.js +143 -0
  129. package/dashboard/server-app.js +403 -0
  130. package/dashboard/server.js +104 -0
  131. package/dashboard/test/sprint1.test.js +406 -0
  132. package/dashboard/test/sprint2.test.js +571 -0
  133. package/dashboard/test/sprint3.test.js +560 -0
  134. package/package.json +33 -0
  135. package/scripts/hooks/subagent-telemetry.sh +14 -0
  136. package/scripts/hooks/telemetry-writer.js +250 -0
  137. package/scripts/latest-versions.json +56 -0
@@ -0,0 +1,108 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>development-utility-kit dashboard</title>
7
+ <link rel="stylesheet" href="style.css" />
8
+ <script src="https://cdn.jsdelivr.net/npm/chart.js@4/dist/chart.umd.min.js"></script>
9
+ <script
10
+ src="https://cdn.jsdelivr.net/npm/marked@15/marked.min.js"
11
+ onerror="(function(){var s=document.createElement('script');s.src='vendor/marked.min.js';document.head.appendChild(s);})()"
12
+ ></script>
13
+ </head>
14
+ <body>
15
+
16
+ <header class="app-header">
17
+ <h1>development-utility-kit</h1>
18
+ <span class="badge">dashboard</span>
19
+ <span class="badge" id="last-updated">loading…</span>
20
+
21
+ <nav class="tab-nav" role="tablist">
22
+ <button class="tab-btn active" data-tab="dashboard" role="tab" aria-selected="true">Dashboard</button>
23
+ <button class="tab-btn" data-tab="manual" role="tab" aria-selected="false">Manual</button>
24
+ <button class="tab-btn" data-tab="docs" role="tab" aria-selected="false">Tech Docs</button>
25
+ </nav>
26
+
27
+ </header>
28
+
29
+ <!-- Panel: Dashboard (existing telemetry) -->
30
+ <section id="panel-dashboard" class="tab-panel active" role="tabpanel">
31
+ <main class="grid">
32
+
33
+ <!-- Card: Projects -->
34
+ <section class="card" id="projects-card">
35
+ <h2 class="card-title">Projects (last 30 days)</h2>
36
+ <ul class="project-list" id="project-list">
37
+ <li class="empty-state">Loading…</li>
38
+ </ul>
39
+ </section>
40
+
41
+ <!-- Card: Models -->
42
+ <section class="card" id="models-card">
43
+ <h2 class="card-title">Model Breakdown</h2>
44
+ <div class="chart-wrap">
45
+ <canvas id="models-chart"></canvas>
46
+ </div>
47
+ </section>
48
+
49
+ <!-- Card: RTK Token Savings -->
50
+ <section class="card" id="rtk-card">
51
+ <h2 class="card-title">RTK Token Savings</h2>
52
+ <div class="rtk-summary" id="rtk-summary">
53
+ <div class="rtk-stat">
54
+ <span class="value" id="rtk-tokens">—</span>
55
+ <span class="label">tokens saved</span>
56
+ </div>
57
+ <div class="rtk-stat">
58
+ <span class="value" id="rtk-pct">—</span>
59
+ <span class="label">savings %</span>
60
+ </div>
61
+ </div>
62
+ <div class="chart-wrap">
63
+ <canvas id="rtk-chart"></canvas>
64
+ </div>
65
+ </section>
66
+
67
+ </main>
68
+ </section>
69
+
70
+ <!-- Panel: Manual -->
71
+ <section id="panel-manual" class="tab-panel" role="tabpanel" hidden>
72
+ <div class="panel-layout">
73
+ <aside class="toc-sidebar" id="toc-manual" aria-label="Table of contents"></aside>
74
+ <div class="panel-content">
75
+ <div class="scenario-selector" id="manual-scenario-selector">
76
+ <!-- Scenario buttons rendered by app.js from manifest -->
77
+ </div>
78
+ <div id="translation-banner-manual" class="translation-banner" hidden>
79
+ </div>
80
+ <div class="content-body" id="manual-content-body">
81
+ <p class="empty-state">Select a scenario above.</p>
82
+ </div>
83
+ </div>
84
+ </div>
85
+ </section>
86
+
87
+ <!-- Panel: Tech Docs -->
88
+ <section id="panel-docs" class="tab-panel" role="tabpanel" hidden>
89
+ <div class="panel-layout">
90
+ <aside class="toc-sidebar" id="toc-docs" aria-label="Table of contents"></aside>
91
+ <div class="panel-content">
92
+ <div id="translation-banner-docs" class="translation-banner" hidden>
93
+ </div>
94
+ <div class="content-body" id="docs-content-body">
95
+ <p class="empty-state">Select a section.</p>
96
+ </div>
97
+ </div>
98
+ </div>
99
+ </section>
100
+
101
+ <footer class="status-bar">
102
+ <span><span class="dot"></span>live — polling every 5 s</span>
103
+ <span id="status-msg">connecting…</span>
104
+ </footer>
105
+
106
+ <script src="app.js"></script>
107
+ </body>
108
+ </html>
@@ -0,0 +1,610 @@
1
+ /* dashboard/public/style.css — dark terminal palette */
2
+
3
+ *, *::before, *::after {
4
+ box-sizing: border-box;
5
+ margin: 0;
6
+ padding: 0;
7
+ }
8
+
9
+ :root {
10
+ --bg: #0d1117;
11
+ --bg-card: #161b22;
12
+ --border: #30363d;
13
+ --text: #e6edf3;
14
+ --text-muted:#8b949e;
15
+ --accent: #39d353;
16
+ --accent2: #58a6ff;
17
+ --danger: #f85149;
18
+ --font: 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
19
+ }
20
+
21
+ html, body {
22
+ height: 100%;
23
+ background-color: #0d1117;
24
+ color: #e6edf3;
25
+ font-family: var(--font);
26
+ font-size: 14px;
27
+ line-height: 1.6;
28
+ }
29
+
30
+ a {
31
+ color: var(--accent2);
32
+ text-decoration: none;
33
+ }
34
+
35
+ /* ── layout ── */
36
+
37
+ .app-header {
38
+ padding: 1rem 2rem;
39
+ border-bottom: 1px solid var(--border);
40
+ display: flex;
41
+ align-items: center;
42
+ gap: 0.75rem;
43
+ }
44
+
45
+ .app-header h1 {
46
+ font-size: 1.1rem;
47
+ font-weight: 600;
48
+ color: var(--accent);
49
+ letter-spacing: 0.04em;
50
+ }
51
+
52
+ .app-header .badge {
53
+ background: var(--bg-card);
54
+ border: 1px solid var(--border);
55
+ color: var(--text-muted);
56
+ border-radius: 4px;
57
+ padding: 0.1rem 0.5rem;
58
+ font-size: 0.75rem;
59
+ }
60
+
61
+ .grid {
62
+ display: grid;
63
+ grid-template-columns: repeat(3, 1fr);
64
+ gap: 1.25rem;
65
+ padding: 1.5rem 2rem;
66
+ }
67
+
68
+ @media (max-width: 768px) {
69
+ .grid {
70
+ grid-template-columns: 1fr;
71
+ padding: 1rem;
72
+ }
73
+ }
74
+
75
+ /* ── cards ── */
76
+
77
+ .card {
78
+ background-color: var(--bg-card);
79
+ border: 1px solid var(--border);
80
+ border-radius: 8px;
81
+ padding: 1.25rem;
82
+ min-height: 320px;
83
+ display: flex;
84
+ flex-direction: column;
85
+ gap: 0.75rem;
86
+ }
87
+
88
+ .card-title {
89
+ font-size: 0.75rem;
90
+ text-transform: uppercase;
91
+ letter-spacing: 0.1em;
92
+ color: var(--text-muted);
93
+ border-bottom: 1px solid var(--border);
94
+ padding-bottom: 0.5rem;
95
+ }
96
+
97
+ /* ── projects list ── */
98
+
99
+ .project-list {
100
+ list-style: none;
101
+ flex: 1;
102
+ overflow-y: auto;
103
+ }
104
+
105
+ .project-list li {
106
+ display: flex;
107
+ justify-content: space-between;
108
+ align-items: center;
109
+ padding: 0.4rem 0;
110
+ border-bottom: 1px solid var(--border);
111
+ font-size: 0.85rem;
112
+ }
113
+
114
+ .project-list li:last-child {
115
+ border-bottom: none;
116
+ }
117
+
118
+ .project-name {
119
+ color: var(--accent2);
120
+ max-width: 65%;
121
+ overflow: hidden;
122
+ text-overflow: ellipsis;
123
+ white-space: nowrap;
124
+ }
125
+
126
+ .project-meta {
127
+ display: flex;
128
+ flex-direction: column;
129
+ align-items: flex-end;
130
+ gap: 0.1rem;
131
+ }
132
+
133
+ .project-date {
134
+ color: var(--text-muted);
135
+ font-size: 0.75rem;
136
+ }
137
+
138
+ .project-sessions {
139
+ color: var(--accent);
140
+ font-size: 0.75rem;
141
+ }
142
+
143
+ /* ── RTK numbers ── */
144
+
145
+ .rtk-summary {
146
+ display: flex;
147
+ gap: 1.5rem;
148
+ margin-bottom: 0.5rem;
149
+ }
150
+
151
+ .rtk-stat {
152
+ display: flex;
153
+ flex-direction: column;
154
+ gap: 0.15rem;
155
+ }
156
+
157
+ .rtk-stat .value {
158
+ font-size: 1.4rem;
159
+ font-weight: 700;
160
+ color: var(--accent);
161
+ }
162
+
163
+ .rtk-stat .label {
164
+ font-size: 0.7rem;
165
+ color: var(--text-muted);
166
+ text-transform: uppercase;
167
+ letter-spacing: 0.08em;
168
+ }
169
+
170
+ /* ── charts ── */
171
+
172
+ .chart-wrap {
173
+ flex: 1;
174
+ position: relative;
175
+ min-height: 180px;
176
+ }
177
+
178
+ canvas {
179
+ max-height: 220px;
180
+ }
181
+
182
+ /* ── status bar ── */
183
+
184
+ .status-bar {
185
+ padding: 0.4rem 2rem;
186
+ font-size: 0.72rem;
187
+ color: var(--text-muted);
188
+ border-top: 1px solid var(--border);
189
+ display: flex;
190
+ justify-content: space-between;
191
+ }
192
+
193
+ .status-bar .dot {
194
+ display: inline-block;
195
+ width: 7px;
196
+ height: 7px;
197
+ border-radius: 50%;
198
+ background: var(--accent);
199
+ margin-right: 0.4rem;
200
+ animation: pulse 2s infinite;
201
+ }
202
+
203
+ @keyframes pulse {
204
+ 0%, 100% { opacity: 1; }
205
+ 50% { opacity: 0.3; }
206
+ }
207
+
208
+ .empty-state {
209
+ color: var(--text-muted);
210
+ font-size: 0.85rem;
211
+ text-align: center;
212
+ padding: 2rem 0;
213
+ }
214
+
215
+ /* ── tab navigation ── */
216
+
217
+ .tab-nav {
218
+ display: flex;
219
+ gap: 0.25rem;
220
+ margin-left: 1rem;
221
+ flex: 1;
222
+ }
223
+
224
+ .tab-btn {
225
+ background: transparent;
226
+ border: 1px solid transparent;
227
+ color: var(--text-muted);
228
+ cursor: pointer;
229
+ font-family: var(--font);
230
+ font-size: 0.8rem;
231
+ padding: 0.3rem 0.9rem;
232
+ border-radius: 4px;
233
+ transition: color 0.15s, border-color 0.15s;
234
+ }
235
+
236
+ .tab-btn:hover {
237
+ color: var(--text);
238
+ border-color: var(--border);
239
+ }
240
+
241
+ .tab-btn.active {
242
+ color: var(--accent2);
243
+ border-color: var(--accent2);
244
+ background: rgba(88, 166, 255, 0.08);
245
+ }
246
+
247
+ /* ── tab panels ── */
248
+
249
+ .tab-panel {
250
+ display: flex;
251
+ flex-direction: column;
252
+ min-height: calc(100vh - 56px - 32px);
253
+ }
254
+
255
+ .tab-panel[hidden] {
256
+ display: none;
257
+ }
258
+
259
+ /* ── lang selector ── */
260
+
261
+ .lang-selector {
262
+ display: flex;
263
+ align-items: center;
264
+ gap: 0.25rem;
265
+ margin-left: auto;
266
+ }
267
+
268
+ .lang-btn {
269
+ background: transparent;
270
+ border: 1px solid transparent;
271
+ color: var(--text-muted);
272
+ cursor: pointer;
273
+ font-family: var(--font);
274
+ font-size: 0.75rem;
275
+ padding: 0.2rem 0.5rem;
276
+ border-radius: 3px;
277
+ transition: color 0.15s, border-color 0.15s;
278
+ }
279
+
280
+ .lang-btn:hover {
281
+ color: var(--text);
282
+ }
283
+
284
+ .lang-btn.active {
285
+ color: var(--accent);
286
+ border-color: var(--accent);
287
+ }
288
+
289
+ .lang-sep {
290
+ color: var(--border);
291
+ font-size: 0.75rem;
292
+ }
293
+
294
+ /* ── panel layout (toc + content) ── */
295
+
296
+ .panel-layout {
297
+ display: flex;
298
+ gap: 1.5rem;
299
+ padding: 1.5rem 2rem;
300
+ align-items: flex-start;
301
+ }
302
+
303
+ .panel-content {
304
+ flex: 1;
305
+ min-width: 0;
306
+ }
307
+
308
+ /* ── toc sidebar ── */
309
+
310
+ .toc-sidebar {
311
+ width: 220px;
312
+ min-width: 180px;
313
+ flex-shrink: 0;
314
+ position: sticky;
315
+ top: 1.5rem;
316
+ max-height: calc(100vh - 80px);
317
+ overflow-y: auto;
318
+ font-size: 0.8rem;
319
+ color: var(--text-muted);
320
+ }
321
+
322
+ .toc-sidebar ul {
323
+ list-style: none;
324
+ padding: 0;
325
+ }
326
+
327
+ .toc-sidebar li {
328
+ padding: 0.2rem 0;
329
+ border-left: 2px solid var(--border);
330
+ padding-left: 0.6rem;
331
+ margin-bottom: 0.15rem;
332
+ }
333
+
334
+ .toc-sidebar li a {
335
+ color: var(--text-muted);
336
+ text-decoration: none;
337
+ transition: color 0.1s;
338
+ display: block;
339
+ }
340
+
341
+ .toc-sidebar li a:hover,
342
+ .toc-sidebar li.active a {
343
+ color: var(--accent2);
344
+ }
345
+
346
+ .toc-sidebar li.active {
347
+ border-left-color: var(--accent2);
348
+ }
349
+
350
+ /* ── accordion ── */
351
+
352
+ .accordion {
353
+ border: 1px solid var(--border);
354
+ border-radius: 6px;
355
+ margin-bottom: 0.6rem;
356
+ overflow: hidden;
357
+ }
358
+
359
+ .accordion-header {
360
+ background: var(--bg-card);
361
+ border: none;
362
+ color: var(--text);
363
+ cursor: pointer;
364
+ display: flex;
365
+ align-items: center;
366
+ justify-content: space-between;
367
+ font-family: var(--font);
368
+ font-size: 0.9rem;
369
+ padding: 0.7rem 1rem;
370
+ text-align: left;
371
+ width: 100%;
372
+ transition: background 0.1s;
373
+ }
374
+
375
+ .accordion-header:hover {
376
+ background: rgba(255, 255, 255, 0.04);
377
+ }
378
+
379
+ .accordion-header.open {
380
+ border-bottom: 1px solid var(--border);
381
+ }
382
+
383
+ .accordion-chevron {
384
+ font-size: 0.65rem;
385
+ color: var(--text-muted);
386
+ transition: transform 0.2s;
387
+ }
388
+
389
+ .accordion-header.open .accordion-chevron {
390
+ transform: rotate(180deg);
391
+ }
392
+
393
+ .accordion-body {
394
+ display: none;
395
+ padding: 1rem;
396
+ background: var(--bg);
397
+ }
398
+
399
+ .accordion-body.open {
400
+ display: block;
401
+ }
402
+
403
+ /* ── markdown content body ── */
404
+
405
+ .content-body {
406
+ line-height: 1.7;
407
+ color: var(--text);
408
+ }
409
+
410
+ .content-body h1,
411
+ .content-body h2,
412
+ .content-body h3 {
413
+ color: var(--accent2);
414
+ margin-top: 1.5rem;
415
+ margin-bottom: 0.5rem;
416
+ }
417
+
418
+ .content-body h1 { font-size: 1.3rem; }
419
+ .content-body h2 { font-size: 1.05rem; border-bottom: 1px solid var(--border); padding-bottom: 0.3rem; }
420
+ .content-body h3 { font-size: 0.95rem; }
421
+
422
+ .content-body p {
423
+ margin-bottom: 0.75rem;
424
+ }
425
+
426
+ .content-body pre {
427
+ background: var(--bg-card);
428
+ border: 1px solid var(--border);
429
+ border-radius: 6px;
430
+ padding: 1rem;
431
+ overflow-x: auto;
432
+ font-size: 0.82rem;
433
+ margin-bottom: 0.75rem;
434
+ }
435
+
436
+ .content-body code {
437
+ background: var(--bg-card);
438
+ border-radius: 3px;
439
+ font-size: 0.82rem;
440
+ padding: 0.1rem 0.3rem;
441
+ }
442
+
443
+ .content-body pre code {
444
+ background: none;
445
+ padding: 0;
446
+ }
447
+
448
+ .content-body table {
449
+ border-collapse: collapse;
450
+ width: 100%;
451
+ margin-bottom: 0.75rem;
452
+ font-size: 0.85rem;
453
+ }
454
+
455
+ .content-body th,
456
+ .content-body td {
457
+ border: 1px solid var(--border);
458
+ padding: 0.4rem 0.75rem;
459
+ }
460
+
461
+ .content-body th {
462
+ background: var(--bg-card);
463
+ color: var(--text-muted);
464
+ text-transform: uppercase;
465
+ font-size: 0.72rem;
466
+ letter-spacing: 0.05em;
467
+ }
468
+
469
+ .content-body ul,
470
+ .content-body ol {
471
+ padding-left: 1.5rem;
472
+ margin-bottom: 0.75rem;
473
+ }
474
+
475
+ .content-body li {
476
+ margin-bottom: 0.25rem;
477
+ }
478
+
479
+ /* ── scenario selector ── */
480
+
481
+ .scenario-selector {
482
+ display: flex;
483
+ flex-wrap: wrap;
484
+ gap: 0.4rem;
485
+ margin-bottom: 1rem;
486
+ }
487
+
488
+ .scenario-btn {
489
+ background: var(--bg-card);
490
+ border: 1px solid var(--border);
491
+ color: var(--text-muted);
492
+ cursor: pointer;
493
+ font-family: var(--font);
494
+ font-size: 0.78rem;
495
+ padding: 0.3rem 0.8rem;
496
+ border-radius: 4px;
497
+ transition: color 0.15s, border-color 0.15s;
498
+ }
499
+
500
+ .scenario-btn:hover {
501
+ color: var(--text);
502
+ border-color: var(--accent2);
503
+ }
504
+
505
+ .scenario-btn.active {
506
+ color: var(--accent2);
507
+ border-color: var(--accent2);
508
+ background: rgba(88, 166, 255, 0.08);
509
+ }
510
+
511
+ /* ── translation banner ── */
512
+
513
+ .translation-banner {
514
+ background: rgba(210, 153, 34, 0.15);
515
+ border: 1px solid rgba(210, 153, 34, 0.5);
516
+ border-radius: 4px;
517
+ color: #e3b341;
518
+ font-size: 0.8rem;
519
+ margin-bottom: 1rem;
520
+ padding: 0.5rem 0.9rem;
521
+ }
522
+
523
+ .translation-banner[hidden] {
524
+ display: none;
525
+ }
526
+
527
+ /* ── loading spinner ── */
528
+
529
+ .loading-spinner {
530
+ color: var(--text-muted);
531
+ font-size: 0.85rem;
532
+ padding: 2rem;
533
+ text-align: center;
534
+ }
535
+
536
+ /* ── docs index lists ── */
537
+
538
+ .docs-index-list {
539
+ list-style: none;
540
+ padding: 0;
541
+ }
542
+
543
+ .docs-index-item {
544
+ border: 1px solid var(--border);
545
+ border-radius: 4px;
546
+ margin-bottom: 0.4rem;
547
+ overflow: hidden;
548
+ }
549
+
550
+ .docs-index-item-header {
551
+ align-items: center;
552
+ background: var(--bg-card);
553
+ cursor: pointer;
554
+ display: flex;
555
+ gap: 0.5rem;
556
+ justify-content: space-between;
557
+ padding: 0.5rem 0.9rem;
558
+ }
559
+
560
+ .docs-index-item-header:hover {
561
+ background: rgba(255, 255, 255, 0.04);
562
+ }
563
+
564
+ .docs-index-item-name {
565
+ color: var(--accent2);
566
+ font-size: 0.85rem;
567
+ }
568
+
569
+ .docs-index-item-model,
570
+ .docs-index-item-desc {
571
+ color: var(--text-muted);
572
+ font-size: 0.75rem;
573
+ }
574
+
575
+ .docs-index-item-body {
576
+ display: none;
577
+ padding: 0.75rem;
578
+ background: var(--bg);
579
+ border-top: 1px solid var(--border);
580
+ }
581
+
582
+ .docs-index-item-body.open {
583
+ display: block;
584
+ }
585
+
586
+ /* ── responsive ── */
587
+
588
+ @media (max-width: 768px) {
589
+ .toc-sidebar {
590
+ display: none;
591
+ }
592
+
593
+ .panel-layout {
594
+ padding: 1rem;
595
+ }
596
+
597
+ .accordion-body {
598
+ padding: 0.75rem;
599
+ }
600
+
601
+ .tab-nav {
602
+ margin-left: 0;
603
+ flex-wrap: wrap;
604
+ }
605
+
606
+ .app-header {
607
+ flex-wrap: wrap;
608
+ gap: 0.5rem;
609
+ }
610
+ }