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,16 @@
1
+ {% if session.beats.size > 0 %}
2
+ <section class="content-section">
3
+ <h2 class="content-section__heading">Execution Path</h2>
4
+ <ol class="beats-list">
5
+ {% for beat in session.beats %}
6
+ <li class="beat">
7
+ <span class="beat__number">{{ beat.stepNumber }}</span>
8
+ <div class="beat__content">
9
+ <strong class="beat__title">{{ beat.title }}</strong>
10
+ <p class="beat__body">{{ beat.body }}</p>
11
+ </div>
12
+ </li>
13
+ {% endfor %}
14
+ </ol>
15
+ </section>
16
+ {% endif %}
@@ -0,0 +1,9 @@
1
+ <nav class="breadcrumb">
2
+ <a href="/@{{ user.username }}">{{ user.username }}</a>
3
+ {% if projectSlug %}
4
+ <span class="breadcrumb__sep" aria-hidden="true">/</span>
5
+ <a href="/@{{ user.username }}/p/{{ projectSlug }}">{{ projectSlug }}</a>
6
+ {% endif %}
7
+ <span class="breadcrumb__sep" aria-hidden="true">/</span>
8
+ <span>{{ session.title }}</span>
9
+ </nav>
@@ -0,0 +1,7 @@
1
+ <div class="export-footer">
2
+ {% if sessionBaseUrl %}
3
+ <span class="export-footer__text">exported from heyi.am</span>
4
+ {% else %}
5
+ <span class="export-footer__text">built with <a href="https://heyiam.com" target="_blank" rel="noopener noreferrer">heyiam.com</a></span>
6
+ {% endif %}
7
+ </div>
@@ -0,0 +1,7 @@
1
+ <div class="card">
2
+ <div class="section-header">
3
+ <h3 class="section-header__title">Project growth</h3>
4
+ <span class="section-header__meta">cumulative LOC</span>
5
+ </div>
6
+ <div data-growth-chart data-total-loc="{{ project.totalLoc }}" data-total-files="{{ project.totalFilesChanged }}" data-sessions='{{ growthJson | raw }}'></div>
7
+ </div>
@@ -0,0 +1,20 @@
1
+ <div class="card">
2
+ <div class="section-header">
3
+ <h3 class="section-header__title">Key decisions</h3>
4
+ <span class="section-header__meta">signal</span>
5
+ </div>
6
+ {% if arc.size > 0 %}
7
+ <div class="note-stack">
8
+ {% for phase in arc limit: 3 %}
9
+ <div class="note">
10
+ <div class="note__title">{{ phase.title }}</div>
11
+ <div class="note__body">{{ phase.description }}</div>
12
+ </div>
13
+ {% endfor %}
14
+ </div>
15
+ {% else %}
16
+ <div class="note">
17
+ <div class="note__body">Enhance this project to extract key decisions.</div>
18
+ </div>
19
+ {% endif %}
20
+ </div>
@@ -0,0 +1,16 @@
1
+ {% if project.repoUrl or project.projectUrl %}
2
+ <div class="project-links" data-editable="links">
3
+ {% if project.repoUrl %}
4
+ <a href="{{ project.repoUrl }}" target="_blank" rel="noopener noreferrer" class="project-link">
5
+ <svg class="project-link__icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/></svg>
6
+ {{ project.repoUrl | stripProtocol }}
7
+ </a>
8
+ {% endif %}
9
+ {% if project.projectUrl %}
10
+ <a href="{{ project.projectUrl }}" target="_blank" rel="noopener noreferrer" class="project-link">
11
+ <svg class="project-link__icon" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M6.5 10.5l3-3m-1.5-2a2.5 2.5 0 013.54 3.54l-1.5 1.5m-4.08-1.08a2.5 2.5 0 01-3.54-3.54l1.5-1.5"/></svg>
12
+ {{ project.projectUrl | stripProtocol }}
13
+ </a>
14
+ {% endif %}
15
+ </div>
16
+ {% endif %}
@@ -0,0 +1,8 @@
1
+ {% if narrative != blank %}
2
+ <div class="card">
3
+ <div class="section-header">
4
+ <h3 class="section-header__title">Narrative summary</h3>
5
+ </div>
6
+ <p class="narrative-text">{{ narrative }}</p>
7
+ </div>
8
+ {% endif %}
@@ -0,0 +1,20 @@
1
+ {% if arc.size > 0 %}
2
+ <div class="card">
3
+ <div class="section-header">
4
+ <h3 class="section-header__title">Project phases</h3>
5
+ <span class="section-header__meta">timeline</span>
6
+ </div>
7
+ <div class="phase-timeline">
8
+ <div class="phase-timeline__line"></div>
9
+ {% for phase in arc %}
10
+ <div class="phase-timeline__item">
11
+ <div class="phase-timeline__dot"></div>
12
+ <div class="phase-timeline__label">{{ phase.title }}</div>
13
+ <div class="note">
14
+ <div class="note__body">{{ phase.description }}</div>
15
+ </div>
16
+ </div>
17
+ {% endfor %}
18
+ </div>
19
+ </div>
20
+ {% endif %}
@@ -0,0 +1,20 @@
1
+ <div class="portfolio-header" data-editable="profile">
2
+ {% if user.photoUrl %}
3
+ <img src="{{ user.photoUrl }}" alt="{{ user.displayName }}" class="portfolio-photo">
4
+ {% endif %}
5
+ <h1 class="portfolio-name">{{ user.displayName }}</h1>
6
+ {% if user.bio != blank %}
7
+ <p class="portfolio-bio">{{ user.bio }}</p>
8
+ {% endif %}
9
+ {% if user.location != blank %}
10
+ <p class="portfolio-location">{{ user.location }}</p>
11
+ {% endif %}
12
+ <div class="portfolio-links">
13
+ {% if user.email != blank %}<a href="mailto:{{ user.email }}" class="portfolio-link">{{ user.email }}</a>{% endif %}
14
+ {% if user.linkedinUrl != blank %}<a href="{{ user.linkedinUrl }}" class="portfolio-link" target="_blank" rel="noopener">LinkedIn</a>{% endif %}
15
+ {% if user.githubUrl != blank %}<a href="{{ user.githubUrl }}" class="portfolio-link" target="_blank" rel="noopener">GitHub</a>{% endif %}
16
+ {% if user.twitterHandle != blank %}<a href="https://x.com/{{ user.twitterHandle }}" class="portfolio-link" target="_blank" rel="noopener">@{{ user.twitterHandle }}</a>{% endif %}
17
+ {% if user.websiteUrl != blank %}<a href="{{ user.websiteUrl }}" class="portfolio-link" target="_blank" rel="noopener">{{ user.websiteUrl | stripProtocol }}</a>{% endif %}
18
+ {% if user.resumeUrl != blank %}<a href="{{ user.resumeUrl }}" class="portfolio-link portfolio-link--resume" download>Resume (PDF)</a>{% endif %}
19
+ </div>
20
+ </div>
@@ -0,0 +1,16 @@
1
+ {% if projects.size > 0 %}
2
+ <div class="portfolio-projects">
3
+ {% for project in projects %}
4
+ <a href="{{ project.slug }}" class="project-card">
5
+ <h3 class="project-card__title">{{ project.title }}</h3>
6
+ {% if project.narrative != blank %}<p class="project-card__desc">{{ project.narrative | truncate: 120 }}</p>{% endif %}
7
+ <div class="project-card__meta">{{ project.totalSessions }} sessions &middot; {{ project.totalDurationMinutes | formatDuration }} &middot; {{ project.totalLoc | formatLoc }} lines</div>
8
+ {% if project.skills.size > 0 %}
9
+ <div class="project-card__skills">
10
+ {% for skill in project.skills limit: 5 %}<span class="chip">{{ skill }}</span>{% endfor %}
11
+ </div>
12
+ {% endif %}
13
+ </a>
14
+ {% endfor %}
15
+ </div>
16
+ {% endif %}
@@ -0,0 +1,19 @@
1
+ <div class="portfolio-stats" role="list" aria-label="Portfolio statistics">
2
+ <div class="stat-card" role="listitem"><div class="stat-card__value">{{ projects.size }}</div><div class="stat-card__label">Projects</div></div>
3
+ <div class="stat-card" role="listitem"><div class="stat-card__value">{{ totalSessions }}</div><div class="stat-card__label">Sessions</div></div>
4
+ <div class="stat-card" role="listitem"><div class="stat-card__value">{{ totalLoc | formatLoc }}</div><div class="stat-card__label">Lines Changed</div></div>
5
+ {% unless hideDuration %}
6
+ {% if efficiencyMultiplier %}
7
+ <div class="stat-card" role="listitem">
8
+ <div class="stat-card__value">{{ totalDurationMinutes | formatDuration }}</div>
9
+ <div class="stat-card__label">You</div>
10
+ </div>
11
+ <div class="stat-card" role="listitem">
12
+ <div class="stat-card__value" style="color: var(--accent, #084471);">{{ totalAgentDurationMinutes | formatDuration }}</div>
13
+ <div class="stat-card__label">Agents</div>
14
+ </div>
15
+ {% else %}
16
+ <div class="stat-card" role="listitem"><div class="stat-card__value">{{ totalDurationMinutes | formatDuration }}</div><div class="stat-card__label">Total Time</div></div>
17
+ {% endif %}
18
+ {% endunless %}
19
+ </div>
@@ -0,0 +1,13 @@
1
+ {% if session.qaPairs.size > 0 %}
2
+ <section class="content-section">
3
+ <h2 class="content-section__heading">Q&amp;A</h2>
4
+ <div class="qa-list">
5
+ {% for qa in session.qaPairs %}
6
+ <div class="qa-pair">
7
+ <p class="qa-pair__question">{{ qa.question }}</p>
8
+ <p class="qa-pair__answer">{{ qa.answer }}</p>
9
+ </div>
10
+ {% endfor %}
11
+ </div>
12
+ </section>
13
+ {% endif %}
@@ -0,0 +1,15 @@
1
+ {% if project.screenshotUrl %}
2
+ <div class="browser-chrome" data-editable="screenshot">
3
+ <div class="browser-chrome__bar">
4
+ <span class="browser-chrome__dot browser-chrome__dot--red"></span>
5
+ <span class="browser-chrome__dot browser-chrome__dot--yellow"></span>
6
+ <span class="browser-chrome__dot browser-chrome__dot--green"></span>
7
+ </div>
8
+ <div class="browser-chrome__viewport">
9
+ <img src="{{ project.screenshotUrl }}" alt="Screenshot of {{ project.title }}" class="browser-chrome__img" loading="lazy" />
10
+ </div>
11
+ </div>
12
+ {% endif %}
13
+ {% unless project.screenshotUrl %}
14
+ <div data-editable="screenshot" class="screenshot-placeholder"></div>
15
+ {% endunless %}
@@ -0,0 +1,30 @@
1
+ {% if featuredSessions.size > 0 %}
2
+ <div class="card">
3
+ <div class="section-header">
4
+ <h3 class="section-header__title">Featured sessions</h3>
5
+ <span class="section-header__meta">{{ totalSessionCount }} total</span>
6
+ </div>
7
+ <div class="session-grid">
8
+ {% for session in featuredSessions %}
9
+ {% if sessionBaseUrl %}
10
+ <a href="{{ sessionBaseUrl }}/{{ session.slug | default: session.token }}{{ sessionSuffix }}" class="session-card-link">
11
+ {% endif %}
12
+ <div class="session-card" data-session-id="{{ session.token }}">
13
+ <div class="session-card__bar session-card__bar--{{ forloop.index0 | durationColor }}"></div>
14
+ <h4 class="session-card__title">{{ session.title }}</h4>
15
+ <span class="session-card__meta">
16
+ {{ session.durationMinutes | formatDuration }} &middot; {{ session.turns }} turns &middot; {{ session.locChanged | formatLoc }} lines
17
+ </span>
18
+ {% if session.skills.size > 0 %}
19
+ <div class="session-card__skills">
20
+ <span class="chip chip--violet">{{ session.skills[0] }}</span>
21
+ </div>
22
+ {% endif %}
23
+ </div>
24
+ {% if sessionBaseUrl %}
25
+ </a>
26
+ {% endif %}
27
+ {% endfor %}
28
+ </div>
29
+ </div>
30
+ {% endif %}
@@ -0,0 +1,39 @@
1
+ <header class="session-header">
2
+ <h1 class="session-header__title">{{ session.title }}</h1>
3
+
4
+ <div class="session-header__meta">
5
+ <time class="session-header__date" datetime="{{ session.recordedAt }}">
6
+ {{ session.recordedAt | formatDate }}
7
+ </time>
8
+ <span class="session-header__source">{{ session.sourceTool }}</span>
9
+ </div>
10
+
11
+ {% if session.devTake != blank %}
12
+ <blockquote class="session-header__devtake">
13
+ <p>{{ session.devTake }}</p>
14
+ </blockquote>
15
+ {% endif %}
16
+
17
+ {% if session.context != blank %}
18
+ <p class="session-header__context">{{ session.context }}</p>
19
+ {% endif %}
20
+
21
+ <div class="stat-grid stat-grid--4">
22
+ <span class="stat">
23
+ <span class="stat__value">{{ session.durationMinutes | formatDuration }}</span>
24
+ <span class="stat__label">active</span>
25
+ </span>
26
+ <span class="stat">
27
+ <span class="stat__value">{{ session.turns }}</span>
28
+ <span class="stat__label">turns</span>
29
+ </span>
30
+ <span class="stat">
31
+ <span class="stat__value">{{ session.locChanged | localeNumber }}</span>
32
+ <span class="stat__label">lines changed</span>
33
+ </span>
34
+ <span class="stat">
35
+ <span class="stat__value">{{ session.filesChanged }}</span>
36
+ <span class="stat__label">files</span>
37
+ </span>
38
+ </div>
39
+ </header>
@@ -0,0 +1,30 @@
1
+ <aside class="session-sidebar">
2
+ {% if session.toolBreakdown.size > 0 %}
3
+ <div class="sidebar-section">
4
+ <h3 class="sidebar-section__heading">Tool Usage</h3>
5
+ <ul class="tool-list">
6
+ {% for t in session.toolBreakdown %}
7
+ <li class="tool-list__item">
8
+ <span class="tool-list__name">{{ t.tool }}</span>
9
+ <span class="tool-list__count">{{ t.count }}</span>
10
+ </li>
11
+ {% endfor %}
12
+ </ul>
13
+ </div>
14
+ {% endif %}
15
+
16
+ {% if session.topFiles.size > 0 %}
17
+ <div class="sidebar-section">
18
+ <h3 class="sidebar-section__heading">Top Files</h3>
19
+ <ul class="file-list">
20
+ {% for f in session.topFiles %}
21
+ <li class="file-list__item">
22
+ <span class="file-list__path">{{ f.path }}</span>
23
+ <span class="file-list__adds">+{{ f.additions }}</span>
24
+ <span class="file-list__dels">-{{ f.deletions }}</span>
25
+ </li>
26
+ {% endfor %}
27
+ </ul>
28
+ </div>
29
+ {% endif %}
30
+ </aside>
@@ -0,0 +1,12 @@
1
+ {% if skills.size > 0 %}
2
+ <div class="card">
3
+ <div class="section-header">
4
+ <h3 class="section-header__title">Skills</h3>
5
+ </div>
6
+ <div class="chip-list">
7
+ {% for skill in skills %}
8
+ <span class="chip chip--violet">{{ skill }}</span>
9
+ {% endfor %}
10
+ </div>
11
+ </div>
12
+ {% endif %}
@@ -0,0 +1,22 @@
1
+ <div class="card">
2
+ <div class="section-header">
3
+ <h3 class="section-header__title">Source breakdown</h3>
4
+ <span class="section-header__meta">provenance</span>
5
+ </div>
6
+ <table class="source-table">
7
+ <thead>
8
+ <tr>
9
+ <th class="source-table__th">Source</th>
10
+ <th class="source-table__th">Count</th>
11
+ </tr>
12
+ </thead>
13
+ <tbody>
14
+ {% for src in sourceCounts %}
15
+ <tr>
16
+ <td class="source-table__td">{{ src.tool }}</td>
17
+ <td class="source-table__td">{{ src.count }}</td>
18
+ </tr>
19
+ {% endfor %}
20
+ </tbody>
21
+ </table>
22
+ </div>
@@ -0,0 +1,38 @@
1
+ <div class="stat-hero-layout">
2
+ <div class="stat-card stat-card--hero">
3
+ <div class="stat-card__label">{{ durationLabel }}</div>
4
+ <div class="stat-card__value">
5
+ {% if project.totalAgentDurationMinutes %}
6
+ {{ project.totalDurationMinutes | formatDuration }} / {{ project.totalAgentDurationMinutes | formatDuration }}
7
+ {% else %}
8
+ {{ project.totalDurationMinutes | formatDuration }}
9
+ {% endif %}
10
+ </div>
11
+ {% if efficiencyMultiplier %}
12
+ <div class="stat-card__sub">
13
+ <div class="stat-card__label">Efficiency multiplier</div>
14
+ <div class="stat-card__value stat-card__value--sm">{{ efficiencyMultiplier }}</div>
15
+ </div>
16
+ {% endif %}
17
+ </div>
18
+ <div class="stat-grid--compact">
19
+ <div class="stat-card">
20
+ <div class="stat-card__label">Sessions</div>
21
+ <div class="stat-card__value">{{ project.totalSessions }}</div>
22
+ </div>
23
+ <div class="stat-card">
24
+ <div class="stat-card__label">Lines changed</div>
25
+ <div class="stat-card__value">{{ project.totalLoc | formatLoc }}</div>
26
+ </div>
27
+ <div class="stat-card">
28
+ <div class="stat-card__label">Files</div>
29
+ <div class="stat-card__value">{{ project.totalFilesChanged }}</div>
30
+ </div>
31
+ {% if project.totalTokens %}
32
+ <div class="stat-card">
33
+ <div class="stat-card__label">Tokens</div>
34
+ <div class="stat-card__value">{{ project.totalTokens | formatTokens }}</div>
35
+ </div>
36
+ {% endif %}
37
+ </div>
38
+ </div>
@@ -0,0 +1,7 @@
1
+ <div class="card">
2
+ <div class="section-header">
3
+ <h3 class="section-header__title">Work timeline</h3>
4
+ <span class="section-header__meta">sessions over time</span>
5
+ </div>
6
+ <div data-work-timeline data-sessions='{{ sessionsJson | raw }}'></div>
7
+ </div>
@@ -1,11 +1,11 @@
1
1
  <div class="heyiam-project" data-render-version="2"{% if sessionBaseUrl %} data-session-base-url="{{ sessionBaseUrl }}"{% endif %} data-username="{{ user.username }}" data-project-slug="{{ project.slug }}">
2
2
 
3
3
  {%- comment -%} Title {%- endcomment -%}
4
- <h1 class="project-title">{{ project.title }}</h1>
4
+ <h1 class="project-title" data-editable="title">{{ project.title }}</h1>
5
5
 
6
6
  {%- comment -%} Project links {%- endcomment -%}
7
7
  {% if project.repoUrl or project.projectUrl %}
8
- <div class="project-links">
8
+ <div class="project-links" data-editable="links">
9
9
  {% if project.repoUrl %}
10
10
  <a href="{{ project.repoUrl }}" target="_blank" rel="noopener noreferrer" class="project-link">
11
11
  <svg class="project-link__icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/></svg>
@@ -23,7 +23,7 @@
23
23
 
24
24
  {%- comment -%} Screenshot with browser chrome {%- endcomment -%}
25
25
  {% if project.screenshotUrl %}
26
- <div class="browser-chrome">
26
+ <div class="browser-chrome" data-editable="screenshot">
27
27
  <div class="browser-chrome__bar">
28
28
  <span class="browser-chrome__dot browser-chrome__dot--red"></span>
29
29
  <span class="browser-chrome__dot browser-chrome__dot--yellow"></span>
@@ -34,6 +34,9 @@
34
34
  </div>
35
35
  </div>
36
36
  {% endif %}
37
+ {% unless project.screenshotUrl %}
38
+ <div data-editable="screenshot" class="screenshot-placeholder"></div>
39
+ {% endunless %}
37
40
 
38
41
  {%- comment -%} Narrative {%- endcomment -%}
39
42
  {% if project.narrative != blank %}
@@ -195,7 +198,7 @@
195
198
  <div class="session-grid">
196
199
  {% for session in featuredSessions %}
197
200
  {% if sessionBaseUrl %}
198
- <a href="{{ sessionBaseUrl }}/{{ session.slug | default: session.token }}.html" class="session-card-link">
201
+ <a href="{{ sessionBaseUrl }}/{{ session.slug | default: session.token }}{{ sessionSuffix }}" class="session-card-link">
199
202
  {% endif %}
200
203
  <div class="session-card" data-session-id="{{ session.token }}">
201
204
  <div class="session-card__bar session-card__bar--{{ forloop.index0 | durationColor }}"></div>