heyiam 0.2.29 → 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.
- package/README.md +45 -0
- package/dist/config.js +10 -1
- package/dist/db.js +1 -2
- package/dist/export.js +40 -25
- package/dist/format-utils.js +5 -0
- package/dist/index.js +168 -0
- package/dist/mount.js +300 -102
- package/dist/parsers/claude.js +2 -28
- package/dist/parsers/codex.js +2 -26
- package/dist/parsers/cursor.js +2 -26
- package/dist/parsers/duration.js +35 -0
- package/dist/parsers/gemini.js +2 -20
- package/dist/parsers/types.js +0 -1
- package/dist/public/assets/index-BZ65TU_Y.js +40 -0
- package/dist/public/assets/index-CqCaW2cb.css +1 -0
- package/dist/public/index.html +2 -2
- package/dist/redact.js +4 -104
- package/dist/render/build-render-data.js +9 -2
- package/dist/render/index.js +32 -5
- package/dist/render/liquid.js +147 -7
- package/dist/render/mock-data.js +303 -0
- package/dist/render/templates/aurora/portfolio.liquid +204 -0
- package/dist/render/templates/aurora/project.liquid +260 -0
- package/dist/render/templates/aurora/session.liquid +223 -0
- package/dist/render/templates/aurora/styles.css +1178 -0
- package/dist/render/templates/bauhaus/portfolio.liquid +179 -0
- package/dist/render/templates/bauhaus/project.liquid +300 -0
- package/dist/render/templates/bauhaus/session.liquid +333 -0
- package/dist/render/templates/bauhaus/styles.css +1641 -0
- package/dist/render/templates/blueprint/portfolio.liquid +167 -0
- package/dist/render/templates/blueprint/project.liquid +286 -0
- package/dist/render/templates/blueprint/session.liquid +248 -0
- package/dist/render/templates/blueprint/styles.css +1285 -0
- package/dist/render/templates/canvas/portfolio.liquid +215 -0
- package/dist/render/templates/canvas/project.liquid +235 -0
- package/dist/render/templates/canvas/session.liquid +223 -0
- package/dist/render/templates/canvas/styles.css +1436 -0
- package/dist/render/templates/carbon/portfolio.liquid +170 -0
- package/dist/render/templates/carbon/project.liquid +249 -0
- package/dist/render/templates/carbon/session.liquid +190 -0
- package/dist/render/templates/carbon/styles.css +1091 -0
- package/dist/render/templates/chalk/portfolio.liquid +199 -0
- package/dist/render/templates/chalk/project.liquid +245 -0
- package/dist/render/templates/chalk/session.liquid +215 -0
- package/dist/render/templates/chalk/styles.css +1157 -0
- package/dist/render/templates/circuit/portfolio.liquid +162 -0
- package/dist/render/templates/circuit/project.liquid +247 -0
- package/dist/render/templates/circuit/session.liquid +205 -0
- package/dist/render/templates/circuit/styles.css +1403 -0
- package/dist/render/templates/cosmos/portfolio.liquid +232 -0
- package/dist/render/templates/cosmos/project.liquid +327 -0
- package/dist/render/templates/cosmos/session.liquid +239 -0
- package/dist/render/templates/cosmos/styles.css +1151 -0
- package/dist/render/templates/daylight/portfolio.liquid +217 -0
- package/dist/render/templates/daylight/project.liquid +229 -0
- package/dist/render/templates/daylight/session.liquid +219 -0
- package/dist/render/templates/daylight/styles.css +1311 -0
- package/dist/render/templates/editorial/portfolio.liquid +126 -0
- package/dist/render/templates/editorial/project.liquid +202 -0
- package/dist/render/templates/editorial/session.liquid +171 -0
- package/dist/render/templates/editorial/styles.css +822 -0
- package/dist/render/templates/ember/portfolio.liquid +318 -0
- package/dist/render/templates/ember/project.liquid +232 -0
- package/dist/render/templates/ember/session.liquid +202 -0
- package/dist/render/templates/ember/styles.css +1283 -0
- package/dist/render/templates/glacier/portfolio.liquid +271 -0
- package/dist/render/templates/glacier/project.liquid +288 -0
- package/dist/render/templates/glacier/session.liquid +217 -0
- package/dist/render/templates/glacier/styles.css +1200 -0
- package/dist/render/templates/grid/portfolio.liquid +265 -0
- package/dist/render/templates/grid/project.liquid +306 -0
- package/dist/render/templates/grid/session.liquid +260 -0
- package/dist/render/templates/grid/styles.css +1441 -0
- package/dist/render/templates/kinetic/portfolio.liquid +170 -0
- package/dist/render/templates/kinetic/project.liquid +242 -0
- package/dist/render/templates/kinetic/session.liquid +228 -0
- package/dist/render/templates/kinetic/styles.css +944 -0
- package/dist/render/templates/meridian/portfolio.liquid +255 -0
- package/dist/render/templates/meridian/project.liquid +376 -0
- package/dist/render/templates/meridian/session.liquid +298 -0
- package/dist/render/templates/meridian/styles.css +1369 -0
- package/dist/render/templates/minimal/portfolio.liquid +71 -0
- package/dist/render/templates/minimal/project.liquid +154 -0
- package/dist/render/templates/minimal/session.liquid +140 -0
- package/dist/render/templates/minimal/styles.css +525 -0
- package/dist/render/templates/mono/portfolio.liquid +291 -0
- package/dist/render/templates/mono/project.liquid +275 -0
- package/dist/render/templates/mono/session.liquid +276 -0
- package/dist/render/templates/mono/styles.css +1016 -0
- package/dist/render/templates/neon/portfolio.liquid +217 -0
- package/dist/render/templates/neon/project.liquid +225 -0
- package/dist/render/templates/neon/session.liquid +195 -0
- package/dist/render/templates/neon/styles.css +1265 -0
- package/dist/render/templates/noir/portfolio.liquid +137 -0
- package/dist/render/templates/noir/project.liquid +220 -0
- package/dist/render/templates/noir/session.liquid +241 -0
- package/dist/render/templates/noir/styles.css +1223 -0
- package/dist/render/templates/obsidian/portfolio.liquid +257 -0
- package/dist/render/templates/obsidian/project.liquid +280 -0
- package/dist/render/templates/obsidian/session.liquid +241 -0
- package/dist/render/templates/obsidian/styles.css +1401 -0
- package/dist/render/templates/paper/portfolio.liquid +267 -0
- package/dist/render/templates/paper/project.liquid +235 -0
- package/dist/render/templates/paper/session.liquid +271 -0
- package/dist/render/templates/paper/styles.css +1509 -0
- package/dist/render/templates/parallax/portfolio.liquid +305 -0
- package/dist/render/templates/parallax/project.liquid +275 -0
- package/dist/render/templates/parallax/session.liquid +295 -0
- package/dist/render/templates/parallax/styles.css +1874 -0
- package/dist/render/templates/parchment/portfolio.liquid +290 -0
- package/dist/render/templates/parchment/project.liquid +289 -0
- package/dist/render/templates/parchment/session.liquid +346 -0
- package/dist/render/templates/parchment/styles.css +1397 -0
- package/dist/render/templates/partials/_beats.liquid +16 -0
- package/dist/render/templates/partials/_breadcrumb.liquid +9 -0
- package/dist/render/templates/partials/_footer.liquid +7 -0
- package/dist/render/templates/partials/_growth-chart.liquid +7 -0
- package/dist/render/templates/partials/_key-decisions.liquid +20 -0
- package/dist/render/templates/partials/_links.liquid +16 -0
- package/dist/render/templates/partials/_narrative.liquid +8 -0
- package/dist/render/templates/partials/_phases.liquid +20 -0
- package/dist/render/templates/partials/_portfolio-header.liquid +20 -0
- package/dist/render/templates/partials/_portfolio-projects.liquid +16 -0
- package/dist/render/templates/partials/_portfolio-stats.liquid +19 -0
- package/dist/render/templates/partials/_qa.liquid +13 -0
- package/dist/render/templates/partials/_screenshot.liquid +15 -0
- package/dist/render/templates/partials/_session-cards.liquid +30 -0
- package/dist/render/templates/partials/_session-header.liquid +39 -0
- package/dist/render/templates/partials/_session-sidebar.liquid +30 -0
- package/dist/render/templates/partials/_skills.liquid +12 -0
- package/dist/render/templates/partials/_source-breakdown.liquid +22 -0
- package/dist/render/templates/partials/_stats.liquid +38 -0
- package/dist/render/templates/partials/_work-timeline.liquid +7 -0
- package/dist/render/templates/project.liquid +7 -4
- package/dist/render/templates/radar/portfolio.liquid +233 -0
- package/dist/render/templates/radar/project.liquid +278 -0
- package/dist/render/templates/radar/session.liquid +300 -0
- package/dist/render/templates/radar/styles.css +1049 -0
- package/dist/render/templates/showcase/portfolio.liquid +231 -0
- package/dist/render/templates/showcase/project.liquid +237 -0
- package/dist/render/templates/showcase/session.liquid +210 -0
- package/dist/render/templates/showcase/styles.css +1279 -0
- package/dist/render/templates/signal/portfolio.liquid +227 -0
- package/dist/render/templates/signal/project.liquid +278 -0
- package/dist/render/templates/signal/session.liquid +282 -0
- package/dist/render/templates/signal/styles.css +1395 -0
- package/dist/render/templates/strata/portfolio.liquid +192 -0
- package/dist/render/templates/strata/project.liquid +282 -0
- package/dist/render/templates/strata/session.liquid +261 -0
- package/dist/render/templates/strata/styles.css +1350 -0
- package/dist/render/templates/styles.css +1190 -0
- package/dist/render/templates/terminal/portfolio.liquid +118 -0
- package/dist/render/templates/terminal/project.liquid +161 -0
- package/dist/render/templates/terminal/session.liquid +145 -0
- package/dist/render/templates/terminal/styles.css +492 -0
- package/dist/render/templates/verdant/portfolio.liquid +333 -0
- package/dist/render/templates/verdant/project.liquid +309 -0
- package/dist/render/templates/verdant/session.liquid +237 -0
- package/dist/render/templates/verdant/styles.css +1257 -0
- package/dist/render/templates/zen/portfolio.liquid +136 -0
- package/dist/render/templates/zen/project.liquid +187 -0
- package/dist/render/templates/zen/session.liquid +203 -0
- package/dist/render/templates/zen/styles.css +1207 -0
- package/dist/render/templates.js +90 -0
- package/dist/routes/context.js +15 -10
- package/dist/routes/enhance.js +17 -40
- package/dist/routes/export.js +14 -4
- package/dist/routes/preview.js +480 -108
- package/dist/routes/projects.js +11 -19
- package/dist/routes/publish.js +15 -17
- package/dist/routes/settings.js +94 -1
- package/dist/routes/sse.js +9 -0
- package/dist/server.js +8 -2
- package/dist/settings.js +17 -9
- package/package.json +2 -4
- package/dist/public/assets/index-CC9G8EF1.js +0 -21
- package/dist/public/assets/index-Dalqz2mC.css +0 -1
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
<div class="heyiam-portfolio editorial" data-render-version="2" data-template="editorial" data-username="{{ user.username }}">
|
|
2
|
+
|
|
3
|
+
{%- comment -%} Hero {%- endcomment -%}
|
|
4
|
+
{% if hasProfile %}
|
|
5
|
+
<section class="ed-hero" aria-label="Developer profile">
|
|
6
|
+
<div class="ed-hero-content">
|
|
7
|
+
<div class="ed-hero-profile">
|
|
8
|
+
{% if user.photoUrl %}
|
|
9
|
+
<img src="{{ user.photoUrl }}" alt="{{ user.displayName }}" class="ed-profile-photo">
|
|
10
|
+
{% endif %}
|
|
11
|
+
<div class="ed-hero-info">
|
|
12
|
+
{% if user.displayName != blank %}
|
|
13
|
+
<h1 class="ed-hero-name">{{ user.displayName }}</h1>
|
|
14
|
+
{% endif %}
|
|
15
|
+
{% if user.bio %}
|
|
16
|
+
<p class="ed-hero-bio">{{ user.bio }}</p>
|
|
17
|
+
{% endif %}
|
|
18
|
+
{% if user.location %}
|
|
19
|
+
<span class="ed-hero-location"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg> {{ user.location }}</span>
|
|
20
|
+
{% endif %}
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
{% if user.email or user.phone or user.linkedinUrl or user.githubUrl or user.twitterHandle or user.websiteUrl %}
|
|
25
|
+
<div class="ed-contact-row">
|
|
26
|
+
{% if user.email %}
|
|
27
|
+
<a href="mailto:{{ user.email }}" class="ed-contact-link"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="4" width="20" height="16" rx="2"/><path d="m2 4 10 8 10-8"/></svg> {{ user.email }}</a>
|
|
28
|
+
{% endif %}
|
|
29
|
+
{% if user.phone %}
|
|
30
|
+
<a href="tel:{{ user.phone }}" class="ed-contact-link"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.127.96.361 1.903.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0 1 22 16.92z"/></svg> {{ user.phone }}</a>
|
|
31
|
+
{% endif %}
|
|
32
|
+
{% if user.linkedinUrl %}
|
|
33
|
+
<a href="{{ user.linkedinUrl }}" target="_blank" rel="noopener" class="ed-contact-link"><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M20.5 2h-17A1.5 1.5 0 002 3.5v17A1.5 1.5 0 003.5 22h17a1.5 1.5 0 001.5-1.5v-17A1.5 1.5 0 0020.5 2zM8 19H5v-9h3zM6.5 8.25A1.75 1.75 0 118.3 6.5a1.78 1.78 0 01-1.8 1.75zM19 19h-3v-4.74c0-1.42-.6-1.93-1.38-1.93A1.74 1.74 0 0013 14.19V19h-3v-9h2.9v1.3a3.11 3.11 0 012.7-1.4c1.55 0 3.36.86 3.36 3.66z"/></svg> LinkedIn</a>
|
|
34
|
+
{% endif %}
|
|
35
|
+
{% if user.githubUrl %}
|
|
36
|
+
<a href="{{ user.githubUrl }}" target="_blank" rel="noopener" class="ed-contact-link"><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"/></svg> GitHub</a>
|
|
37
|
+
{% endif %}
|
|
38
|
+
{% if user.twitterHandle %}
|
|
39
|
+
<a href="https://x.com/{{ user.twitterHandle }}" target="_blank" rel="noopener" class="ed-contact-link"><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg> @{{ user.twitterHandle }}</a>
|
|
40
|
+
{% endif %}
|
|
41
|
+
{% if user.websiteUrl %}
|
|
42
|
+
<a href="{{ user.websiteUrl }}" target="_blank" rel="noopener" class="ed-contact-link"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg> {{ user.websiteUrl | stripProtocol }}</a>
|
|
43
|
+
{% endif %}
|
|
44
|
+
</div>
|
|
45
|
+
{% endif %}
|
|
46
|
+
|
|
47
|
+
{% if user.resumeUrl %}
|
|
48
|
+
<div class="ed-resume-row">
|
|
49
|
+
<a href="{{ user.resumeUrl }}" class="ed-resume-btn"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="12" y1="18" x2="12" y2="12"/><polyline points="9 15 12 18 15 15"/></svg> Download Resume</a>
|
|
50
|
+
</div>
|
|
51
|
+
{% endif %}
|
|
52
|
+
</div>
|
|
53
|
+
</section>
|
|
54
|
+
{% endif %}
|
|
55
|
+
|
|
56
|
+
{%- comment -%} Stats grid {%- endcomment -%}
|
|
57
|
+
<section class="ed-stats-section" aria-label="Portfolio statistics">
|
|
58
|
+
<div class="ed-stats-grid">
|
|
59
|
+
<div class="ed-stat-card">
|
|
60
|
+
<span class="ed-stat-value">{{ projects.size }}</span>
|
|
61
|
+
<span class="ed-stat-label">Projects</span>
|
|
62
|
+
</div>
|
|
63
|
+
<div class="ed-stat-card">
|
|
64
|
+
<span class="ed-stat-value">{{ totalSessions }}</span>
|
|
65
|
+
<span class="ed-stat-label">Sessions</span>
|
|
66
|
+
</div>
|
|
67
|
+
<div class="ed-stat-card">
|
|
68
|
+
<span class="ed-stat-value">{{ totalLoc | localeNumber }}</span>
|
|
69
|
+
<span class="ed-stat-label">Lines Changed</span>
|
|
70
|
+
</div>
|
|
71
|
+
{% if efficiencyMultiplier %}
|
|
72
|
+
<div class="ed-stat-card ed-stat-card--leverage">
|
|
73
|
+
<div class="ed-leverage-row">
|
|
74
|
+
<span class="ed-leverage-item"><span class="ed-leverage-num">{{ totalDurationMinutes | formatDuration }}</span> <span class="ed-leverage-sub">you</span></span>
|
|
75
|
+
<span class="ed-leverage-item"><span class="ed-leverage-num ed-leverage-num--agent">{{ totalAgentDurationMinutes | formatDuration }}</span> <span class="ed-leverage-sub">agents</span></span>
|
|
76
|
+
<span class="ed-leverage-item"><span class="ed-leverage-num ed-leverage-num--multi">{{ efficiencyMultiplier }}</span> <span class="ed-leverage-sub">leverage</span></span>
|
|
77
|
+
</div>
|
|
78
|
+
{% assign totalCombined = totalDurationMinutes | plus: totalAgentDurationMinutes %}
|
|
79
|
+
{% if totalCombined > 0 %}
|
|
80
|
+
{% assign humanPct = totalDurationMinutes | times: 100 | divided_by: totalCombined %}
|
|
81
|
+
{% assign agentPct = 100 | minus: humanPct %}
|
|
82
|
+
<div class="ed-leverage-bar">
|
|
83
|
+
<div class="ed-leverage-bar__human" style="width: {{ humanPct }}%;"></div>
|
|
84
|
+
<div class="ed-leverage-bar__agent" style="width: {{ agentPct }}%;"></div>
|
|
85
|
+
</div>
|
|
86
|
+
{% endif %}
|
|
87
|
+
</div>
|
|
88
|
+
{% else %}
|
|
89
|
+
<div class="ed-stat-card">
|
|
90
|
+
<span class="ed-stat-value">{{ totalDurationMinutes | formatDuration }}</span>
|
|
91
|
+
<span class="ed-stat-label">Total Time</span>
|
|
92
|
+
</div>
|
|
93
|
+
{% endif %}
|
|
94
|
+
</div>
|
|
95
|
+
</section>
|
|
96
|
+
|
|
97
|
+
{%- comment -%} Projects {%- endcomment -%}
|
|
98
|
+
{% if projects.size > 0 %}
|
|
99
|
+
<section class="ed-projects-section" aria-label="Projects">
|
|
100
|
+
<h2 class="ed-section-title">Projects</h2>
|
|
101
|
+
<div class="ed-projects-grid">
|
|
102
|
+
{% for p in projects %}
|
|
103
|
+
<a href="/{{ user.username }}/{{ p.slug }}" class="ed-project-card">
|
|
104
|
+
<h3 class="ed-project-card-title">{{ p.title }}</h3>
|
|
105
|
+
{% if p.narrative %}
|
|
106
|
+
<p class="ed-project-card-narrative">{{ p.narrative }}</p>
|
|
107
|
+
{% endif %}
|
|
108
|
+
<div class="ed-project-card-stats">
|
|
109
|
+
<span class="ed-project-card-stat"><strong>{{ p.totalSessions }}</strong> sessions</span>
|
|
110
|
+
<span class="ed-project-card-stat"><strong>{{ p.totalLoc | localeNumber }}</strong> LOC</span>
|
|
111
|
+
<span class="ed-project-card-stat"><strong>{{ p.totalDurationMinutes | formatDuration }}</strong></span>
|
|
112
|
+
</div>
|
|
113
|
+
{% if p.skills.size > 0 %}
|
|
114
|
+
<div class="ed-chip-list">
|
|
115
|
+
{% for skill in p.skills %}
|
|
116
|
+
<span class="chip chip--violet">{{ skill }}</span>
|
|
117
|
+
{% endfor %}
|
|
118
|
+
</div>
|
|
119
|
+
{% endif %}
|
|
120
|
+
</a>
|
|
121
|
+
{% endfor %}
|
|
122
|
+
</div>
|
|
123
|
+
</section>
|
|
124
|
+
{% endif %}
|
|
125
|
+
|
|
126
|
+
</div>
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
<div class="heyiam-project editorial" data-render-version="2" data-template="editorial"{% if sessionBaseUrl %} data-session-base-url="{{ sessionBaseUrl }}"{% endif %} data-username="{{ user.username }}" data-project-slug="{{ project.slug }}">
|
|
2
|
+
|
|
3
|
+
{%- comment -%} Breadcrumb {%- endcomment -%}
|
|
4
|
+
<div class="ed-breadcrumb" aria-label="Breadcrumb">
|
|
5
|
+
<a href="/{{ user.username }}">{{ user.username }}</a>
|
|
6
|
+
<span class="ed-breadcrumb-sep">/</span>
|
|
7
|
+
<span>{{ project.slug }}</span>
|
|
8
|
+
</div>
|
|
9
|
+
|
|
10
|
+
{%- comment -%} Header {%- endcomment -%}
|
|
11
|
+
<header class="ed-project-header">
|
|
12
|
+
<h1 class="project-title" data-editable="title">{{ project.title }}</h1>
|
|
13
|
+
{% if project.repoUrl or project.projectUrl %}
|
|
14
|
+
<div class="ed-project-links">
|
|
15
|
+
{% if project.repoUrl %}
|
|
16
|
+
<a href="{{ project.repoUrl }}" target="_blank" rel="noopener" class="ed-project-link"><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"/></svg> {{ project.repoUrl | stripProtocol }}</a>
|
|
17
|
+
{% endif %}
|
|
18
|
+
{% if project.projectUrl %}
|
|
19
|
+
<a href="{{ project.projectUrl }}" target="_blank" rel="noopener" class="ed-project-link"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg> {{ project.projectUrl | stripProtocol }}</a>
|
|
20
|
+
{% endif %}
|
|
21
|
+
</div>
|
|
22
|
+
{% endif %}
|
|
23
|
+
</header>
|
|
24
|
+
|
|
25
|
+
{%- comment -%} Screenshot {%- endcomment -%}
|
|
26
|
+
{% if project.screenshotUrl %}
|
|
27
|
+
<div class="ed-screenshot-card">
|
|
28
|
+
<div class="browser-frame" data-editable="screenshot">
|
|
29
|
+
<div class="browser-frame__bar">
|
|
30
|
+
<div class="browser-frame__dot"></div>
|
|
31
|
+
<div class="browser-frame__dot"></div>
|
|
32
|
+
<div class="browser-frame__dot"></div>
|
|
33
|
+
<div class="browser-frame__url">Preview</div>
|
|
34
|
+
</div>
|
|
35
|
+
<div class="browser-frame__viewport">
|
|
36
|
+
<img src="{{ project.screenshotUrl }}" alt="{{ project.title }} screenshot">
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
{% endif %}
|
|
41
|
+
|
|
42
|
+
{%- comment -%} Narrative {%- endcomment -%}
|
|
43
|
+
{% if project.narrative %}
|
|
44
|
+
<section class="ed-card-section" aria-label="Project narrative">
|
|
45
|
+
<h2 class="ed-section-title">Narrative</h2>
|
|
46
|
+
<div class="ed-narrative">{{ project.narrative }}</div>
|
|
47
|
+
</section>
|
|
48
|
+
{% endif %}
|
|
49
|
+
|
|
50
|
+
{%- comment -%} Stats {%- endcomment -%}
|
|
51
|
+
<section class="ed-card-section" aria-label="Project statistics">
|
|
52
|
+
<div class="stat-grid">
|
|
53
|
+
<div class="stat-card">
|
|
54
|
+
<div class="stat-card__label">Sessions</div>
|
|
55
|
+
<div class="stat-card__value">{{ project.totalSessions }}</div>
|
|
56
|
+
</div>
|
|
57
|
+
<div class="stat-card">
|
|
58
|
+
<div class="stat-card__label">Lines Changed</div>
|
|
59
|
+
<div class="stat-card__value">{{ project.totalLoc | localeNumber }}</div>
|
|
60
|
+
</div>
|
|
61
|
+
<div class="stat-card">
|
|
62
|
+
<div class="stat-card__label">Files</div>
|
|
63
|
+
<div class="stat-card__value">{{ project.totalFilesChanged }}</div>
|
|
64
|
+
</div>
|
|
65
|
+
{% if project.totalTokens %}
|
|
66
|
+
<div class="stat-card">
|
|
67
|
+
<div class="stat-card__label">Tokens</div>
|
|
68
|
+
<div class="stat-card__value">{{ project.totalTokens | formatTokens }}</div>
|
|
69
|
+
</div>
|
|
70
|
+
{% endif %}
|
|
71
|
+
{% if efficiencyMultiplier %}
|
|
72
|
+
<div class="stat-card">
|
|
73
|
+
<div class="stat-card__label">{{ durationLabel }}</div>
|
|
74
|
+
<div class="stat-card__value">{{ project.totalDurationMinutes | formatDuration }}</div>
|
|
75
|
+
<div class="ed-leverage-inline">
|
|
76
|
+
<span class="ed-leverage-num--agent">{{ project.totalAgentDurationMinutes | formatDuration }}</span> agents
|
|
77
|
+
<span class="ed-leverage-num--multi">{{ efficiencyMultiplier }}</span> leverage
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
{% else %}
|
|
81
|
+
<div class="stat-card">
|
|
82
|
+
<div class="stat-card__label">Time</div>
|
|
83
|
+
<div class="stat-card__value">{{ project.totalDurationMinutes | formatDuration }}</div>
|
|
84
|
+
</div>
|
|
85
|
+
{% endif %}
|
|
86
|
+
</div>
|
|
87
|
+
</section>
|
|
88
|
+
|
|
89
|
+
{%- comment -%} Work timeline chart {%- endcomment -%}
|
|
90
|
+
{% if sessionsJson %}
|
|
91
|
+
<section class="ed-card-section" aria-label="Agent work timeline">
|
|
92
|
+
<h2 class="ed-section-title">Work Timeline</h2>
|
|
93
|
+
<div data-work-timeline data-sessions='{{ sessionsJson | raw }}'></div>
|
|
94
|
+
</section>
|
|
95
|
+
{% endif %}
|
|
96
|
+
|
|
97
|
+
{%- comment -%} Growth chart {%- endcomment -%}
|
|
98
|
+
{% if growthJson %}
|
|
99
|
+
<section class="ed-card-section" aria-label="Growth over time">
|
|
100
|
+
<h2 class="ed-section-title">Growth</h2>
|
|
101
|
+
<div data-growth-chart data-project-slug="{{ project.slug }}" data-sessions='{{ growthJson | raw }}'></div>
|
|
102
|
+
</section>
|
|
103
|
+
{% endif %}
|
|
104
|
+
|
|
105
|
+
{%- comment -%} Key decisions + Source breakdown {%- endcomment -%}
|
|
106
|
+
{% if arc.size > 0 or sourceCounts.size > 0 %}
|
|
107
|
+
<div class="two-col">
|
|
108
|
+
{% if arc.size > 0 %}
|
|
109
|
+
<section class="ed-card-section" aria-label="Key decisions">
|
|
110
|
+
<h2 class="ed-section-title">Key Decisions</h2>
|
|
111
|
+
{% for item in arc %}
|
|
112
|
+
<div class="ed-decision-item">
|
|
113
|
+
<span class="ed-decision-num">{{ item.phase | prepend: '0' | slice: -2, 2 }}</span>
|
|
114
|
+
<span class="ed-decision-text">{{ item.description }}</span>
|
|
115
|
+
</div>
|
|
116
|
+
{% endfor %}
|
|
117
|
+
</section>
|
|
118
|
+
{% endif %}
|
|
119
|
+
{% if sourceCounts.size > 0 %}
|
|
120
|
+
<section class="ed-card-section" aria-label="Source breakdown">
|
|
121
|
+
<h2 class="ed-section-title">Source Breakdown</h2>
|
|
122
|
+
{% assign totalSourceSessions = 0 %}
|
|
123
|
+
{% for src in sourceCounts %}
|
|
124
|
+
{% assign totalSourceSessions = totalSourceSessions | plus: src.count %}
|
|
125
|
+
{% endfor %}
|
|
126
|
+
{% for src in sourceCounts %}
|
|
127
|
+
<div class="ed-source-item">
|
|
128
|
+
<span class="ed-source-name">{{ src.tool }}</span>
|
|
129
|
+
<div class="ed-source-bar-wrap">
|
|
130
|
+
{% if totalSourceSessions > 0 %}
|
|
131
|
+
{% assign srcPct = src.count | times: 100 | divided_by: totalSourceSessions %}
|
|
132
|
+
<div class="ed-source-bar"><div class="ed-source-fill" style="width: {{ srcPct }}%;"></div></div>
|
|
133
|
+
{% endif %}
|
|
134
|
+
</div>
|
|
135
|
+
<span class="ed-source-count">{{ src.count }} session{% if src.count != 1 %}s{% endif %}</span>
|
|
136
|
+
</div>
|
|
137
|
+
{% endfor %}
|
|
138
|
+
</section>
|
|
139
|
+
{% endif %}
|
|
140
|
+
</div>
|
|
141
|
+
{% endif %}
|
|
142
|
+
|
|
143
|
+
{%- comment -%} Phases {%- endcomment -%}
|
|
144
|
+
{% if arc.size > 0 %}
|
|
145
|
+
<section class="ed-card-section" aria-label="Project phases">
|
|
146
|
+
<h2 class="ed-section-title">Project Phases</h2>
|
|
147
|
+
<div class="ed-phases">
|
|
148
|
+
{% for item in arc %}
|
|
149
|
+
<div class="ed-phase-item">
|
|
150
|
+
<div class="ed-phase-marker">{{ forloop.index }}</div>
|
|
151
|
+
<div class="ed-phase-content">
|
|
152
|
+
<div class="ed-phase-title">{{ item.title }}</div>
|
|
153
|
+
<div class="ed-phase-desc">{{ item.description }}</div>
|
|
154
|
+
</div>
|
|
155
|
+
</div>
|
|
156
|
+
{% endfor %}
|
|
157
|
+
</div>
|
|
158
|
+
</section>
|
|
159
|
+
{% endif %}
|
|
160
|
+
|
|
161
|
+
{%- comment -%} Skills {%- endcomment -%}
|
|
162
|
+
{% if project.skills.size > 0 %}
|
|
163
|
+
<section class="ed-card-section" aria-label="Skills used">
|
|
164
|
+
<h2 class="ed-section-title">Technologies</h2>
|
|
165
|
+
<div class="chip-list">
|
|
166
|
+
{% for skill in project.skills %}
|
|
167
|
+
<span class="chip chip--violet">{{ skill }}</span>
|
|
168
|
+
{% endfor %}
|
|
169
|
+
</div>
|
|
170
|
+
</section>
|
|
171
|
+
{% endif %}
|
|
172
|
+
|
|
173
|
+
{%- comment -%} Featured session cards {%- endcomment -%}
|
|
174
|
+
{% if featuredSessions.size > 0 %}
|
|
175
|
+
<section class="ed-card-section" aria-label="Featured sessions">
|
|
176
|
+
<h2 class="ed-section-title">{{ featuredSessions.size }} Featured Session{% if featuredSessions.size != 1 %}s{% endif %}</h2>
|
|
177
|
+
<div class="ed-sessions-grid">
|
|
178
|
+
{% for s in featuredSessions %}
|
|
179
|
+
<a href="{{ sessionBaseUrl }}/{{ s.slug }}{{ sessionSuffix }}" class="ed-session-card">
|
|
180
|
+
<h3 class="ed-session-card-title">{{ s.title }}</h3>
|
|
181
|
+
<div class="ed-session-card-meta">
|
|
182
|
+
<span>{{ s.durationMinutes | formatDuration }}</span>
|
|
183
|
+
<span>{{ s.locChanged | localeNumber }} LOC</span>
|
|
184
|
+
<span>{{ s.turns }} turns</span>
|
|
185
|
+
</div>
|
|
186
|
+
{% if s.devTake %}
|
|
187
|
+
<p class="ed-session-card-take">{{ s.devTake }}</p>
|
|
188
|
+
{% endif %}
|
|
189
|
+
{% if s.skills.size > 0 %}
|
|
190
|
+
<div class="ed-chip-list">
|
|
191
|
+
{% for skill in s.skills limit: 3 %}
|
|
192
|
+
<span class="chip chip--violet">{{ skill }}</span>
|
|
193
|
+
{% endfor %}
|
|
194
|
+
</div>
|
|
195
|
+
{% endif %}
|
|
196
|
+
</a>
|
|
197
|
+
{% endfor %}
|
|
198
|
+
</div>
|
|
199
|
+
</section>
|
|
200
|
+
{% endif %}
|
|
201
|
+
|
|
202
|
+
</div>
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
<div class="heyiam-session editorial" data-render-version="2" data-template="editorial">
|
|
2
|
+
|
|
3
|
+
{%- comment -%} Breadcrumb {%- endcomment -%}
|
|
4
|
+
<div class="ed-breadcrumb" aria-label="Breadcrumb">
|
|
5
|
+
<a href="/{{ user.username }}">{{ user.username }}</a>
|
|
6
|
+
{% if projectSlug %}
|
|
7
|
+
<span class="ed-breadcrumb-sep">/</span>
|
|
8
|
+
<a href="/{{ user.username }}/{{ projectSlug }}">{{ projectSlug }}</a>
|
|
9
|
+
{% endif %}
|
|
10
|
+
<span class="ed-breadcrumb-sep">/</span>
|
|
11
|
+
<span>{{ session.title }}</span>
|
|
12
|
+
</div>
|
|
13
|
+
|
|
14
|
+
{%- comment -%} Header {%- endcomment -%}
|
|
15
|
+
<header class="ed-session-header">
|
|
16
|
+
<h1 class="ed-session-title">{{ session.title }}</h1>
|
|
17
|
+
<div class="ed-session-meta">
|
|
18
|
+
{% if session.recordedAt %}
|
|
19
|
+
<span class="ed-meta-item">{{ session.recordedAt | formatDate }}</span>
|
|
20
|
+
{% endif %}
|
|
21
|
+
{% if session.sourceTool %}
|
|
22
|
+
<span class="ed-meta-badge">{{ session.sourceTool }}</span>
|
|
23
|
+
{% endif %}
|
|
24
|
+
<span class="ed-meta-item">{{ session.durationMinutes | formatDuration }}</span>
|
|
25
|
+
<span class="ed-meta-item">{{ session.turns }} turns</span>
|
|
26
|
+
<span class="ed-meta-item">{{ session.locChanged | localeNumber }} LOC</span>
|
|
27
|
+
<span class="ed-meta-item">{{ session.filesChanged }} files</span>
|
|
28
|
+
</div>
|
|
29
|
+
</header>
|
|
30
|
+
|
|
31
|
+
{%- comment -%} Dev Take {%- endcomment -%}
|
|
32
|
+
{% if session.devTake %}
|
|
33
|
+
<div class="ed-dev-take">
|
|
34
|
+
<div class="ed-dev-take-label">Dev take</div>
|
|
35
|
+
<p>{{ session.devTake }}</p>
|
|
36
|
+
</div>
|
|
37
|
+
{% endif %}
|
|
38
|
+
|
|
39
|
+
{%- comment -%} Two-column layout: Main + Sidebar {%- endcomment -%}
|
|
40
|
+
<div class="ed-content-layout">
|
|
41
|
+
|
|
42
|
+
{%- comment -%} Main column {%- endcomment -%}
|
|
43
|
+
<main class="ed-main">
|
|
44
|
+
|
|
45
|
+
{%- comment -%} Narrative {%- endcomment -%}
|
|
46
|
+
{% if session.narrative != blank %}
|
|
47
|
+
<section class="ed-card-section" aria-label="Session narrative">
|
|
48
|
+
<h2 class="ed-section-title">Narrative</h2>
|
|
49
|
+
<p class="ed-narrative">{{ session.narrative }}</p>
|
|
50
|
+
</section>
|
|
51
|
+
{% endif %}
|
|
52
|
+
|
|
53
|
+
{%- comment -%} Highlights {%- endcomment -%}
|
|
54
|
+
{% if session.highlights.size > 0 %}
|
|
55
|
+
<section class="ed-card-section" aria-label="Session highlights">
|
|
56
|
+
<h2 class="ed-section-title">Highlights</h2>
|
|
57
|
+
<ul class="ed-highlights-list">
|
|
58
|
+
{% for h in session.highlights %}
|
|
59
|
+
<li>{{ h }}</li>
|
|
60
|
+
{% endfor %}
|
|
61
|
+
</ul>
|
|
62
|
+
</section>
|
|
63
|
+
{% endif %}
|
|
64
|
+
|
|
65
|
+
{%- comment -%} Beats (Execution Path) {%- endcomment -%}
|
|
66
|
+
{% if session.beats.size > 0 %}
|
|
67
|
+
<section class="ed-card-section" aria-label="Execution path">
|
|
68
|
+
<h2 class="ed-section-title">Execution Path</h2>
|
|
69
|
+
<div class="ed-beats">
|
|
70
|
+
{% for beat in session.beats %}
|
|
71
|
+
<div class="ed-beat">
|
|
72
|
+
<div class="ed-beat-number">{{ beat.stepNumber }}</div>
|
|
73
|
+
<div class="ed-beat-content">
|
|
74
|
+
<div class="ed-beat-title">{{ beat.title }}</div>
|
|
75
|
+
<div class="ed-beat-body">{{ beat.body }}</div>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
{% endfor %}
|
|
79
|
+
</div>
|
|
80
|
+
</section>
|
|
81
|
+
{% endif %}
|
|
82
|
+
|
|
83
|
+
{%- comment -%} Q&A {%- endcomment -%}
|
|
84
|
+
{% if session.qaPairs.size > 0 %}
|
|
85
|
+
<section class="ed-card-section" aria-label="Questions and answers">
|
|
86
|
+
<h2 class="ed-section-title">Q&A</h2>
|
|
87
|
+
<div class="ed-qa-list">
|
|
88
|
+
{% for qa in session.qaPairs %}
|
|
89
|
+
<div class="ed-qa-pair">
|
|
90
|
+
<div class="ed-qa-question">{{ qa.question }}</div>
|
|
91
|
+
<div class="ed-qa-answer">{{ qa.answer }}</div>
|
|
92
|
+
</div>
|
|
93
|
+
{% endfor %}
|
|
94
|
+
</div>
|
|
95
|
+
</section>
|
|
96
|
+
{% endif %}
|
|
97
|
+
|
|
98
|
+
{%- comment -%} Agent Summary {%- endcomment -%}
|
|
99
|
+
{% if session.agentSummary %}
|
|
100
|
+
<section class="ed-card-section" aria-label="Agent summary">
|
|
101
|
+
<h2 class="ed-section-title">{{ session.agentSummary.agents.size }} Sub-session{% if session.agentSummary.agents.size != 1 %}s{% endif %}</h2>
|
|
102
|
+
{% assign maxAgentLoc = 0 %}
|
|
103
|
+
{% for agent in session.agentSummary.agents %}
|
|
104
|
+
{% if agent.loc_changed > maxAgentLoc %}
|
|
105
|
+
{% assign maxAgentLoc = agent.loc_changed %}
|
|
106
|
+
{% endif %}
|
|
107
|
+
{% endfor %}
|
|
108
|
+
{% for agent in session.agentSummary.agents %}
|
|
109
|
+
<div class="ed-agent-row">
|
|
110
|
+
<span class="ed-agent-label">{{ agent.role }}</span>
|
|
111
|
+
<div class="ed-agent-bar-track">
|
|
112
|
+
{% if maxAgentLoc > 0 %}
|
|
113
|
+
{% assign barPct = agent.loc_changed | times: 100 | divided_by: maxAgentLoc %}
|
|
114
|
+
{% else %}
|
|
115
|
+
{% assign barPct = 0 %}
|
|
116
|
+
{% endif %}
|
|
117
|
+
<div class="ed-agent-bar-fill" style="width: {{ barPct }}%;"></div>
|
|
118
|
+
</div>
|
|
119
|
+
<span class="ed-agent-meta">{{ agent.duration_minutes }}m / {{ agent.loc_changed }} LOC</span>
|
|
120
|
+
</div>
|
|
121
|
+
{% endfor %}
|
|
122
|
+
</section>
|
|
123
|
+
{% endif %}
|
|
124
|
+
|
|
125
|
+
</main>
|
|
126
|
+
|
|
127
|
+
{%- comment -%} Sidebar {%- endcomment -%}
|
|
128
|
+
<aside class="ed-sidebar" aria-label="Session details">
|
|
129
|
+
|
|
130
|
+
{%- comment -%} Tools Used {%- endcomment -%}
|
|
131
|
+
{% if session.toolBreakdown.size > 0 %}
|
|
132
|
+
<div class="ed-sidebar-card">
|
|
133
|
+
<h3 class="ed-sidebar-card-title">Tools Used</h3>
|
|
134
|
+
{% for t in session.toolBreakdown %}
|
|
135
|
+
<div class="ed-sidebar-row">
|
|
136
|
+
<span class="ed-sidebar-row-name">{{ t.tool }}</span>
|
|
137
|
+
<span class="ed-sidebar-row-value">{{ t.count }}</span>
|
|
138
|
+
</div>
|
|
139
|
+
{% endfor %}
|
|
140
|
+
</div>
|
|
141
|
+
{% endif %}
|
|
142
|
+
|
|
143
|
+
{%- comment -%} Files Changed {%- endcomment -%}
|
|
144
|
+
{% if session.topFiles.size > 0 %}
|
|
145
|
+
<div class="ed-sidebar-card">
|
|
146
|
+
<h3 class="ed-sidebar-card-title">Files Changed</h3>
|
|
147
|
+
{% for f in session.topFiles %}
|
|
148
|
+
<div class="ed-sidebar-row ed-sidebar-row--file">
|
|
149
|
+
<span class="ed-sidebar-file-path">{{ f.path }}</span>
|
|
150
|
+
<span class="ed-sidebar-file-diff"><span class="ed-file-adds">+{{ f.additions }}</span>{% if f.deletions > 0 %} <span class="ed-file-dels">-{{ f.deletions }}</span>{% endif %}</span>
|
|
151
|
+
</div>
|
|
152
|
+
{% endfor %}
|
|
153
|
+
</div>
|
|
154
|
+
{% endif %}
|
|
155
|
+
|
|
156
|
+
{%- comment -%} Skills {%- endcomment -%}
|
|
157
|
+
{% if session.skills.size > 0 %}
|
|
158
|
+
<div class="ed-sidebar-card">
|
|
159
|
+
<h3 class="ed-sidebar-card-title">Skills</h3>
|
|
160
|
+
<div class="chip-list">
|
|
161
|
+
{% for skill in session.skills %}
|
|
162
|
+
<span class="chip chip--violet">{{ skill }}</span>
|
|
163
|
+
{% endfor %}
|
|
164
|
+
</div>
|
|
165
|
+
</div>
|
|
166
|
+
{% endif %}
|
|
167
|
+
|
|
168
|
+
</aside>
|
|
169
|
+
</div>
|
|
170
|
+
|
|
171
|
+
</div>
|