heyiam 0.2.28 → 0.3.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 (177) hide show
  1. package/README.md +45 -0
  2. package/dist/config.js +10 -1
  3. package/dist/db.js +1 -2
  4. package/dist/export.js +40 -25
  5. package/dist/format-utils.js +5 -0
  6. package/dist/index.js +168 -0
  7. package/dist/mount.js +300 -102
  8. package/dist/parsers/claude.js +2 -28
  9. package/dist/parsers/codex.js +2 -26
  10. package/dist/parsers/cursor.js +2 -26
  11. package/dist/parsers/duration.js +35 -0
  12. package/dist/parsers/gemini.js +2 -20
  13. package/dist/parsers/types.js +0 -1
  14. package/dist/public/assets/index-BZ65TU_Y.js +40 -0
  15. package/dist/public/assets/index-CqCaW2cb.css +1 -0
  16. package/dist/public/index.html +2 -2
  17. package/dist/redact.js +4 -104
  18. package/dist/render/build-render-data.js +9 -2
  19. package/dist/render/index.js +32 -5
  20. package/dist/render/liquid.js +147 -7
  21. package/dist/render/mock-data.js +303 -0
  22. package/dist/render/templates/aurora/portfolio.liquid +204 -0
  23. package/dist/render/templates/aurora/project.liquid +260 -0
  24. package/dist/render/templates/aurora/session.liquid +223 -0
  25. package/dist/render/templates/aurora/styles.css +1178 -0
  26. package/dist/render/templates/bauhaus/portfolio.liquid +179 -0
  27. package/dist/render/templates/bauhaus/project.liquid +300 -0
  28. package/dist/render/templates/bauhaus/session.liquid +333 -0
  29. package/dist/render/templates/bauhaus/styles.css +1641 -0
  30. package/dist/render/templates/blueprint/portfolio.liquid +167 -0
  31. package/dist/render/templates/blueprint/project.liquid +286 -0
  32. package/dist/render/templates/blueprint/session.liquid +248 -0
  33. package/dist/render/templates/blueprint/styles.css +1285 -0
  34. package/dist/render/templates/canvas/portfolio.liquid +215 -0
  35. package/dist/render/templates/canvas/project.liquid +235 -0
  36. package/dist/render/templates/canvas/session.liquid +223 -0
  37. package/dist/render/templates/canvas/styles.css +1436 -0
  38. package/dist/render/templates/carbon/portfolio.liquid +170 -0
  39. package/dist/render/templates/carbon/project.liquid +249 -0
  40. package/dist/render/templates/carbon/session.liquid +190 -0
  41. package/dist/render/templates/carbon/styles.css +1091 -0
  42. package/dist/render/templates/chalk/portfolio.liquid +199 -0
  43. package/dist/render/templates/chalk/project.liquid +245 -0
  44. package/dist/render/templates/chalk/session.liquid +215 -0
  45. package/dist/render/templates/chalk/styles.css +1157 -0
  46. package/dist/render/templates/circuit/portfolio.liquid +162 -0
  47. package/dist/render/templates/circuit/project.liquid +247 -0
  48. package/dist/render/templates/circuit/session.liquid +205 -0
  49. package/dist/render/templates/circuit/styles.css +1403 -0
  50. package/dist/render/templates/cosmos/portfolio.liquid +232 -0
  51. package/dist/render/templates/cosmos/project.liquid +327 -0
  52. package/dist/render/templates/cosmos/session.liquid +239 -0
  53. package/dist/render/templates/cosmos/styles.css +1151 -0
  54. package/dist/render/templates/daylight/portfolio.liquid +217 -0
  55. package/dist/render/templates/daylight/project.liquid +229 -0
  56. package/dist/render/templates/daylight/session.liquid +219 -0
  57. package/dist/render/templates/daylight/styles.css +1311 -0
  58. package/dist/render/templates/editorial/portfolio.liquid +126 -0
  59. package/dist/render/templates/editorial/project.liquid +202 -0
  60. package/dist/render/templates/editorial/session.liquid +171 -0
  61. package/dist/render/templates/editorial/styles.css +822 -0
  62. package/dist/render/templates/ember/portfolio.liquid +318 -0
  63. package/dist/render/templates/ember/project.liquid +232 -0
  64. package/dist/render/templates/ember/session.liquid +202 -0
  65. package/dist/render/templates/ember/styles.css +1283 -0
  66. package/dist/render/templates/glacier/portfolio.liquid +271 -0
  67. package/dist/render/templates/glacier/project.liquid +288 -0
  68. package/dist/render/templates/glacier/session.liquid +217 -0
  69. package/dist/render/templates/glacier/styles.css +1200 -0
  70. package/dist/render/templates/grid/portfolio.liquid +265 -0
  71. package/dist/render/templates/grid/project.liquid +306 -0
  72. package/dist/render/templates/grid/session.liquid +260 -0
  73. package/dist/render/templates/grid/styles.css +1441 -0
  74. package/dist/render/templates/kinetic/portfolio.liquid +170 -0
  75. package/dist/render/templates/kinetic/project.liquid +242 -0
  76. package/dist/render/templates/kinetic/session.liquid +228 -0
  77. package/dist/render/templates/kinetic/styles.css +944 -0
  78. package/dist/render/templates/meridian/portfolio.liquid +255 -0
  79. package/dist/render/templates/meridian/project.liquid +376 -0
  80. package/dist/render/templates/meridian/session.liquid +298 -0
  81. package/dist/render/templates/meridian/styles.css +1369 -0
  82. package/dist/render/templates/minimal/portfolio.liquid +71 -0
  83. package/dist/render/templates/minimal/project.liquid +154 -0
  84. package/dist/render/templates/minimal/session.liquid +140 -0
  85. package/dist/render/templates/minimal/styles.css +525 -0
  86. package/dist/render/templates/mono/portfolio.liquid +291 -0
  87. package/dist/render/templates/mono/project.liquid +275 -0
  88. package/dist/render/templates/mono/session.liquid +276 -0
  89. package/dist/render/templates/mono/styles.css +1016 -0
  90. package/dist/render/templates/neon/portfolio.liquid +217 -0
  91. package/dist/render/templates/neon/project.liquid +225 -0
  92. package/dist/render/templates/neon/session.liquid +195 -0
  93. package/dist/render/templates/neon/styles.css +1265 -0
  94. package/dist/render/templates/noir/portfolio.liquid +137 -0
  95. package/dist/render/templates/noir/project.liquid +220 -0
  96. package/dist/render/templates/noir/session.liquid +241 -0
  97. package/dist/render/templates/noir/styles.css +1223 -0
  98. package/dist/render/templates/obsidian/portfolio.liquid +257 -0
  99. package/dist/render/templates/obsidian/project.liquid +280 -0
  100. package/dist/render/templates/obsidian/session.liquid +241 -0
  101. package/dist/render/templates/obsidian/styles.css +1401 -0
  102. package/dist/render/templates/paper/portfolio.liquid +267 -0
  103. package/dist/render/templates/paper/project.liquid +235 -0
  104. package/dist/render/templates/paper/session.liquid +271 -0
  105. package/dist/render/templates/paper/styles.css +1509 -0
  106. package/dist/render/templates/parallax/portfolio.liquid +305 -0
  107. package/dist/render/templates/parallax/project.liquid +275 -0
  108. package/dist/render/templates/parallax/session.liquid +295 -0
  109. package/dist/render/templates/parallax/styles.css +1874 -0
  110. package/dist/render/templates/parchment/portfolio.liquid +290 -0
  111. package/dist/render/templates/parchment/project.liquid +289 -0
  112. package/dist/render/templates/parchment/session.liquid +346 -0
  113. package/dist/render/templates/parchment/styles.css +1397 -0
  114. package/dist/render/templates/partials/_beats.liquid +16 -0
  115. package/dist/render/templates/partials/_breadcrumb.liquid +9 -0
  116. package/dist/render/templates/partials/_footer.liquid +7 -0
  117. package/dist/render/templates/partials/_growth-chart.liquid +7 -0
  118. package/dist/render/templates/partials/_key-decisions.liquid +20 -0
  119. package/dist/render/templates/partials/_links.liquid +16 -0
  120. package/dist/render/templates/partials/_narrative.liquid +8 -0
  121. package/dist/render/templates/partials/_phases.liquid +20 -0
  122. package/dist/render/templates/partials/_portfolio-header.liquid +20 -0
  123. package/dist/render/templates/partials/_portfolio-projects.liquid +16 -0
  124. package/dist/render/templates/partials/_portfolio-stats.liquid +19 -0
  125. package/dist/render/templates/partials/_qa.liquid +13 -0
  126. package/dist/render/templates/partials/_screenshot.liquid +15 -0
  127. package/dist/render/templates/partials/_session-cards.liquid +30 -0
  128. package/dist/render/templates/partials/_session-header.liquid +39 -0
  129. package/dist/render/templates/partials/_session-sidebar.liquid +30 -0
  130. package/dist/render/templates/partials/_skills.liquid +12 -0
  131. package/dist/render/templates/partials/_source-breakdown.liquid +22 -0
  132. package/dist/render/templates/partials/_stats.liquid +38 -0
  133. package/dist/render/templates/partials/_work-timeline.liquid +7 -0
  134. package/dist/render/templates/project.liquid +7 -4
  135. package/dist/render/templates/radar/portfolio.liquid +233 -0
  136. package/dist/render/templates/radar/project.liquid +278 -0
  137. package/dist/render/templates/radar/session.liquid +300 -0
  138. package/dist/render/templates/radar/styles.css +1049 -0
  139. package/dist/render/templates/showcase/portfolio.liquid +231 -0
  140. package/dist/render/templates/showcase/project.liquid +237 -0
  141. package/dist/render/templates/showcase/session.liquid +210 -0
  142. package/dist/render/templates/showcase/styles.css +1279 -0
  143. package/dist/render/templates/signal/portfolio.liquid +227 -0
  144. package/dist/render/templates/signal/project.liquid +278 -0
  145. package/dist/render/templates/signal/session.liquid +282 -0
  146. package/dist/render/templates/signal/styles.css +1395 -0
  147. package/dist/render/templates/strata/portfolio.liquid +192 -0
  148. package/dist/render/templates/strata/project.liquid +282 -0
  149. package/dist/render/templates/strata/session.liquid +261 -0
  150. package/dist/render/templates/strata/styles.css +1350 -0
  151. package/dist/render/templates/styles.css +1190 -0
  152. package/dist/render/templates/terminal/portfolio.liquid +118 -0
  153. package/dist/render/templates/terminal/project.liquid +161 -0
  154. package/dist/render/templates/terminal/session.liquid +145 -0
  155. package/dist/render/templates/terminal/styles.css +492 -0
  156. package/dist/render/templates/verdant/portfolio.liquid +333 -0
  157. package/dist/render/templates/verdant/project.liquid +309 -0
  158. package/dist/render/templates/verdant/session.liquid +237 -0
  159. package/dist/render/templates/verdant/styles.css +1257 -0
  160. package/dist/render/templates/zen/portfolio.liquid +136 -0
  161. package/dist/render/templates/zen/project.liquid +187 -0
  162. package/dist/render/templates/zen/session.liquid +203 -0
  163. package/dist/render/templates/zen/styles.css +1207 -0
  164. package/dist/render/templates.js +90 -0
  165. package/dist/routes/context.js +15 -10
  166. package/dist/routes/enhance.js +17 -40
  167. package/dist/routes/export.js +14 -4
  168. package/dist/routes/preview.js +480 -108
  169. package/dist/routes/projects.js +11 -19
  170. package/dist/routes/publish.js +15 -17
  171. package/dist/routes/settings.js +94 -1
  172. package/dist/routes/sse.js +9 -0
  173. package/dist/server.js +8 -2
  174. package/dist/settings.js +17 -9
  175. package/package.json +2 -4
  176. package/dist/public/assets/index-B_d6DlEI.js +0 -21
  177. package/dist/public/assets/index-Dalqz2mC.css +0 -1
@@ -0,0 +1,260 @@
1
+ <div class="heyiam-project aurora" data-render-version="2" data-template="aurora"{% if sessionBaseUrl %} data-session-base-url="{{ sessionBaseUrl }}"{% endif %} data-username="{{ user.username }}" data-project-slug="{{ project.slug }}">
2
+
3
+ {%- comment -%} Aurora Header {%- endcomment -%}
4
+ <header class="aurora-header" role="banner">
5
+ <div class="aurora-breadcrumb fade-up" aria-label="Breadcrumb">
6
+ <a href="/{{ user.username }}">{{ user.username }}</a>
7
+ <span class="aurora-breadcrumb-sep">/</span>
8
+ <span aria-current="page">{{ project.slug }}</span>
9
+ </div>
10
+
11
+ <div class="aurora-project-hero fade-up">
12
+ <h1 data-editable="title">{{ project.title }}</h1>
13
+ {% if project.repoUrl or project.projectUrl %}
14
+ <div class="aurora-project-links">
15
+ {% if project.repoUrl %}
16
+ <a href="{{ project.repoUrl }}" target="_blank" rel="noopener">
17
+ <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22" stroke-linecap="round" stroke-linejoin="round"/></svg>
18
+ {{ project.repoUrl | stripProtocol }}
19
+ </a>
20
+ {% endif %}
21
+ {% if project.projectUrl %}
22
+ <a href="{{ project.projectUrl }}" target="_blank" rel="noopener">
23
+ <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6M15 3h6v6M10 14L21 3" stroke-linecap="round" stroke-linejoin="round"/></svg>
24
+ {{ project.projectUrl | stripProtocol }}
25
+ </a>
26
+ {% endif %}
27
+ </div>
28
+ {% endif %}
29
+ </div>
30
+ </header>
31
+
32
+ {%- comment -%} Screenshot {%- endcomment -%}
33
+ {% if project.screenshotUrl %}
34
+ <div class="aurora-screenshot fade-up">
35
+ <div class="aurora-screenshot-frame browser-chrome">
36
+ <div class="aurora-screenshot-chrome">
37
+ <div class="aurora-screenshot-dot"></div>
38
+ <div class="aurora-screenshot-dot"></div>
39
+ <div class="aurora-screenshot-dot"></div>
40
+ </div>
41
+ <img src="{{ project.screenshotUrl }}" alt="{{ project.title }} screenshot">
42
+ </div>
43
+ </div>
44
+ {% endif %}
45
+
46
+ {%- comment -%} Stats {%- endcomment -%}
47
+ <section class="aurora-stats aurora-stats--project fade-up" aria-label="Project statistics">
48
+ <div class="aurora-stat">
49
+ <div class="aurora-stat-number">{{ project.totalSessions }}</div>
50
+ <div class="aurora-stat-label">Sessions</div>
51
+ </div>
52
+ <div class="aurora-stat">
53
+ <div class="aurora-stat-number">{{ project.totalLoc | localeNumber }}</div>
54
+ <div class="aurora-stat-label">LOC</div>
55
+ </div>
56
+ <div class="aurora-stat">
57
+ <div class="aurora-stat-number">{{ project.totalFilesChanged }}</div>
58
+ <div class="aurora-stat-label">Files</div>
59
+ </div>
60
+ {% if project.totalTokens %}
61
+ <div class="aurora-stat">
62
+ <div class="aurora-stat-number">{{ project.totalTokens | formatTokens }}</div>
63
+ <div class="aurora-stat-label">Tokens</div>
64
+ </div>
65
+ {% endif %}
66
+ {% if efficiencyMultiplier %}
67
+ <div class="aurora-stat">
68
+ <div class="aurora-stat-number">{{ project.totalDurationMinutes | formatDuration }}</div>
69
+ <div class="aurora-stat-label">You</div>
70
+ </div>
71
+ <div class="aurora-stat">
72
+ <div class="aurora-stat-number">{{ project.totalAgentDurationMinutes | formatDuration }}</div>
73
+ <div class="aurora-stat-label">Agents</div>
74
+ </div>
75
+ {% else %}
76
+ <div class="aurora-stat">
77
+ <div class="aurora-stat-number">{{ project.totalDurationMinutes | formatDuration }}</div>
78
+ <div class="aurora-stat-label">Time</div>
79
+ </div>
80
+ {% endif %}
81
+ </section>
82
+
83
+ {%- comment -%} Leverage {%- endcomment -%}
84
+ {% if efficiencyMultiplier %}
85
+ <section class="aurora-leverage-section fade-up" aria-label="AI leverage" role="figure">
86
+ <div class="aurora-leverage-section__multi">{{ efficiencyMultiplier }}</div>
87
+ <div class="aurora-leverage-section__context">{{ project.totalDurationMinutes | formatDuration }} you &middot; <strong>{{ project.totalAgentDurationMinutes | formatDuration }}</strong> agents</div>
88
+ {% assign totalCombined = project.totalDurationMinutes | plus: project.totalAgentDurationMinutes %}
89
+ {% if totalCombined > 0 %}
90
+ {% assign humanPct = project.totalDurationMinutes | times: 100 | divided_by: totalCombined %}
91
+ {% assign agentPct = 100 | minus: humanPct %}
92
+ <div class="aurora-leverage-section__bar"><div class="aurora-leverage-section__bar-human" style="width:{{ humanPct }}%"></div><div class="aurora-leverage-section__bar-agent" style="width:{{ agentPct }}%"></div></div>
93
+ {% endif %}
94
+ </section>
95
+ {% endif %}
96
+
97
+ <div class="aurora-content">
98
+ {%- comment -%} Narrative {%- endcomment -%}
99
+ {% if project.narrative %}
100
+ <section class="aurora-section--content fade-up" aria-label="Project narrative">
101
+ <h2 class="aurora-section-title">The Story</h2>
102
+ <div class="aurora-narrative">
103
+ <p>{{ project.narrative }}</p>
104
+ </div>
105
+ </section>
106
+ {% endif %}
107
+
108
+ {%- comment -%} Work Timeline Chart (CSS-only bars) {%- endcomment -%}
109
+ {% if featuredSessions.size > 0 %}
110
+ <section class="aurora-section--content fade-up" aria-label="Work timeline">
111
+ <h2 class="aurora-section-title">Work Timeline</h2>
112
+ <div class="aurora-chart">
113
+ {% assign maxDuration = 1 %}
114
+ {% for s in featuredSessions %}
115
+ {% if s.durationMinutes > maxDuration %}
116
+ {% assign maxDuration = s.durationMinutes %}
117
+ {% endif %}
118
+ {% endfor %}
119
+ <div class="aurora-chart-bars" role="list" aria-label="Sessions by duration">
120
+ {% for s in featuredSessions %}
121
+ {% assign barPct = s.durationMinutes | times: 100 | divided_by: maxDuration %}
122
+ <div class="aurora-chart-row" role="listitem">
123
+ <div class="aurora-chart-label"><a href="{{ sessionBaseUrl }}/{{ s.slug }}{{ sessionSuffix }}">{{ s.title }}</a></div>
124
+ <div class="aurora-chart-bar-track">
125
+ <div class="aurora-chart-bar-fill{% if s.sourceTool == 'Cursor' %} aurora-chart-bar-fill--cursor{% endif %}" style="width: {{ barPct }}%" aria-label="{{ s.durationMinutes }} minutes">
126
+ {% if s.agentSummary and s.agentSummary.agents.size > 0 %}
127
+ <div class="aurora-chart-bar-agents">
128
+ {% for agent in s.agentSummary.agents %}
129
+ {% assign colorIdx = forloop.index0 | modulo: 6 %}
130
+ {% assign agentColors = '#0891b2,#059669,#7c3aed,#475569,#e11d48,#d97706' | split: ',' %}
131
+ <span class="aurora-chart-agent-dot" style="background: {{ agentColors[colorIdx] }}" title="{{ agent.role }}"></span>
132
+ {% endfor %}
133
+ </div>
134
+ {% endif %}
135
+ </div>
136
+ </div>
137
+ <div class="aurora-chart-value">{{ s.durationMinutes }}m</div>
138
+ </div>
139
+ {% endfor %}
140
+ </div>
141
+ </div>
142
+ </section>
143
+ {% endif %}
144
+
145
+ {%- comment -%} Phases {%- endcomment -%}
146
+ {% if arc.size > 0 %}
147
+ <section class="aurora-section--content fade-up" aria-label="Project phases">
148
+ <h2 class="aurora-section-title">Phases</h2>
149
+ <div class="aurora-phases" role="list">
150
+ {% for item in arc %}
151
+ <div class="aurora-phase" role="listitem">
152
+ <div class="aurora-phase-dot" aria-hidden="true"></div>
153
+ <div class="aurora-phase-title">{{ item.title }}</div>
154
+ {% if item.startDate %}
155
+ <div class="aurora-phase-dates">{{ item.startDate }}{% if item.endDate %} &ndash; {{ item.endDate }}{% endif %}</div>
156
+ {% endif %}
157
+ <div class="aurora-phase-desc">{{ item.description }}</div>
158
+ </div>
159
+ {% endfor %}
160
+ </div>
161
+ </section>
162
+ {% endif %}
163
+
164
+ {%- comment -%} Skills {%- endcomment -%}
165
+ {% if project.skills.size > 0 %}
166
+ <section class="aurora-section--content fade-up" aria-label="Skills used">
167
+ <h2 class="aurora-section-title">Skills</h2>
168
+ <div class="aurora-tags">
169
+ {% for skill in project.skills %}
170
+ <span class="aurora-tag chip">{{ skill }}</span>
171
+ {% endfor %}
172
+ </div>
173
+ </section>
174
+ {% endif %}
175
+
176
+ {%- comment -%} Key Decisions {%- endcomment -%}
177
+ {% if arc.size > 0 %}
178
+ <section class="aurora-section--content fade-up" aria-label="Key decisions">
179
+ <h2 class="aurora-section-title">Key Decisions</h2>
180
+ <ol class="aurora-decisions">
181
+ {% for item in arc %}
182
+ <li class="aurora-decision">
183
+ <span class="aurora-decision-num">{{ forloop.index }}</span>
184
+ <span class="aurora-decision-text">{{ item.description }}</span>
185
+ </li>
186
+ {% endfor %}
187
+ </ol>
188
+ </section>
189
+ {% endif %}
190
+
191
+ {%- comment -%} Source Breakdown {%- endcomment -%}
192
+ {% if sourceCounts.size > 0 %}
193
+ <section class="aurora-section--content fade-up" aria-label="Source breakdown">
194
+ <h2 class="aurora-section-title">Source Breakdown</h2>
195
+ {% assign totalSourceSessions = 0 %}
196
+ {% for src in sourceCounts %}
197
+ {% assign totalSourceSessions = totalSourceSessions | plus: src.count %}
198
+ {% endfor %}
199
+ <div class="aurora-source-bar">
200
+ <div class="aurora-source-track" role="img">
201
+ {% for src in sourceCounts %}
202
+ {% if totalSourceSessions > 0 %}
203
+ {% assign srcPct = src.count | times: 100.0 | divided_by: totalSourceSessions | round %}
204
+ {% endif %}
205
+ {% if forloop.first %}
206
+ <div class="aurora-source-fill-claude" style="width: {{ srcPct }}%"></div>
207
+ {% else %}
208
+ <div class="aurora-source-fill-cursor" style="width: {{ srcPct }}%"></div>
209
+ {% endif %}
210
+ {% endfor %}
211
+ </div>
212
+ <div class="aurora-source-labels">
213
+ {% for src in sourceCounts %}
214
+ {% if totalSourceSessions > 0 %}
215
+ {% assign srcPctDisplay = src.count | times: 100.0 | divided_by: totalSourceSessions | round %}
216
+ {% endif %}
217
+ {% if forloop.first %}
218
+ <span><span class="aurora-source-dot aurora-source-dot--claude"></span>{{ src.tool }} {{ srcPctDisplay }}%</span>
219
+ {% else %}
220
+ <span><span class="aurora-source-dot aurora-source-dot--cursor"></span>{{ src.tool }} {{ srcPctDisplay }}%</span>
221
+ {% endif %}
222
+ {% endfor %}
223
+ </div>
224
+ </div>
225
+ </section>
226
+ {% endif %}
227
+
228
+ {%- comment -%} Featured Sessions {%- endcomment -%}
229
+ {% if featuredSessions.size > 0 %}
230
+ <section class="aurora-section--content fade-up" aria-label="Featured sessions">
231
+ <h2 class="aurora-section-title">Featured Sessions</h2>
232
+ <div class="aurora-sessions">
233
+ {% for s in featuredSessions %}
234
+ <article class="aurora-session-card">
235
+ <h3><a href="{{ sessionBaseUrl }}/{{ s.slug }}{{ sessionSuffix }}">{{ s.title }}</a></h3>
236
+ <div class="aurora-session-meta">
237
+ <span>{{ s.durationMinutes | formatDuration }}</span>
238
+ <span>{{ s.locChanged | localeNumber }} LOC</span>
239
+ {% if s.agentSummary %}
240
+ <span>{{ s.agentSummary.agents.size }} agents</span>
241
+ {% endif %}
242
+ </div>
243
+ {% if s.skills.size > 0 %}
244
+ <span class="aurora-session-tag">{{ s.skills | first }}</span>
245
+ {% endif %}
246
+ </article>
247
+ {% endfor %}
248
+ </div>
249
+ </section>
250
+ {% endif %}
251
+ </div>
252
+
253
+ {%- comment -%} Footer {%- endcomment -%}
254
+ <footer class="aurora-footer">
255
+ <p>Built with <a href="https://heyi.am">heyi.am</a></p>
256
+ </footer>
257
+
258
+ {%- comment -%} Fade-up + stat counter animation {%- endcomment -%}
259
+
260
+ </div>
@@ -0,0 +1,223 @@
1
+ <div class="heyiam-session aurora" data-render-version="2" data-template="aurora">
2
+
3
+ {%- comment -%} Aurora Header {%- endcomment -%}
4
+ <header class="aurora-header" role="banner">
5
+ <div class="aurora-breadcrumb fade-up" aria-label="Breadcrumb">
6
+ <a href="/{{ user.username }}">{{ user.username }}</a>
7
+ {% if projectSlug %}
8
+ <span class="aurora-breadcrumb-sep">/</span>
9
+ <a href="/{{ user.username }}/{{ projectSlug }}">{{ projectSlug }}</a>
10
+ {% endif %}
11
+ <span class="aurora-breadcrumb-sep">/</span>
12
+ <span aria-current="page">{{ session.title }}</span>
13
+ </div>
14
+
15
+ <div class="aurora-session-hero fade-up">
16
+ <h1>{{ session.title }}</h1>
17
+ <div class="aurora-session-meta-row">
18
+ {% if session.recordedAt %}
19
+ <span class="aurora-session-meta-item">
20
+ <svg viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="4" width="18" height="18" rx="2" ry="2"/><line x1="16" y1="2" x2="16" y2="6"/><line x1="8" y1="2" x2="8" y2="6"/><line x1="3" y1="10" x2="21" y2="10"/></svg>
21
+ {{ session.recordedAt | formatDate }}
22
+ </span>
23
+ {% endif %}
24
+ {% if session.sourceTool %}
25
+ <span class="aurora-source-badge">{{ session.sourceTool }}</span>
26
+ {% endif %}
27
+ <span class="aurora-session-meta-item">
28
+ <svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>
29
+ {{ session.durationMinutes | formatDuration }}{% if session.wallClockMinutes %} ({{ session.wallClockMinutes | formatDuration }} wall){% endif %}
30
+ </span>
31
+ <span class="aurora-session-meta-item">{{ session.turns }} turns</span>
32
+ <span class="aurora-session-meta-item">{{ session.locChanged | localeNumber }} LOC</span>
33
+ <span class="aurora-session-meta-item">{{ session.filesChanged }} files</span>
34
+ </div>
35
+ </div>
36
+ </header>
37
+
38
+ {%- comment -%} Dev Take {%- endcomment -%}
39
+ {% if session.devTake %}
40
+ <div class="aurora-dev-take fade-up">
41
+ <blockquote class="aurora-dev-take-box">
42
+ {{ session.devTake }}
43
+ </blockquote>
44
+ </div>
45
+ {% endif %}
46
+
47
+ {%- comment -%} Two-column layout {%- endcomment -%}
48
+ <div class="aurora-layout">
49
+ <div class="aurora-main-content">
50
+
51
+ {%- comment -%} Narrative {%- endcomment -%}
52
+ {% if session.narrative %}
53
+ <section class="aurora-section--content fade-up" aria-label="Session narrative">
54
+ <h2 class="aurora-section-title aurora-section-title--sm">Narrative</h2>
55
+ <div class="aurora-narrative-section">
56
+ <p>{{ session.narrative }}</p>
57
+ </div>
58
+ </section>
59
+ {% endif %}
60
+
61
+ {%- comment -%} Highlights {%- endcomment -%}
62
+ {% if session.highlights.size > 0 %}
63
+ <section class="aurora-section--content fade-up" aria-label="Session highlights">
64
+ <h2 class="aurora-section-title aurora-section-title--sm">Highlights</h2>
65
+ <ul class="aurora-highlights highlights-list">
66
+ {% for h in session.highlights %}
67
+ <li>{{ h }}</li>
68
+ {% endfor %}
69
+ </ul>
70
+ </section>
71
+ {% endif %}
72
+
73
+ {%- comment -%} Execution Path (Beats) {%- endcomment -%}
74
+ {% if session.beats.size > 0 %}
75
+ <section class="aurora-section--content fade-up" aria-label="Execution path">
76
+ <h2 class="aurora-section-title aurora-section-title--sm">Execution Path</h2>
77
+ <div class="aurora-beats beats-list" role="list">
78
+ {% for beat in session.beats %}
79
+ <div class="aurora-beat" role="listitem">
80
+ <div class="aurora-beat-dot beat-dot" aria-hidden="true"></div>
81
+ <div class="aurora-beat-title">{{ beat.title }}</div>
82
+ <div class="aurora-beat-desc">{{ beat.body }}</div>
83
+ </div>
84
+ {% endfor %}
85
+ </div>
86
+ </section>
87
+ {% endif %}
88
+
89
+ {%- comment -%} Q&A {%- endcomment -%}
90
+ {% if session.qaPairs.size > 0 %}
91
+ <section class="aurora-section--content fade-up" aria-label="Questions and answers">
92
+ <h2 class="aurora-section-title aurora-section-title--sm">Q&amp;A</h2>
93
+ <div class="aurora-qa-list qa-pair">
94
+ {% for qa in session.qaPairs %}
95
+ <article class="aurora-qa-item">
96
+ <div class="aurora-qa-question">
97
+ <span class="aurora-qa-q-mark" aria-hidden="true">Q</span>
98
+ <span>{{ qa.question }}</span>
99
+ </div>
100
+ <div class="aurora-qa-answer">
101
+ {{ qa.answer }}
102
+ </div>
103
+ </article>
104
+ {% endfor %}
105
+ </div>
106
+ </section>
107
+ {% endif %}
108
+
109
+ {%- comment -%} Agent Summary {%- endcomment -%}
110
+ {% if session.agentSummary %}
111
+ <section class="aurora-section--content fade-up" aria-label="Agent summary">
112
+ <h2 class="aurora-section-title aurora-section-title--sm">Agent Summary</h2>
113
+ {% assign maxAgentLoc = 0 %}
114
+ {% for agent in session.agentSummary.agents %}
115
+ {% if agent.loc_changed > maxAgentLoc %}
116
+ {% assign maxAgentLoc = agent.loc_changed %}
117
+ {% endif %}
118
+ {% endfor %}
119
+ {% assign agent_colors = '#0891b2,#059669,#7c3aed,#475569,#e11d48,#d97706' | split: ',' %}
120
+ <div class="aurora-agents" role="list">
121
+ {% for agent in session.agentSummary.agents %}
122
+ <div class="aurora-agent-row" role="listitem">
123
+ <div class="aurora-agent-name">
124
+ {% assign colorIdx = forloop.index0 | modulo: 6 %}
125
+ <span class="aurora-agent-dot" style="background: {{ agent_colors[colorIdx] }}"></span>
126
+ {{ agent.role }}
127
+ </div>
128
+ <div class="aurora-agent-bar-track">
129
+ {% if maxAgentLoc > 0 %}
130
+ {% assign barPct = agent.loc_changed | times: 100 | divided_by: maxAgentLoc %}
131
+ {% else %}
132
+ {% assign barPct = 0 %}
133
+ {% endif %}
134
+ <div class="aurora-agent-bar-fill" style="width: {{ barPct }}%; background: {{ agent_colors[colorIdx] }}"></div>
135
+ </div>
136
+ <div class="aurora-agent-value">{{ agent.duration_minutes }}m</div>
137
+ <div class="aurora-agent-value">{{ agent.loc_changed }}</div>
138
+ </div>
139
+ {% endfor %}
140
+ </div>
141
+ </section>
142
+ {% endif %}
143
+
144
+ </div>
145
+
146
+ {%- comment -%} Sidebar {%- endcomment -%}
147
+ <aside class="aurora-sidebar" aria-label="Session details">
148
+ {%- comment -%} Tools Used {%- endcomment -%}
149
+ {% if session.toolBreakdown.size > 0 %}
150
+ <div class="aurora-sidebar-card fade-up">
151
+ <h2 class="aurora-sidebar-title">Tools Used</h2>
152
+ <div class="aurora-tools-list tool-list" role="list">
153
+ {% for t in session.toolBreakdown %}
154
+ <div class="aurora-tool-row" role="listitem">
155
+ <span class="aurora-tool-name">{{ t.tool }}</span>
156
+ <span class="aurora-tool-count">{{ t.count }}</span>
157
+ </div>
158
+ {% endfor %}
159
+ </div>
160
+ </div>
161
+ {% endif %}
162
+
163
+ {%- comment -%} Files Changed {%- endcomment -%}
164
+ {% if session.topFiles.size > 0 %}
165
+ <div class="aurora-sidebar-card fade-up">
166
+ <h2 class="aurora-sidebar-title">Files Changed</h2>
167
+ <div class="aurora-files-list file-list" role="list">
168
+ {% for f in session.topFiles %}
169
+ <div class="aurora-file-row" role="listitem">
170
+ <span class="aurora-file-name" title="{{ f.path }}">{{ f.path }}</span>
171
+ <span class="aurora-file-diff"><span class="aurora-file-adds">+{{ f.additions }}</span>{% if f.deletions > 0 %} <span class="aurora-file-dels">-{{ f.deletions }}</span>{% endif %}</span>
172
+ </div>
173
+ {% endfor %}
174
+ </div>
175
+ </div>
176
+ {% endif %}
177
+
178
+ {%- comment -%} Skills {%- endcomment -%}
179
+ {% if session.skills.size > 0 %}
180
+ <div class="aurora-sidebar-card fade-up">
181
+ <h2 class="aurora-sidebar-title">Skills</h2>
182
+ <div class="aurora-sidebar-tags">
183
+ {% for skill in session.skills %}
184
+ <span class="aurora-tag">{{ skill }}</span>
185
+ {% endfor %}
186
+ </div>
187
+ </div>
188
+ {% endif %}
189
+
190
+ {%- comment -%} Session Stats {%- endcomment -%}
191
+ <div class="aurora-sidebar-card fade-up">
192
+ <h2 class="aurora-sidebar-title">Stats</h2>
193
+ <div class="aurora-tools-list">
194
+ <div class="aurora-tool-row">
195
+ <span class="aurora-tool-name">Duration</span>
196
+ <span class="aurora-tool-count" style="color: var(--aurora-text);">{{ session.durationMinutes | formatDuration }}</span>
197
+ </div>
198
+ <div class="aurora-tool-row">
199
+ <span class="aurora-tool-name">Turns</span>
200
+ <span class="aurora-tool-count" style="color: var(--aurora-text);">{{ session.turns }}</span>
201
+ </div>
202
+ <div class="aurora-tool-row">
203
+ <span class="aurora-tool-name">LOC</span>
204
+ <span class="aurora-tool-count" style="color: var(--aurora-text);">{{ session.locChanged | localeNumber }}</span>
205
+ </div>
206
+ <div class="aurora-tool-row">
207
+ <span class="aurora-tool-name">Files</span>
208
+ <span class="aurora-tool-count" style="color: var(--aurora-text);">{{ session.filesChanged }}</span>
209
+ </div>
210
+ {% if session.sourceTool %}
211
+ <div class="aurora-tool-row">
212
+ <span class="aurora-tool-name">Source</span>
213
+ <span class="aurora-tool-count">{{ session.sourceTool }}</span>
214
+ </div>
215
+ {% endif %}
216
+ </div>
217
+ </div>
218
+ </aside>
219
+ </div>
220
+
221
+ {%- comment -%} Fade-up animation {%- endcomment -%}
222
+
223
+ </div>