@bvdm/delano 0.1.5 → 0.1.8

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 (145) hide show
  1. package/.delano/README.md +7 -0
  2. package/.delano/viewer/README.md +19 -0
  3. package/.delano/viewer/public/app.js +818 -0
  4. package/.delano/viewer/public/explorer.svg +3 -0
  5. package/.delano/viewer/public/index.html +21 -0
  6. package/.delano/viewer/public/markdown.svg +6 -0
  7. package/.delano/viewer/public/styles.css +1042 -0
  8. package/.delano/viewer/public/vscode.svg +24 -0
  9. package/.delano/viewer/server.js +389 -0
  10. package/HANDBOOK.md +66 -45
  11. package/README.md +21 -2
  12. package/assets/install-manifest.json +112 -23
  13. package/assets/payload/.agents/README.md +31 -6
  14. package/assets/payload/.agents/adapters/claude/README.md +22 -3
  15. package/assets/payload/.agents/adapters/codex/README.md +22 -3
  16. package/assets/payload/.agents/adapters/opencode/README.md +22 -3
  17. package/assets/payload/.agents/adapters/pi/README.md +22 -3
  18. package/assets/payload/.agents/common/log-safety.js +55 -0
  19. package/assets/payload/.agents/eval-fixtures/skill-output/invalid/missing-evidence/output.json +6 -0
  20. package/assets/payload/.agents/eval-fixtures/skill-output/valid/summary/output.json +7 -0
  21. package/assets/payload/.agents/fixtures/github/status-snapshot.json +6 -0
  22. package/assets/payload/.agents/fixtures/linear/issue-snapshot.json +6 -0
  23. package/assets/payload/.agents/hooks/bash-worktree-fix.sh +2 -1
  24. package/assets/payload/.agents/hooks/post-tool-logger.js +2 -1
  25. package/assets/payload/.agents/hooks/session-tracker.js +0 -0
  26. package/assets/payload/.agents/hooks/user-prompt-logger.js +17 -1
  27. package/assets/payload/.agents/logs/delivery-metrics.md +22 -0
  28. package/assets/payload/.agents/logs/schema.md +20 -1
  29. package/assets/payload/.agents/rules/delivery-modes.md +17 -0
  30. package/assets/payload/.agents/schemas/README.md +22 -0
  31. package/assets/payload/.agents/schemas/artifact-scope.json +237 -0
  32. package/assets/payload/.agents/schemas/artifacts/context.schema.json +11 -0
  33. package/assets/payload/.agents/schemas/artifacts/decision_log.schema.json +12 -0
  34. package/assets/payload/.agents/schemas/artifacts/evidence.schema.json +17 -0
  35. package/assets/payload/.agents/schemas/artifacts/plan.schema.json +83 -0
  36. package/assets/payload/.agents/schemas/artifacts/spec.schema.json +101 -0
  37. package/assets/payload/.agents/schemas/artifacts/task.schema.json +121 -0
  38. package/assets/payload/.agents/schemas/artifacts/update.schema.json +12 -0
  39. package/assets/payload/.agents/schemas/artifacts/workstream.schema.json +66 -0
  40. package/assets/payload/.agents/schemas/evidence-map.json +53 -0
  41. package/assets/payload/.agents/schemas/learning/closeout-learning-proposal.schema.json +20 -0
  42. package/assets/payload/.agents/schemas/learning/delivery-metric-event.schema.json +21 -0
  43. package/assets/payload/.agents/schemas/leases/lease.schema.json +39 -0
  44. package/assets/payload/.agents/schemas/metrics/delivery-event.schema.json +29 -0
  45. package/assets/payload/.agents/schemas/metrics/delivery-events.schema.json +49 -0
  46. package/assets/payload/.agents/schemas/operating-modes.json +42 -0
  47. package/assets/payload/.agents/schemas/status-transitions.json +31 -0
  48. package/assets/payload/.agents/schemas/sync/drift-report.schema.json +25 -0
  49. package/assets/payload/.agents/schemas/sync/drift-taxonomy.json +38 -0
  50. package/assets/payload/.agents/schemas/sync/sync-map.schema.json +39 -0
  51. package/assets/payload/.agents/scripts/README.md +1 -0
  52. package/assets/payload/.agents/scripts/audit-context-files.mjs +54 -0
  53. package/assets/payload/.agents/scripts/audit-context-scoring.mjs +14 -0
  54. package/assets/payload/.agents/scripts/build-drift-report.mjs +133 -0
  55. package/assets/payload/.agents/scripts/check-artifact-schemas.mjs +116 -0
  56. package/assets/payload/.agents/scripts/check-closeout-learning-proposals.mjs +23 -0
  57. package/assets/payload/.agents/scripts/check-context-audit.mjs +61 -0
  58. package/assets/payload/.agents/scripts/check-delivery-metric-events.mjs +35 -0
  59. package/assets/payload/.agents/scripts/check-delivery-metrics.mjs +52 -0
  60. package/assets/payload/.agents/scripts/check-evidence-map.mjs +143 -0
  61. package/assets/payload/.agents/scripts/check-github-status-inspection.mjs +93 -0
  62. package/assets/payload/.agents/scripts/check-github-sync.mjs +159 -0
  63. package/assets/payload/.agents/scripts/check-handoff-summaries.mjs +57 -0
  64. package/assets/payload/.agents/scripts/check-lease-conflicts.mjs +24 -0
  65. package/assets/payload/.agents/scripts/check-lease-contracts.mjs +17 -0
  66. package/assets/payload/.agents/scripts/check-linear-issue-inspection.mjs +63 -0
  67. package/assets/payload/.agents/scripts/check-local-sync-map.mjs +151 -0
  68. package/assets/payload/.agents/scripts/check-log-safety.sh +62 -0
  69. package/assets/payload/.agents/scripts/check-operating-modes.mjs +99 -0
  70. package/assets/payload/.agents/scripts/check-path-standards.sh +1 -1
  71. package/assets/payload/.agents/scripts/check-skill-output-evals.mjs +13 -0
  72. package/assets/payload/.agents/scripts/check-status-transitions.mjs +169 -0
  73. package/assets/payload/.agents/scripts/check-strict-fixtures.mjs +140 -0
  74. package/assets/payload/.agents/scripts/check-sync-schemas.mjs +52 -0
  75. package/assets/payload/.agents/scripts/check-text-safety.mjs +158 -0
  76. package/assets/payload/.agents/scripts/check-worktree-health.mjs +100 -0
  77. package/assets/payload/.agents/scripts/fix-path-standards.sh +1 -1
  78. package/assets/payload/.agents/scripts/git-sparse-download.sh +0 -0
  79. package/assets/payload/.agents/scripts/inspect-github-sync.mjs +108 -0
  80. package/assets/payload/.agents/scripts/lease-manager.mjs +88 -0
  81. package/assets/payload/.agents/scripts/log-event.js +3 -0
  82. package/assets/payload/.agents/scripts/log-event.sh +0 -0
  83. package/assets/payload/.agents/scripts/plan-sync-repairs.mjs +66 -0
  84. package/assets/payload/.agents/scripts/pm/blocked.sh +0 -0
  85. package/assets/payload/.agents/scripts/pm/epic-list.sh +0 -0
  86. package/assets/payload/.agents/scripts/pm/in-progress.sh +0 -0
  87. package/assets/payload/.agents/scripts/pm/init.sh +0 -0
  88. package/assets/payload/.agents/scripts/pm/next.sh +0 -0
  89. package/assets/payload/.agents/scripts/pm/prd-list.sh +0 -0
  90. package/assets/payload/.agents/scripts/pm/search.sh +0 -0
  91. package/assets/payload/.agents/scripts/pm/standup.sh +0 -0
  92. package/assets/payload/.agents/scripts/pm/status.sh +0 -0
  93. package/assets/payload/.agents/scripts/pm/validate.sh +657 -2
  94. package/assets/payload/.agents/scripts/propose-closeout-learning.mjs +20 -0
  95. package/assets/payload/.agents/scripts/query-log.sh +0 -0
  96. package/assets/payload/.agents/scripts/read-local-sync-map.mjs +135 -0
  97. package/assets/payload/.agents/scripts/select-next-task.mjs +22 -0
  98. package/assets/payload/.agents/scripts/summarize-project-metrics.mjs +15 -0
  99. package/assets/payload/.agents/scripts/test-and-log.sh +0 -0
  100. package/assets/payload/.agents/skills/README.md +6 -0
  101. package/assets/payload/.agents/skills/closeout-skill/SKILL.md +3 -0
  102. package/assets/payload/.agents/skills/closeout-skill/references/runbook.md +5 -2
  103. package/assets/payload/.agents/skills/closeout-skill/templates/closure-checklist.md +2 -0
  104. package/assets/payload/.agents/skills/closeout-skill/templates/learning-proposal.md +21 -0
  105. package/assets/payload/.agents/skills/closeout-skill/templates/learning-proposals.md +25 -0
  106. package/assets/payload/.agents/skills/manage-context/SKILL.md +55 -0
  107. package/assets/payload/.agents/skills/manage-context/references/context-audit-checklist.md +26 -0
  108. package/assets/payload/.agents/skills/manage-context/references/runbook.md +26 -0
  109. package/assets/payload/.agents/skills/manage-context/templates/context-debt-report.md +22 -0
  110. package/assets/payload/.agents/skills/manage-context/templates/context-refresh-summary.md +13 -0
  111. package/assets/payload/.agents/skills/onboarding/SKILL.md +49 -0
  112. package/assets/payload/.agents/skills/onboarding/references/agents-md-best-practices.md +76 -0
  113. package/assets/payload/.agents/skills/prototype-skill/SKILL.md +51 -0
  114. package/assets/payload/.agents/skills/prototype-skill/references/probe-design-checklist.md +26 -0
  115. package/assets/payload/.agents/skills/prototype-skill/references/runbook.md +27 -0
  116. package/assets/payload/.agents/skills/prototype-skill/templates/probe-approval-recommendation.md +13 -0
  117. package/assets/payload/.agents/skills/prototype-skill/templates/probe-findings.md +16 -0
  118. package/assets/payload/.agents/validation-fixtures/strict/invalid/broken-dependencies/dependency.md +18 -0
  119. package/assets/payload/.agents/validation-fixtures/strict/invalid/broken-dependencies/task.md +24 -0
  120. package/assets/payload/.agents/validation-fixtures/strict/invalid/invalid-transition/task.md +20 -0
  121. package/assets/payload/.agents/validation-fixtures/strict/invalid/missing-evidence/task.md +27 -0
  122. package/assets/payload/.agents/validation-fixtures/strict/invalid/path-leak/task.md +27 -0
  123. package/assets/payload/.agents/validation-fixtures/strict/invalid/stale-context/context.md +9 -0
  124. package/assets/payload/.agents/validation-fixtures/strict/manifest.json +11 -0
  125. package/assets/payload/.agents/validation-fixtures/strict/valid/minimal-project/task.md +27 -0
  126. package/assets/payload/.delano/viewer/README.md +19 -0
  127. package/assets/payload/.delano/viewer/public/app.js +818 -0
  128. package/assets/payload/.delano/viewer/public/explorer.svg +3 -0
  129. package/assets/payload/.delano/viewer/public/index.html +21 -0
  130. package/assets/payload/.delano/viewer/public/markdown.svg +6 -0
  131. package/assets/payload/.delano/viewer/public/styles.css +1042 -0
  132. package/assets/payload/.delano/viewer/public/vscode.svg +24 -0
  133. package/assets/payload/.delano/viewer/server.js +389 -0
  134. package/assets/payload/.project/templates/plan.md +1 -1
  135. package/assets/payload/.project/templates/spec.md +1 -1
  136. package/assets/payload/.project/templates/task.md +1 -0
  137. package/assets/payload/HANDBOOK.md +66 -45
  138. package/assets/payload/install-delano.sh +0 -0
  139. package/install-delano.sh +0 -0
  140. package/package.json +31 -2
  141. package/src/cli/commands/onboarding.js +29 -0
  142. package/src/cli/commands/viewer.js +81 -0
  143. package/src/cli/index.js +20 -0
  144. package/src/cli/lib/install.js +1 -0
  145. package/src/cli/lib/onboarding.js +243 -0
@@ -0,0 +1,1042 @@
1
+ :root {
2
+ color-scheme: light;
3
+ --canvas: #f7f6f3;
4
+ --paper: #ffffff;
5
+ --paper-soft: #fbfbfa;
6
+ --ink: #111111;
7
+ --text: #2f3437;
8
+ --muted: #787774;
9
+ --faint: #a5a19b;
10
+ --line: #eaeaea;
11
+ --line-soft: rgba(0, 0, 0, 0.06);
12
+ --red-bg: #fdebec;
13
+ --red-text: #9f2f2d;
14
+ --blue-bg: #e1f3fe;
15
+ --blue-text: #1f6c9f;
16
+ --green-bg: #edf3ec;
17
+ --green-text: #346538;
18
+ --yellow-bg: #fbf3db;
19
+ --yellow-text: #956400;
20
+ --sans: "Aptos", "Segoe UI Variable", "Segoe UI", "SF Pro Display", "Geist Sans", "Helvetica Neue", Arial, sans-serif;
21
+ --display: "Aptos Display", "Segoe UI Variable Display", "Segoe UI", "SF Pro Display", "Geist Sans", "Helvetica Neue", Arial, sans-serif;
22
+ --serif: "Newsreader", "Instrument Serif", "Lyon Text", "Iowan Old Style", "Sitka Text", "Charter", "Cambria", Georgia, serif;
23
+ --mono: "Geist Mono", "SF Mono", "JetBrains Mono", Consolas, monospace;
24
+ --shadow-card-rest: 0 0 0 rgba(0, 0, 0, 0);
25
+ --shadow-card-hover: 0 2px 8px rgba(0, 0, 0, 0.04);
26
+ }
27
+
28
+ * { box-sizing: border-box; }
29
+
30
+ html { background: var(--canvas); }
31
+
32
+ body {
33
+ margin: 0;
34
+ min-height: 100vh;
35
+ background: var(--canvas);
36
+ color: var(--text);
37
+ font: 14px/1.6 var(--sans);
38
+ letter-spacing: 0;
39
+ -webkit-font-smoothing: antialiased;
40
+ text-rendering: optimizeLegibility;
41
+ }
42
+
43
+ .ambient {
44
+ position: fixed;
45
+ inset: 0;
46
+ pointer-events: none;
47
+ z-index: 0;
48
+ background:
49
+ radial-gradient(ellipse 70% 55% at 18% 8%, rgba(180, 150, 110, 0.045), transparent 60%),
50
+ radial-gradient(ellipse 60% 50% at 92% 90%, rgba(120, 130, 160, 0.035), transparent 60%);
51
+ animation: ambient-drift 28s ease-in-out infinite alternate;
52
+ }
53
+
54
+ @keyframes ambient-drift {
55
+ 0% { transform: translate3d(0, 0, 0); }
56
+ 100% { transform: translate3d(-1.2%, 0.8%, 0); }
57
+ }
58
+
59
+ @media (prefers-reduced-motion: reduce) {
60
+ .ambient { animation: none; }
61
+ }
62
+
63
+ button, input { font: inherit; }
64
+ button { color: inherit; }
65
+
66
+ #app {
67
+ position: relative;
68
+ z-index: 1;
69
+ min-height: 100vh;
70
+ padding: 18px;
71
+ }
72
+
73
+ .viewer-frame {
74
+ min-height: calc(100vh - 36px);
75
+ border: 1px solid var(--line);
76
+ border-radius: 12px;
77
+ background: var(--paper);
78
+ overflow: hidden;
79
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.02), 0 12px 40px rgba(40, 30, 10, 0.025);
80
+ }
81
+
82
+ .top-bar {
83
+ display: flex;
84
+ align-items: stretch;
85
+ height: 60px;
86
+ padding: 0 28px;
87
+ gap: 28px;
88
+ border-bottom: 1px solid var(--line);
89
+ background: var(--paper);
90
+ }
91
+
92
+ .brand-mark {
93
+ display: flex;
94
+ align-items: center;
95
+ flex-shrink: 0;
96
+ padding-right: 28px;
97
+ border-right: 1px solid var(--line);
98
+ font-family: var(--serif);
99
+ font-size: 22px;
100
+ font-weight: 500;
101
+ letter-spacing: -0.025em;
102
+ color: var(--ink);
103
+ }
104
+
105
+ .tabs {
106
+ position: relative;
107
+ display: flex;
108
+ flex: 1;
109
+ align-items: stretch;
110
+ gap: 6px;
111
+ min-width: 0;
112
+ }
113
+
114
+ .tab.overflow-hidden { display: none; }
115
+
116
+ .tab-more {
117
+ position: relative;
118
+ display: inline-flex;
119
+ align-items: center;
120
+ justify-content: center;
121
+ width: 32px;
122
+ margin-left: auto;
123
+ padding: 0;
124
+ border: 0;
125
+ background: transparent;
126
+ color: var(--muted);
127
+ cursor: pointer;
128
+ border-radius: 5px;
129
+ transition: color 200ms ease, background 200ms ease;
130
+ }
131
+
132
+ .tab-more:hover { color: var(--ink); background: var(--paper-soft); }
133
+
134
+ .tab-more[aria-expanded="true"] {
135
+ color: var(--ink);
136
+ background: var(--paper-soft);
137
+ }
138
+
139
+ .tab-more.has-active { color: var(--ink); }
140
+
141
+ .tab-more.has-active::after {
142
+ content: '';
143
+ position: absolute;
144
+ left: 6px;
145
+ right: 6px;
146
+ bottom: -1px;
147
+ height: 2px;
148
+ background: var(--ink);
149
+ }
150
+
151
+ .tab-more svg { display: block; }
152
+
153
+ .tab-more.hidden { display: none; }
154
+
155
+ .tab-dropdown {
156
+ position: absolute;
157
+ top: calc(100% + 6px);
158
+ right: 0;
159
+ min-width: 240px;
160
+ max-width: min(320px, 90vw);
161
+ max-height: min(420px, 70vh);
162
+ overflow-y: auto;
163
+ background: var(--paper);
164
+ border: 1px solid var(--line);
165
+ border-radius: 10px;
166
+ padding: 5px;
167
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.02), 0 8px 28px rgba(40, 30, 10, 0.08);
168
+ z-index: 50;
169
+ display: none;
170
+ }
171
+
172
+ .tab-dropdown[data-open="true"] {
173
+ display: block;
174
+ animation: dropdown-in 180ms cubic-bezier(0.16, 1, 0.3, 1);
175
+ }
176
+
177
+ @keyframes dropdown-in {
178
+ from { opacity: 0; transform: translateY(-4px); }
179
+ to { opacity: 1; transform: translateY(0); }
180
+ }
181
+
182
+ .dropdown-item {
183
+ display: flex;
184
+ align-items: center;
185
+ justify-content: space-between;
186
+ gap: 16px;
187
+ width: 100%;
188
+ text-align: left;
189
+ padding: 9px 11px;
190
+ border: 0;
191
+ background: transparent;
192
+ color: var(--text);
193
+ cursor: pointer;
194
+ border-radius: 6px;
195
+ font-size: 13px;
196
+ font-weight: 500;
197
+ white-space: nowrap;
198
+ transition: background 150ms ease, color 150ms ease;
199
+ }
200
+
201
+ .dropdown-item:hover { background: var(--paper-soft); color: var(--ink); }
202
+
203
+ .dropdown-item.active {
204
+ background: var(--paper-soft);
205
+ color: var(--ink);
206
+ font-weight: 600;
207
+ }
208
+
209
+ .dropdown-item .count {
210
+ font-family: var(--mono);
211
+ font-size: 10.5px;
212
+ color: var(--faint);
213
+ font-weight: 400;
214
+ }
215
+
216
+ .dropdown-item:focus-visible {
217
+ outline: 2px solid var(--blue-text);
218
+ outline-offset: -2px;
219
+ }
220
+
221
+ .tab {
222
+ position: relative;
223
+ display: inline-flex;
224
+ align-items: center;
225
+ gap: 9px;
226
+ padding: 0 10px;
227
+ border: 0;
228
+ background: transparent;
229
+ color: var(--muted);
230
+ cursor: pointer;
231
+ font-size: 13px;
232
+ font-weight: 600;
233
+ white-space: nowrap;
234
+ transition: color 200ms ease;
235
+ }
236
+
237
+ .tab:hover { color: var(--ink); }
238
+ .tab.active { color: var(--ink); }
239
+
240
+ .tab.active::after {
241
+ content: '';
242
+ position: absolute;
243
+ left: 6px;
244
+ right: 6px;
245
+ bottom: -1px;
246
+ height: 2px;
247
+ background: var(--ink);
248
+ }
249
+
250
+ .tab .count {
251
+ font-family: var(--mono);
252
+ font-size: 10.5px;
253
+ font-weight: 400;
254
+ color: var(--faint);
255
+ letter-spacing: 0;
256
+ }
257
+
258
+ .tab.active .count { color: var(--muted); }
259
+
260
+ .outline-toggle {
261
+ align-self: center;
262
+ flex-shrink: 0;
263
+ border: 1px solid var(--line);
264
+ border-radius: 6px;
265
+ background: var(--paper);
266
+ color: var(--muted);
267
+ cursor: pointer;
268
+ font-size: 12px;
269
+ font-weight: 600;
270
+ padding: 7px 11px;
271
+ transition: color 200ms ease, border-color 200ms ease, background 200ms ease;
272
+ }
273
+
274
+ .outline-toggle:hover {
275
+ color: var(--ink);
276
+ border-color: #d9d5ce;
277
+ background: var(--paper-soft);
278
+ }
279
+
280
+ .shell {
281
+ display: grid;
282
+ grid-template-columns: 380px minmax(0, 1fr);
283
+ height: calc(100vh - 98px);
284
+ background: var(--paper);
285
+ }
286
+
287
+ .list, .reader, .outline {
288
+ min-width: 0;
289
+ border-right: 1px solid var(--line);
290
+ background: var(--paper);
291
+ }
292
+
293
+ .filter-label, .outline-label, .eyebrow {
294
+ color: var(--muted);
295
+ font-size: 10px;
296
+ font-weight: 750;
297
+ text-transform: uppercase;
298
+ letter-spacing: 0.08em;
299
+ }
300
+
301
+ .count {
302
+ color: var(--muted);
303
+ font: 11px/1 var(--mono);
304
+ }
305
+
306
+ .pill {
307
+ display: inline-flex;
308
+ align-items: center;
309
+ justify-content: center;
310
+ flex: 0 0 auto;
311
+ align-self: flex-start;
312
+ min-height: 22px;
313
+ max-height: 22px;
314
+ border: 1px solid transparent;
315
+ background: #f1f0ed;
316
+ border-radius: 9999px;
317
+ padding: 0 10px;
318
+ color: var(--muted);
319
+ font-family: var(--mono);
320
+ font-size: 10px;
321
+ font-weight: 600;
322
+ line-height: 1;
323
+ letter-spacing: 0.08em;
324
+ text-transform: uppercase;
325
+ white-space: nowrap;
326
+ }
327
+
328
+ .pill.active, .pill.approved, .pill.complete, .pill.done {
329
+ color: var(--green-text);
330
+ background: var(--green-bg);
331
+ }
332
+
333
+ .pill.in-progress, .pill.planned, .pill.ready {
334
+ color: var(--yellow-text);
335
+ background: var(--yellow-bg);
336
+ }
337
+
338
+ .pill.blocked {
339
+ color: var(--red-text);
340
+ background: var(--red-bg);
341
+ }
342
+
343
+ .list {
344
+ padding: 20px;
345
+ overflow: auto;
346
+ background: #fcfbf9;
347
+ }
348
+
349
+ .search {
350
+ width: 100%;
351
+ border: 1px solid var(--line);
352
+ border-radius: 6px;
353
+ padding: 11px 12px;
354
+ background: var(--paper);
355
+ color: var(--ink);
356
+ outline: none;
357
+ transition: border-color 160ms ease, background 160ms ease;
358
+ }
359
+
360
+ .search::placeholder { color: var(--faint); }
361
+ .search:focus {
362
+ border-color: #cfcac2;
363
+ background: #fff;
364
+ }
365
+
366
+ .filters {
367
+ display: flex;
368
+ gap: 8px;
369
+ flex-wrap: wrap;
370
+ margin: 16px 0 18px;
371
+ }
372
+
373
+ .filter-group {
374
+ display: flex;
375
+ gap: 7px;
376
+ flex-wrap: wrap;
377
+ align-items: center;
378
+ width: 100%;
379
+ }
380
+
381
+ .filter-label { margin-right: 4px; }
382
+ .filter-note { color: var(--muted); font-size: 12px; width: 100%; padding: 4px 2px; }
383
+
384
+ .sort-group {
385
+ align-items: center;
386
+ }
387
+
388
+ .sort-field {
389
+ appearance: none;
390
+ -webkit-appearance: none;
391
+ -moz-appearance: none;
392
+ height: 28px;
393
+ padding: 0 26px 0 10px;
394
+ border: 1px solid var(--line);
395
+ border-radius: 6px;
396
+ background-color: var(--paper);
397
+ background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23787774' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='4,6 8,10 12,6'/></svg>");
398
+ background-repeat: no-repeat;
399
+ background-position: right 8px center;
400
+ background-size: 12px;
401
+ color: var(--ink);
402
+ font-family: inherit;
403
+ font-size: 12px;
404
+ font-weight: 500;
405
+ cursor: pointer;
406
+ outline: none;
407
+ transition: border-color 150ms ease, background-color 150ms ease;
408
+ }
409
+
410
+ .sort-field:hover { background-color: var(--paper-soft); border-color: #d9d5ce; }
411
+ .sort-field:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
412
+
413
+ .sort-dir {
414
+ display: inline-flex;
415
+ align-items: center;
416
+ justify-content: center;
417
+ width: 28px;
418
+ height: 28px;
419
+ padding: 0;
420
+ border: 1px solid var(--line);
421
+ border-radius: 6px;
422
+ background: var(--paper);
423
+ color: var(--muted);
424
+ cursor: pointer;
425
+ transition: background 150ms ease, color 150ms ease, border-color 150ms ease;
426
+ }
427
+
428
+ .sort-dir:hover { background: var(--paper-soft); border-color: #d9d5ce; color: var(--ink); }
429
+ .sort-dir:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
430
+
431
+ .workstream-scope, .filter {
432
+ border: 1px solid var(--line);
433
+ background: var(--paper);
434
+ border-radius: 6px;
435
+ padding: 6px 9px;
436
+ color: var(--muted);
437
+ cursor: pointer;
438
+ font-size: 12px;
439
+ }
440
+
441
+ .workstream-scope, .filter.active {
442
+ border-color: transparent;
443
+ color: var(--blue-text);
444
+ background: var(--blue-bg);
445
+ }
446
+
447
+ .doc {
448
+ border: 1px solid var(--line);
449
+ border-radius: 12px;
450
+ padding: 18px 18px 16px;
451
+ margin: 10px 0;
452
+ cursor: pointer;
453
+ background: var(--paper);
454
+ box-shadow: var(--shadow-card-rest);
455
+ transition: background 200ms ease, border-color 200ms ease, transform 200ms cubic-bezier(0.16, 1, 0.3, 1), box-shadow 200ms ease;
456
+ }
457
+
458
+ .doc:hover, .doc.active {
459
+ border-color: #dedbd5;
460
+ background: #fff;
461
+ box-shadow: var(--shadow-card-hover);
462
+ }
463
+
464
+ .doc:hover { transform: translateY(-1px); }
465
+ .doc:active { transform: scale(0.995); }
466
+
467
+ .doc-title {
468
+ color: var(--ink);
469
+ font-weight: 760;
470
+ letter-spacing: -0.01em;
471
+ display: flex;
472
+ justify-content: space-between;
473
+ align-items: flex-start;
474
+ gap: 12px;
475
+ }
476
+
477
+ .doc-title span:first-child {
478
+ min-width: 0;
479
+ overflow-wrap: anywhere;
480
+ }
481
+
482
+ .doc-path {
483
+ color: var(--faint);
484
+ font: 11px/1.4 var(--mono);
485
+ margin-top: 6px;
486
+ overflow: hidden;
487
+ text-overflow: ellipsis;
488
+ white-space: nowrap;
489
+ }
490
+
491
+ .doc-snippet {
492
+ color: var(--muted);
493
+ font-size: 13px;
494
+ margin-top: 10px;
495
+ }
496
+
497
+ .reader {
498
+ overflow: auto;
499
+ background: var(--paper);
500
+ }
501
+
502
+ .reader-inner {
503
+ max-width: 940px;
504
+ margin: 0 auto;
505
+ padding: 64px 80px 112px;
506
+ }
507
+
508
+ .reader-head {
509
+ border-bottom: 1px solid var(--line);
510
+ padding-bottom: 32px;
511
+ margin-bottom: 44px;
512
+ }
513
+
514
+ .reader h1 {
515
+ color: var(--ink);
516
+ font-family: var(--serif);
517
+ font-size: clamp(34px, 3.4vw, 48px);
518
+ font-weight: 500;
519
+ line-height: 1.06;
520
+ letter-spacing: -0.025em;
521
+ margin: 0 0 22px;
522
+ }
523
+
524
+ .reader-top {
525
+ display: block;
526
+ }
527
+
528
+ .reader-actions {
529
+ display: flex;
530
+ gap: 8px;
531
+ flex-wrap: wrap;
532
+ justify-content: flex-start;
533
+ margin-top: 14px;
534
+ }
535
+
536
+ /* Shadcn-style action buttons. .action = outline variant, .action.primary = default variant. */
537
+ .action {
538
+ display: inline-flex;
539
+ align-items: center;
540
+ justify-content: center;
541
+ gap: 8px;
542
+ height: 36px;
543
+ padding: 0 16px;
544
+ border: 1px solid var(--line);
545
+ border-radius: 6px;
546
+ background: var(--paper);
547
+ color: var(--ink);
548
+ cursor: pointer;
549
+ font-family: inherit;
550
+ font-size: 14px;
551
+ font-weight: 500;
552
+ letter-spacing: 0;
553
+ white-space: nowrap;
554
+ user-select: none;
555
+ transition: background-color 150ms ease, border-color 150ms ease, color 150ms ease;
556
+ }
557
+
558
+ .action:hover {
559
+ background: var(--paper-soft);
560
+ border-color: #d9d5ce;
561
+ color: var(--ink);
562
+ }
563
+
564
+ .action:focus-visible {
565
+ outline: 2px solid var(--ink);
566
+ outline-offset: 2px;
567
+ }
568
+
569
+ .action:active { transform: translateY(0.5px); }
570
+
571
+ .action.primary {
572
+ background: var(--ink);
573
+ border-color: var(--ink);
574
+ color: #ffffff;
575
+ }
576
+
577
+ .action.primary:hover {
578
+ background: #1f1f1f;
579
+ border-color: #1f1f1f;
580
+ color: #ffffff;
581
+ }
582
+
583
+ .action.primary:focus-visible {
584
+ outline: 2px solid var(--ink);
585
+ outline-offset: 2px;
586
+ }
587
+
588
+ .action-icon {
589
+ width: 16px;
590
+ height: 16px;
591
+ flex-shrink: 0;
592
+ display: block;
593
+ pointer-events: none;
594
+ }
595
+
596
+ /* Markdown logomark is a monochrome path; tone it down to read as a UI icon. */
597
+ .action-icon-md { opacity: 0.78; }
598
+ .action:hover .action-icon-md { opacity: 0.9; }
599
+ .action.copied .action-icon-md { opacity: 0.9; }
600
+
601
+ .action-label { line-height: 1; }
602
+
603
+ .open-feedback {
604
+ min-height: 18px;
605
+ margin-top: 10px;
606
+ color: var(--muted);
607
+ font-size: 12px;
608
+ }
609
+
610
+ .path-pill {
611
+ max-width: min(100%, 420px);
612
+ overflow: hidden;
613
+ text-overflow: ellipsis;
614
+ }
615
+
616
+ .eyebrow { margin-bottom: 12px; }
617
+ .meta { display: flex; gap: 8px; flex-wrap: wrap; color: var(--muted); }
618
+
619
+ .properties {
620
+ display: grid;
621
+ grid-template-columns: 150px minmax(0, 1fr);
622
+ gap: 8px 16px;
623
+ margin-top: 18px;
624
+ padding: 16px;
625
+ border: 1px solid var(--line);
626
+ border-radius: 10px;
627
+ background: var(--paper-soft);
628
+ }
629
+
630
+ .prop-key {
631
+ color: var(--muted);
632
+ font: 11px/1.4 var(--mono);
633
+ padding-top: 3px;
634
+ }
635
+
636
+ .prop-value {
637
+ display: flex;
638
+ align-items: flex-start;
639
+ gap: 8px;
640
+ min-width: 0;
641
+ }
642
+
643
+ .prop-value .prop-text {
644
+ flex: 1;
645
+ min-width: 0;
646
+ overflow-wrap: anywhere;
647
+ }
648
+
649
+ .copy-btn {
650
+ display: inline-flex;
651
+ align-items: center;
652
+ justify-content: center;
653
+ width: 24px;
654
+ height: 24px;
655
+ padding: 0;
656
+ border: 1px solid var(--line);
657
+ border-radius: 5px;
658
+ background: var(--paper);
659
+ color: var(--muted);
660
+ cursor: pointer;
661
+ flex-shrink: 0;
662
+ transition: color 200ms ease, border-color 200ms ease, background 200ms ease;
663
+ }
664
+
665
+ .copy-btn:hover {
666
+ color: var(--ink);
667
+ border-color: #d9d5ce;
668
+ background: var(--paper-soft);
669
+ }
670
+
671
+ .copy-btn:focus-visible {
672
+ outline: 2px solid var(--blue-text);
673
+ outline-offset: 1px;
674
+ }
675
+
676
+ .copy-btn.copied {
677
+ color: var(--green-text);
678
+ border-color: var(--green-bg);
679
+ background: var(--green-bg);
680
+ }
681
+
682
+ .copy-btn svg { display: block; }
683
+
684
+ .copy-btn.pre-copy {
685
+ position: absolute;
686
+ top: 8px;
687
+ right: 8px;
688
+ opacity: 0;
689
+ transition: opacity 200ms ease, color 200ms ease, border-color 200ms ease, background 200ms ease;
690
+ }
691
+
692
+ .markdown pre:hover .copy-btn.pre-copy,
693
+ .copy-btn.pre-copy:focus-visible,
694
+ .copy-btn.pre-copy.copied {
695
+ opacity: 1;
696
+ }
697
+
698
+ .action.copied {
699
+ color: var(--green-text);
700
+ border-color: var(--green-bg);
701
+ background: var(--green-bg);
702
+ }
703
+
704
+ .action.primary.copied {
705
+ color: var(--green-text);
706
+ border-color: var(--green-bg);
707
+ background: var(--green-bg);
708
+ }
709
+
710
+ .visually-hidden {
711
+ position: absolute;
712
+ width: 1px;
713
+ height: 1px;
714
+ margin: -1px;
715
+ padding: 0;
716
+ overflow: hidden;
717
+ clip: rect(0, 0, 0, 0);
718
+ white-space: nowrap;
719
+ border: 0;
720
+ }
721
+
722
+ .markdown {
723
+ max-width: 780px;
724
+ font-size: 16px;
725
+ line-height: 1.72;
726
+ color: var(--text);
727
+ }
728
+
729
+ .markdown h1, .markdown h2, .markdown h3 {
730
+ color: var(--ink);
731
+ line-height: 1.1;
732
+ letter-spacing: -0.018em;
733
+ margin: 1.7em 0 0.55em;
734
+ }
735
+
736
+ .markdown h1 {
737
+ font-family: var(--serif);
738
+ font-size: 32px;
739
+ font-weight: 500;
740
+ letter-spacing: -0.022em;
741
+ }
742
+
743
+ .markdown h2 {
744
+ font-family: var(--display);
745
+ font-size: 24px;
746
+ font-weight: 620;
747
+ }
748
+
749
+ .markdown h3 { font-size: 18px; }
750
+
751
+ .markdown h4, .markdown h5, .markdown h6 {
752
+ color: var(--ink);
753
+ line-height: 1.2;
754
+ margin: 1.4em 0 0.45em;
755
+ }
756
+ .markdown h4 { font-size: 16px; font-weight: 650; letter-spacing: -0.01em; }
757
+ .markdown h5 {
758
+ font-family: var(--mono);
759
+ font-size: 12px;
760
+ font-weight: 650;
761
+ text-transform: uppercase;
762
+ letter-spacing: 0.06em;
763
+ color: var(--muted);
764
+ }
765
+ .markdown h6 {
766
+ font-family: var(--mono);
767
+ font-size: 11px;
768
+ font-weight: 650;
769
+ text-transform: uppercase;
770
+ letter-spacing: 0.08em;
771
+ color: var(--faint);
772
+ }
773
+
774
+ .markdown p { margin: 0 0 1em; }
775
+ .markdown ul, .markdown ol { padding-left: 1.5em; margin: 0 0 1em; }
776
+ .markdown ul ul, .markdown ol ol, .markdown ul ol, .markdown ol ul { margin: 0.35em 0 0.1em; }
777
+ .markdown li { margin: 0.32em 0; }
778
+ .markdown li > p:last-child { margin-bottom: 0; }
779
+
780
+ .markdown ul.task-list, .markdown ul.task-list ul.task-list { list-style: none; padding-left: 0.2em; }
781
+ .markdown .task-item {
782
+ display: flex;
783
+ align-items: flex-start;
784
+ gap: 10px;
785
+ }
786
+ .markdown .task-marker {
787
+ flex: 0 0 16px;
788
+ width: 16px;
789
+ height: 16px;
790
+ display: inline-flex;
791
+ align-items: center;
792
+ justify-content: center;
793
+ border: 1px solid var(--line);
794
+ border-radius: 4px;
795
+ background: var(--paper);
796
+ color: var(--green-text);
797
+ margin-top: 3px;
798
+ }
799
+ .markdown .task-item.checked .task-marker {
800
+ background: var(--green-bg);
801
+ border-color: var(--green-bg);
802
+ }
803
+ .markdown .task-text { flex: 1; min-width: 0; overflow-wrap: anywhere; }
804
+ .markdown .task-item.checked .task-text { color: var(--muted); }
805
+
806
+ .markdown .table-wrap {
807
+ margin: 1.3em 0;
808
+ border: 1px solid var(--line);
809
+ border-radius: 10px;
810
+ overflow-x: auto;
811
+ }
812
+ .markdown table {
813
+ border-collapse: collapse;
814
+ width: 100%;
815
+ font-size: 14.5px;
816
+ }
817
+ .markdown th, .markdown td {
818
+ padding: 11px 14px;
819
+ text-align: left;
820
+ border-bottom: 1px solid var(--line);
821
+ vertical-align: top;
822
+ }
823
+ .markdown thead th {
824
+ background: var(--paper-soft);
825
+ font-weight: 650;
826
+ color: var(--ink);
827
+ }
828
+ .markdown tbody tr:last-child td { border-bottom: 0; }
829
+ .markdown tbody tr:hover { background: var(--paper-soft); }
830
+
831
+ .markdown pre.has-lang code { display: block; margin-top: 18px; }
832
+ .markdown pre .code-lang {
833
+ position: absolute;
834
+ top: 9px;
835
+ left: 14px;
836
+ font-family: var(--mono);
837
+ font-size: 10.5px;
838
+ letter-spacing: 0.05em;
839
+ text-transform: uppercase;
840
+ color: var(--faint);
841
+ pointer-events: none;
842
+ user-select: none;
843
+ }
844
+
845
+ .markdown .mermaid-block {
846
+ margin: 1.3em 0;
847
+ padding: 0;
848
+ }
849
+ .markdown .mermaid-block figcaption {
850
+ font-family: var(--mono);
851
+ font-size: 10.5px;
852
+ letter-spacing: 0.06em;
853
+ text-transform: uppercase;
854
+ color: var(--muted);
855
+ margin-bottom: 6px;
856
+ }
857
+ .markdown .mermaid-block pre { margin: 0; }
858
+
859
+ .markdown hr.rule {
860
+ border: 0;
861
+ border-top: 1px solid var(--line);
862
+ margin: 2em 0;
863
+ }
864
+
865
+ .markdown a, .wikilink {
866
+ color: var(--blue-text);
867
+ text-decoration: none;
868
+ border-bottom: 1px solid rgba(31, 108, 159, 0.25);
869
+ cursor: pointer;
870
+ }
871
+
872
+ .markdown code {
873
+ background: #f1f0ed;
874
+ border: 1px solid var(--line);
875
+ border-radius: 4px;
876
+ padding: 0.1em 0.35em;
877
+ font-family: var(--mono);
878
+ font-size: 0.88em;
879
+ }
880
+
881
+ .markdown pre {
882
+ position: relative;
883
+ background: #fbfbfa;
884
+ color: var(--ink);
885
+ border: 1px solid var(--line);
886
+ border-radius: 10px;
887
+ padding: 18px;
888
+ overflow: auto;
889
+ }
890
+
891
+ .markdown pre code {
892
+ background: transparent;
893
+ border: 0;
894
+ color: inherit;
895
+ padding: 0;
896
+ }
897
+
898
+ .markdown blockquote {
899
+ margin: 1.4em 0;
900
+ padding: 2px 0 2px 20px;
901
+ border-left: 2px solid #d9d5ce;
902
+ color: var(--muted);
903
+ font-family: var(--serif);
904
+ font-style: italic;
905
+ font-size: 17px;
906
+ line-height: 1.55;
907
+ }
908
+
909
+ .empty {
910
+ color: var(--muted);
911
+ padding: 40px;
912
+ text-align: center;
913
+ }
914
+
915
+ .outline {
916
+ border-right: 0;
917
+ overflow: auto;
918
+ padding: 28px 18px;
919
+ background: var(--paper-soft);
920
+ display: none;
921
+ }
922
+
923
+ .viewer-frame.outline-open .shell {
924
+ grid-template-columns: 380px minmax(0, 1fr) 320px;
925
+ }
926
+
927
+ .viewer-frame.outline-open .outline {
928
+ display: block;
929
+ }
930
+
931
+ .outline-title {
932
+ color: var(--ink);
933
+ font-family: var(--serif);
934
+ font-size: 26px;
935
+ font-weight: 500;
936
+ line-height: 1.04;
937
+ letter-spacing: -0.025em;
938
+ }
939
+
940
+ .outline-help {
941
+ color: var(--muted);
942
+ font-size: 12.5px;
943
+ line-height: 1.55;
944
+ margin: 10px 0 24px;
945
+ max-width: 36ch;
946
+ }
947
+
948
+ .outline-section { margin: 18px 0; }
949
+ .outline-label { margin: 18px 4px 8px; }
950
+
951
+ .outline-link {
952
+ width: 100%;
953
+ border: 1px solid transparent;
954
+ background: transparent;
955
+ text-align: left;
956
+ border-radius: 8px;
957
+ padding: 8px 9px;
958
+ display: flex;
959
+ gap: 9px;
960
+ align-items: center;
961
+ justify-content: space-between;
962
+ cursor: pointer;
963
+ }
964
+
965
+ .outline-link span:first-child {
966
+ min-width: 0;
967
+ overflow-wrap: anywhere;
968
+ }
969
+
970
+ .outline-link:hover, .outline-link.active, .workstream-block.active > .outline-link {
971
+ background: var(--paper);
972
+ border-color: var(--line);
973
+ }
974
+
975
+ .workstream-block {
976
+ border-left: 1px solid var(--line);
977
+ margin-left: 4px;
978
+ padding-left: 8px;
979
+ }
980
+
981
+ .subtasks { margin: 5px 0 10px 10px; }
982
+ .subtasks .outline-link { font-size: 12px; padding: 7px 8px; }
983
+ .small { padding: 10px; text-align: left; font-size: 12px; }
984
+
985
+ .reveal {
986
+ opacity: 0;
987
+ transform: translateY(12px);
988
+ transition: opacity 600ms cubic-bezier(0.16, 1, 0.3, 1), transform 600ms cubic-bezier(0.16, 1, 0.3, 1);
989
+ transition-delay: calc(var(--index, 0) * 60ms);
990
+ }
991
+
992
+ .reveal.visible {
993
+ opacity: 1;
994
+ transform: translateY(0);
995
+ }
996
+
997
+ @media (prefers-reduced-motion: reduce) {
998
+ .reveal {
999
+ opacity: 1;
1000
+ transform: none;
1001
+ transition: none;
1002
+ }
1003
+ }
1004
+
1005
+ @media (max-width: 1180px) {
1006
+ .shell { grid-template-columns: 320px minmax(0, 1fr); }
1007
+ .viewer-frame.outline-open .shell { grid-template-columns: 320px minmax(0, 1fr); }
1008
+ .reader-inner { padding: 52px 56px 92px; }
1009
+ }
1010
+
1011
+ @media (max-width: 820px) {
1012
+ #app { padding: 10px; }
1013
+ .viewer-frame { min-height: calc(100vh - 20px); }
1014
+ .top-bar {
1015
+ height: auto;
1016
+ flex-wrap: wrap;
1017
+ gap: 12px 18px;
1018
+ padding: 14px 18px;
1019
+ }
1020
+ .brand-mark {
1021
+ padding-right: 0;
1022
+ border-right: 0;
1023
+ font-size: 20px;
1024
+ }
1025
+ .tabs { width: 100%; gap: 4px; flex-wrap: wrap; }
1026
+ .tab-more { display: none; }
1027
+ .tab-dropdown { display: none !important; }
1028
+ .shell { display: block; height: auto; }
1029
+ .list, .reader, .outline {
1030
+ height: auto;
1031
+ border-right: 0;
1032
+ border-bottom: 1px solid var(--line);
1033
+ }
1034
+ .outline { display: none; }
1035
+ .viewer-frame.outline-open .outline { display: block; }
1036
+ .list, .outline { padding: 20px; }
1037
+ .reader-top { display: block; }
1038
+ .reader-actions { margin: 14px 0 0; }
1039
+ .reader-inner { padding: 32px 24px 56px; }
1040
+ .reader h1 { font-size: 34px; }
1041
+ .properties { grid-template-columns: 1fr; }
1042
+ }