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.
- 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-B_d6DlEI.js +0 -21
- package/dist/public/assets/index-Dalqz2mC.css +0 -1
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
<div class="heyiam-portfolio cosmos" data-render-version="2" data-template="cosmos" data-username="{{ user.username }}">
|
|
2
|
+
|
|
3
|
+
<div class="starfield" aria-hidden="true"></div>
|
|
4
|
+
|
|
5
|
+
<div class="cos-page">
|
|
6
|
+
|
|
7
|
+
{%- comment -%} Constellation SVG {%- endcomment -%}
|
|
8
|
+
<svg class="cos-constellation" aria-hidden="true">
|
|
9
|
+
<circle class="cos-constellation-dot" cx="80" cy="120" r="2" />
|
|
10
|
+
<circle class="cos-constellation-dot" cx="200" cy="80" r="1.5" />
|
|
11
|
+
<circle class="cos-constellation-dot" cx="340" cy="160" r="2" />
|
|
12
|
+
<circle class="cos-constellation-dot" cx="500" cy="100" r="1.5" />
|
|
13
|
+
<circle class="cos-constellation-dot" cx="650" cy="200" r="2" />
|
|
14
|
+
<circle class="cos-constellation-dot" cx="780" cy="140" r="1.5" />
|
|
15
|
+
<circle class="cos-constellation-dot" cx="150" cy="400" r="2" />
|
|
16
|
+
<circle class="cos-constellation-dot" cx="420" cy="480" r="1.5" />
|
|
17
|
+
<circle class="cos-constellation-dot" cx="700" cy="520" r="2" />
|
|
18
|
+
<circle class="cos-constellation-dot" cx="300" cy="700" r="1.5" />
|
|
19
|
+
<circle class="cos-constellation-dot" cx="600" cy="750" r="2" />
|
|
20
|
+
<circle class="cos-constellation-dot" cx="850" cy="680" r="1.5" />
|
|
21
|
+
<path class="cos-constellation-line" d="M80,120 Q140,90 200,80" />
|
|
22
|
+
<path class="cos-constellation-line" d="M200,80 Q270,120 340,160" />
|
|
23
|
+
<path class="cos-constellation-line" d="M340,160 Q420,120 500,100" />
|
|
24
|
+
<path class="cos-constellation-line" d="M500,100 Q575,160 650,200" />
|
|
25
|
+
<path class="cos-constellation-line" d="M650,200 Q715,160 780,140" />
|
|
26
|
+
<path class="cos-constellation-line" d="M150,400 Q285,430 420,480" />
|
|
27
|
+
<path class="cos-constellation-line" d="M420,480 Q560,490 700,520" />
|
|
28
|
+
<path class="cos-constellation-line" d="M300,700 Q450,720 600,750" />
|
|
29
|
+
<path class="cos-constellation-line" d="M600,750 Q725,710 850,680" />
|
|
30
|
+
</svg>
|
|
31
|
+
|
|
32
|
+
<main id="main-content">
|
|
33
|
+
|
|
34
|
+
{%- comment -%} Hero / Profile {%- endcomment -%}
|
|
35
|
+
{% if hasProfile %}
|
|
36
|
+
<section class="cos-section cos-hero" aria-label="Profile">
|
|
37
|
+
{% if user.photoUrl %}
|
|
38
|
+
<img src="{{ user.photoUrl }}" alt="{{ user.displayName }}" class="cos-hero-photo" width="120" height="150">
|
|
39
|
+
{% endif %}
|
|
40
|
+
{% if user.displayName != blank %}
|
|
41
|
+
<h1>{{ user.displayName }}</h1>
|
|
42
|
+
{% endif %}
|
|
43
|
+
<p class="cos-hero-handle">@{{ user.username }}</p>
|
|
44
|
+
{% if user.bio %}
|
|
45
|
+
<p class="cos-hero-bio">{{ user.bio }}</p>
|
|
46
|
+
{% endif %}
|
|
47
|
+
{% if user.location %}
|
|
48
|
+
<p class="cos-hero-location">
|
|
49
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><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>
|
|
50
|
+
{{ user.location }}
|
|
51
|
+
</p>
|
|
52
|
+
{% endif %}
|
|
53
|
+
{% if user.email or user.linkedinUrl or user.githubUrl or user.twitterHandle or user.websiteUrl %}
|
|
54
|
+
<ul class="cos-hero-contact" aria-label="Contact and social links">
|
|
55
|
+
{% if user.email %}
|
|
56
|
+
<li><a href="mailto:{{ user.email }}"><svg width="16" height="16" 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></li>
|
|
57
|
+
{% endif %}
|
|
58
|
+
{% if user.linkedinUrl %}
|
|
59
|
+
<li><a href="{{ user.linkedinUrl }}" target="_blank" rel="noopener"><svg width="16" height="16" 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></li>
|
|
60
|
+
{% endif %}
|
|
61
|
+
{% if user.githubUrl %}
|
|
62
|
+
<li><a href="{{ user.githubUrl }}" target="_blank" rel="noopener"><svg width="16" height="16" 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></li>
|
|
63
|
+
{% endif %}
|
|
64
|
+
{% if user.twitterHandle %}
|
|
65
|
+
<li><a href="https://x.com/{{ user.twitterHandle }}" target="_blank" rel="noopener"><svg width="16" height="16" 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></li>
|
|
66
|
+
{% endif %}
|
|
67
|
+
{% if user.websiteUrl %}
|
|
68
|
+
<li><a href="{{ user.websiteUrl }}" target="_blank" rel="noopener"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><path d="M2 12h20"/><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></li>
|
|
69
|
+
{% endif %}
|
|
70
|
+
</ul>
|
|
71
|
+
{% endif %}
|
|
72
|
+
{% if user.resumeUrl %}
|
|
73
|
+
<a href="{{ user.resumeUrl }}" class="cos-hero-resume"><svg width="16" height="16" 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>
|
|
74
|
+
{% endif %}
|
|
75
|
+
</section>
|
|
76
|
+
{% endif %}
|
|
77
|
+
|
|
78
|
+
{%- comment -%} Stats {%- endcomment -%}
|
|
79
|
+
<section class="cos-section" aria-label="Aggregate statistics">
|
|
80
|
+
<div class="cos-stats">
|
|
81
|
+
<div class="cos-stat-card">
|
|
82
|
+
<span class="stat-value" data-target="{{ projects.size }}">0</span>
|
|
83
|
+
<span class="stat-label">Projects</span>
|
|
84
|
+
</div>
|
|
85
|
+
<div class="cos-stat-card">
|
|
86
|
+
<span class="stat-value" data-target="{{ totalSessions }}">0</span>
|
|
87
|
+
<span class="stat-label">Sessions</span>
|
|
88
|
+
</div>
|
|
89
|
+
<div class="cos-stat-card">
|
|
90
|
+
<span class="stat-value" data-target="{{ totalLoc }}" data-format="comma">0</span>
|
|
91
|
+
<span class="stat-label">Lines Changed</span>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
{% if efficiencyMultiplier %}
|
|
95
|
+
<div class="cos-leverage" role="figure" aria-label="Leverage multiplier">
|
|
96
|
+
<div class="cos-leverage__ring">
|
|
97
|
+
{% assign totalCombined = totalDurationMinutes | plus: totalAgentDurationMinutes %}
|
|
98
|
+
{% if totalCombined > 0 %}
|
|
99
|
+
{% assign agentPct = totalAgentDurationMinutes | times: 163 | divided_by: totalCombined %}
|
|
100
|
+
{% assign humanPct = 163 | minus: agentPct %}
|
|
101
|
+
{% endif %}
|
|
102
|
+
<svg width="64" height="64" viewBox="0 0 64 64">
|
|
103
|
+
<circle cx="32" cy="32" r="26" fill="none" stroke="rgba(255,255,255,0.08)" stroke-width="5"/>
|
|
104
|
+
<circle cx="32" cy="32" r="26" fill="none" stroke="var(--cos-accent)" stroke-width="5" stroke-dasharray="{{ agentPct }} {{ humanPct }}" stroke-dashoffset="-33" stroke-linecap="round" style="filter:drop-shadow(0 0 4px var(--cos-accent))"/>
|
|
105
|
+
<text x="32" y="36" text-anchor="middle" font-family="var(--font-display)" font-size="14" font-weight="700" fill="var(--cos-accent)">{{ efficiencyMultiplier }}</text>
|
|
106
|
+
</svg>
|
|
107
|
+
</div>
|
|
108
|
+
<div class="cos-leverage__labels">
|
|
109
|
+
<span class="cos-leverage__human">{{ totalDurationMinutes | formatDuration }} <small>you</small></span>
|
|
110
|
+
<span class="cos-leverage__agent">{{ totalAgentDurationMinutes | formatDuration }} <small>agents</small></span>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
{% else %}
|
|
114
|
+
<div class="cos-leverage">
|
|
115
|
+
<div class="cos-leverage__labels">
|
|
116
|
+
<span class="cos-leverage__human">{{ totalDurationMinutes | formatDuration }} <small>total</small></span>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
{% endif %}
|
|
120
|
+
</section>
|
|
121
|
+
|
|
122
|
+
{%- comment -%} Projects {%- endcomment -%}
|
|
123
|
+
{% if projects.size > 0 %}
|
|
124
|
+
<section class="cos-section" aria-label="Projects">
|
|
125
|
+
<h2 class="cos-section-title">Projects</h2>
|
|
126
|
+
<div class="cos-projects">
|
|
127
|
+
{% for p in projects %}
|
|
128
|
+
<article class="cos-project-card">
|
|
129
|
+
<div class="cos-project-card-header">
|
|
130
|
+
<h3><a href="/{{ user.username }}/{{ p.slug }}">{{ p.title }}</a></h3>
|
|
131
|
+
</div>
|
|
132
|
+
{% if p.narrative %}
|
|
133
|
+
<p class="cos-project-card-narrative">{{ p.narrative }}</p>
|
|
134
|
+
{% endif %}
|
|
135
|
+
<div class="cos-project-card-meta">
|
|
136
|
+
<span><strong>{{ p.totalSessions }}</strong> sessions</span>
|
|
137
|
+
<span><strong>{{ p.totalDurationMinutes | formatDuration }}</strong></span>
|
|
138
|
+
<span><strong>{{ p.totalLoc | localeNumber }}</strong> LOC</span>
|
|
139
|
+
</div>
|
|
140
|
+
{% if p.skills.size > 0 %}
|
|
141
|
+
<div class="cos-skill-chips">
|
|
142
|
+
{% for skill in p.skills %}
|
|
143
|
+
<span class="cos-skill-chip">{{ skill }}</span>
|
|
144
|
+
{% endfor %}
|
|
145
|
+
</div>
|
|
146
|
+
{% endif %}
|
|
147
|
+
{% if p.sourceCounts.size > 0 %}
|
|
148
|
+
{% assign pTotalSrc = 0 %}
|
|
149
|
+
{% for src in p.sourceCounts %}{% assign pTotalSrc = pTotalSrc | plus: src.count %}{% endfor %}
|
|
150
|
+
{% if pTotalSrc > 0 %}
|
|
151
|
+
<div class="cos-source-bar">
|
|
152
|
+
<div class="cos-source-track">
|
|
153
|
+
{% for src in p.sourceCounts %}
|
|
154
|
+
{% assign srcPct = src.count | times: 100.0 | divided_by: pTotalSrc | round %}
|
|
155
|
+
<div class="cos-source-fill-{{ src.tool | downcase | replace: ' ', '-' }}" style="width: {{ srcPct }}%"></div>
|
|
156
|
+
{% endfor %}
|
|
157
|
+
</div>
|
|
158
|
+
<div class="cos-source-labels">
|
|
159
|
+
{% for src in p.sourceCounts %}
|
|
160
|
+
{% assign srcPct = src.count | times: 100.0 | divided_by: pTotalSrc | round %}
|
|
161
|
+
<span><span class="cos-source-dot {{ src.tool | downcase | replace: ' ', '-' }}" aria-hidden="true"></span>{{ src.tool }} {{ srcPct }}%</span>
|
|
162
|
+
{% endfor %}
|
|
163
|
+
</div>
|
|
164
|
+
</div>
|
|
165
|
+
{% endif %}
|
|
166
|
+
{% endif %}
|
|
167
|
+
</article>
|
|
168
|
+
{% endfor %}
|
|
169
|
+
</div>
|
|
170
|
+
</section>
|
|
171
|
+
{% endif %}
|
|
172
|
+
|
|
173
|
+
{%- comment -%} Skills Overview {%- endcomment -%}
|
|
174
|
+
{% if allSkills.size > 0 %}
|
|
175
|
+
<section class="cos-section cos-skills-overview" aria-label="Skills overview">
|
|
176
|
+
<h2 class="cos-section-title">Skills</h2>
|
|
177
|
+
<div class="cos-skill-overview-grid">
|
|
178
|
+
{% for skill in allSkills %}
|
|
179
|
+
<span class="cos-skill-overview-chip">{{ skill.name }}</span>
|
|
180
|
+
{% endfor %}
|
|
181
|
+
</div>
|
|
182
|
+
</section>
|
|
183
|
+
{% endif %}
|
|
184
|
+
|
|
185
|
+
{%- comment -%} Activity Chart {%- endcomment -%}
|
|
186
|
+
{% if activityByMonth.size > 0 %}
|
|
187
|
+
{% assign maxSessions = 0 %}
|
|
188
|
+
{% for m in activityByMonth %}
|
|
189
|
+
{% if m.sessions > maxSessions %}{% assign maxSessions = m.sessions %}{% endif %}
|
|
190
|
+
{% endfor %}
|
|
191
|
+
<section class="cos-section cos-activity" aria-label="Monthly activity">
|
|
192
|
+
<h2 class="cos-section-title">Activity</h2>
|
|
193
|
+
<div class="cos-activity-chart">
|
|
194
|
+
<svg class="cos-activity-svg" viewBox="0 0 600 180" role="img" aria-label="Monthly session activity bar chart">
|
|
195
|
+
<line class="cos-activity-grid" x1="60" y1="20" x2="560" y2="20" />
|
|
196
|
+
<line class="cos-activity-grid" x1="60" y1="55" x2="560" y2="55" />
|
|
197
|
+
<line class="cos-activity-grid" x1="60" y1="90" x2="560" y2="90" />
|
|
198
|
+
<line class="cos-activity-grid" x1="60" y1="125" x2="560" y2="125" />
|
|
199
|
+
{% assign spacing = 500 | divided_by: activityByMonth.size %}
|
|
200
|
+
{% for m in activityByMonth %}
|
|
201
|
+
{% if maxSessions > 0 %}
|
|
202
|
+
{% assign barH = m.sessions | times: 105 | divided_by: maxSessions %}
|
|
203
|
+
{% else %}
|
|
204
|
+
{% assign barH = 0 %}
|
|
205
|
+
{% endif %}
|
|
206
|
+
{% assign barY = 125 | minus: barH %}
|
|
207
|
+
{% assign halfSpace = spacing | divided_by: 2 %}
|
|
208
|
+
{% assign centerX = forloop.index0 | times: spacing | plus: 60 | plus: halfSpace %}
|
|
209
|
+
{% assign barX = centerX | minus: 40 %}
|
|
210
|
+
<g class="cos-activity-bar">
|
|
211
|
+
<rect x="{{ barX }}" y="{{ barY }}" width="80" height="{{ barH }}" rx="4" fill="#fbbf24" opacity="0.7" />
|
|
212
|
+
{% assign valY = barY | minus: 6 %}
|
|
213
|
+
<text class="cos-activity-value" x="{{ centerX }}" y="{{ valY }}" text-anchor="middle">{{ m.sessions }}</text>
|
|
214
|
+
<text class="cos-activity-label" x="{{ centerX }}" y="148" text-anchor="middle">{{ m.month }}</text>
|
|
215
|
+
</g>
|
|
216
|
+
{% endfor %}
|
|
217
|
+
</svg>
|
|
218
|
+
</div>
|
|
219
|
+
</section>
|
|
220
|
+
{% endif %}
|
|
221
|
+
|
|
222
|
+
</main>
|
|
223
|
+
|
|
224
|
+
<footer class="cos-footer">
|
|
225
|
+
<p>Built with <a href="https://heyi.am">heyi.am</a></p>
|
|
226
|
+
</footer>
|
|
227
|
+
|
|
228
|
+
</div>
|
|
229
|
+
|
|
230
|
+
{%- comment -%} Animation scripts {%- endcomment -%}
|
|
231
|
+
|
|
232
|
+
</div>
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
<div class="heyiam-project cosmos" data-render-version="2" data-template="cosmos"{% if sessionBaseUrl %} data-session-base-url="{{ sessionBaseUrl }}"{% endif %} data-username="{{ user.username }}" data-project-slug="{{ project.slug }}">
|
|
2
|
+
|
|
3
|
+
<div class="starfield" aria-hidden="true"></div>
|
|
4
|
+
|
|
5
|
+
<div class="cos-page">
|
|
6
|
+
|
|
7
|
+
{%- comment -%} Constellation SVG {%- endcomment -%}
|
|
8
|
+
<svg class="cos-constellation" aria-hidden="true">
|
|
9
|
+
<circle class="cos-constellation-dot" cx="60" cy="200" r="2" />
|
|
10
|
+
<circle class="cos-constellation-dot" cx="250" cy="150" r="1.5" />
|
|
11
|
+
<circle class="cos-constellation-dot" cx="450" cy="220" r="2" />
|
|
12
|
+
<circle class="cos-constellation-dot" cx="700" cy="180" r="1.5" />
|
|
13
|
+
<circle class="cos-constellation-dot" cx="150" cy="500" r="2" />
|
|
14
|
+
<circle class="cos-constellation-dot" cx="400" cy="600" r="1.5" />
|
|
15
|
+
<circle class="cos-constellation-dot" cx="650" cy="550" r="2" />
|
|
16
|
+
<circle class="cos-constellation-dot" cx="850" cy="450" r="1.5" />
|
|
17
|
+
<circle class="cos-constellation-dot" cx="100" cy="850" r="2" />
|
|
18
|
+
<circle class="cos-constellation-dot" cx="500" cy="900" r="1.5" />
|
|
19
|
+
<circle class="cos-constellation-dot" cx="800" cy="800" r="2" />
|
|
20
|
+
<path class="cos-constellation-line" d="M60,200 Q155,165 250,150" />
|
|
21
|
+
<path class="cos-constellation-line" d="M250,150 Q350,190 450,220" />
|
|
22
|
+
<path class="cos-constellation-line" d="M450,220 Q575,195 700,180" />
|
|
23
|
+
<path class="cos-constellation-line" d="M150,500 Q275,555 400,600" />
|
|
24
|
+
<path class="cos-constellation-line" d="M400,600 Q525,570 650,550" />
|
|
25
|
+
<path class="cos-constellation-line" d="M650,550 Q750,495 850,450" />
|
|
26
|
+
<path class="cos-constellation-line" d="M100,850 Q300,880 500,900" />
|
|
27
|
+
<path class="cos-constellation-line" d="M500,900 Q650,845 800,800" />
|
|
28
|
+
</svg>
|
|
29
|
+
|
|
30
|
+
<main id="main-content">
|
|
31
|
+
|
|
32
|
+
{%- comment -%} Breadcrumb {%- endcomment -%}
|
|
33
|
+
<nav class="cos-breadcrumb" aria-label="Breadcrumb">
|
|
34
|
+
<a href="/{{ user.username }}">{{ user.username }}</a>
|
|
35
|
+
<span class="cos-breadcrumb-sep" aria-hidden="true">/</span>
|
|
36
|
+
<span aria-current="page">{{ project.slug }}</span>
|
|
37
|
+
</nav>
|
|
38
|
+
|
|
39
|
+
{%- comment -%} Project Header {%- endcomment -%}
|
|
40
|
+
<header class="cos-section cos-project-header">
|
|
41
|
+
<h1 data-editable="title">{{ project.title }}</h1>
|
|
42
|
+
{% if project.repoUrl or project.projectUrl %}
|
|
43
|
+
<div class="cos-project-links">
|
|
44
|
+
{% if project.repoUrl %}
|
|
45
|
+
<a href="{{ project.repoUrl }}" target="_blank" rel="noopener">
|
|
46
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" 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"/></svg>
|
|
47
|
+
{{ project.repoUrl | stripProtocol }}
|
|
48
|
+
</a>
|
|
49
|
+
{% endif %}
|
|
50
|
+
{% if project.projectUrl %}
|
|
51
|
+
<a href="{{ project.projectUrl }}" target="_blank" rel="noopener">
|
|
52
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><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>
|
|
53
|
+
{{ project.projectUrl | stripProtocol }}
|
|
54
|
+
</a>
|
|
55
|
+
{% endif %}
|
|
56
|
+
</div>
|
|
57
|
+
{% endif %}
|
|
58
|
+
</header>
|
|
59
|
+
|
|
60
|
+
{%- comment -%} Screenshot {%- endcomment -%}
|
|
61
|
+
{% if project.screenshotUrl %}
|
|
62
|
+
<div class="cos-section cos-screenshot" data-editable="screenshot">
|
|
63
|
+
<div class="cos-screenshot-bar" aria-hidden="true">
|
|
64
|
+
<span class="cos-screenshot-dot"></span>
|
|
65
|
+
<span class="cos-screenshot-dot"></span>
|
|
66
|
+
<span class="cos-screenshot-dot"></span>
|
|
67
|
+
<span class="cos-screenshot-url">Preview</span>
|
|
68
|
+
</div>
|
|
69
|
+
<div class="cos-screenshot-viewport">
|
|
70
|
+
<img src="{{ project.screenshotUrl }}" alt="{{ project.title }} screenshot" style="width: 100%; display: block;">
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
{% endif %}
|
|
74
|
+
|
|
75
|
+
{%- comment -%} Stats {%- endcomment -%}
|
|
76
|
+
<section class="cos-section" aria-label="Project statistics">
|
|
77
|
+
<div class="cos-stats-row">
|
|
78
|
+
<div class="cos-stat-pill">
|
|
79
|
+
<span class="stat-value">{{ project.totalSessions }}</span>
|
|
80
|
+
<span class="stat-label">Sessions</span>
|
|
81
|
+
</div>
|
|
82
|
+
<div class="cos-stat-pill">
|
|
83
|
+
<span class="stat-value">{{ project.totalLoc | localeNumber }}</span>
|
|
84
|
+
<span class="stat-label">LOC</span>
|
|
85
|
+
</div>
|
|
86
|
+
<div class="cos-stat-pill">
|
|
87
|
+
<span class="stat-value">{{ project.totalFilesChanged }}</span>
|
|
88
|
+
<span class="stat-label">Files</span>
|
|
89
|
+
</div>
|
|
90
|
+
{% if project.totalTokens %}
|
|
91
|
+
<div class="cos-stat-pill">
|
|
92
|
+
<span class="stat-value">{{ project.totalTokens | formatTokens }}</span>
|
|
93
|
+
<span class="stat-label">Tokens</span>
|
|
94
|
+
</div>
|
|
95
|
+
{% endif %}
|
|
96
|
+
</div>
|
|
97
|
+
{% if efficiencyMultiplier %}
|
|
98
|
+
<div class="cos-leverage" role="figure" aria-label="Leverage multiplier">
|
|
99
|
+
<div class="cos-leverage__ring">
|
|
100
|
+
{% assign totalCombined = project.totalDurationMinutes | plus: project.totalAgentDurationMinutes %}
|
|
101
|
+
{% if totalCombined > 0 %}
|
|
102
|
+
{% assign agentPct = project.totalAgentDurationMinutes | times: 163 | divided_by: totalCombined %}
|
|
103
|
+
{% assign humanPct = 163 | minus: agentPct %}
|
|
104
|
+
{% endif %}
|
|
105
|
+
<svg width="64" height="64" viewBox="0 0 64 64">
|
|
106
|
+
<circle cx="32" cy="32" r="26" fill="none" stroke="rgba(255,255,255,0.08)" stroke-width="5"/>
|
|
107
|
+
<circle cx="32" cy="32" r="26" fill="none" stroke="var(--cos-accent)" stroke-width="5" stroke-dasharray="{{ agentPct }} {{ humanPct }}" stroke-dashoffset="-33" stroke-linecap="round" style="filter:drop-shadow(0 0 4px var(--cos-accent))"/>
|
|
108
|
+
<text x="32" y="36" text-anchor="middle" font-family="var(--font-display)" font-size="14" font-weight="700" fill="var(--cos-accent)">{{ efficiencyMultiplier }}</text>
|
|
109
|
+
</svg>
|
|
110
|
+
</div>
|
|
111
|
+
<div class="cos-leverage__labels">
|
|
112
|
+
<span class="cos-leverage__human">{{ project.totalDurationMinutes | formatDuration }} <small>you</small></span>
|
|
113
|
+
<span class="cos-leverage__agent">{{ project.totalAgentDurationMinutes | formatDuration }} <small>agents</small></span>
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
{% else %}
|
|
117
|
+
<div class="cos-leverage">
|
|
118
|
+
<div class="cos-leverage__labels">
|
|
119
|
+
<span class="cos-leverage__human">{{ project.totalDurationMinutes | formatDuration }} <small>total</small></span>
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
{% endif %}
|
|
123
|
+
</section>
|
|
124
|
+
|
|
125
|
+
{%- comment -%} Narrative {%- endcomment -%}
|
|
126
|
+
{% if project.narrative %}
|
|
127
|
+
<section class="cos-section cos-narrative" aria-label="Project narrative">
|
|
128
|
+
<h2 class="cos-section-title">Narrative</h2>
|
|
129
|
+
<p>{{ project.narrative }}</p>
|
|
130
|
+
</section>
|
|
131
|
+
{% endif %}
|
|
132
|
+
|
|
133
|
+
{%- comment -%} Work Timeline Chart (CSS-only SVG bars) {%- endcomment -%}
|
|
134
|
+
{% if featuredSessions.size > 0 %}
|
|
135
|
+
<section class="cos-section" aria-label="Work timeline chart">
|
|
136
|
+
<h2 class="cos-section-title">Work Timeline</h2>
|
|
137
|
+
<div class="cos-chart-container">
|
|
138
|
+
{% assign maxLoc = 0 %}
|
|
139
|
+
{% for s in featuredSessions %}
|
|
140
|
+
{% if s.locChanged > maxLoc %}{% assign maxLoc = s.locChanged %}{% endif %}
|
|
141
|
+
{% endfor %}
|
|
142
|
+
{% assign barCount = featuredSessions.size %}
|
|
143
|
+
{% assign barWidth = 55 %}
|
|
144
|
+
{% assign barGap = 75 %}
|
|
145
|
+
{% assign chartLeft = 80 %}
|
|
146
|
+
{% assign chartHeight = 180 %}
|
|
147
|
+
{% assign chartTop = 30 %}
|
|
148
|
+
{% assign chartBottom = 210 %}
|
|
149
|
+
{% assign svgWidth = chartLeft | plus: barCount | times: barGap | plus: 40 %}
|
|
150
|
+
<svg class="cos-chart-svg" viewBox="0 0 {{ svgWidth }} 240" role="img" aria-label="Bar chart showing lines of code written per session">
|
|
151
|
+
<line class="cos-chart-grid-line" x1="60" y1="30" x2="{{ svgWidth | minus: 20 }}" y2="30" />
|
|
152
|
+
<line class="cos-chart-grid-line" x1="60" y1="75" x2="{{ svgWidth | minus: 20 }}" y2="75" />
|
|
153
|
+
<line class="cos-chart-grid-line" x1="60" y1="120" x2="{{ svgWidth | minus: 20 }}" y2="120" />
|
|
154
|
+
<line class="cos-chart-grid-line" x1="60" y1="165" x2="{{ svgWidth | minus: 20 }}" y2="165" />
|
|
155
|
+
<line class="cos-chart-grid-line" x1="60" y1="210" x2="{{ svgWidth | minus: 20 }}" y2="210" />
|
|
156
|
+
{% assign yStep = maxLoc | divided_by: 4 %}
|
|
157
|
+
<text class="cos-chart-label" x="55" y="34" text-anchor="end">{{ maxLoc }}</text>
|
|
158
|
+
<text class="cos-chart-label" x="55" y="79" text-anchor="end">{{ maxLoc | times: 3 | divided_by: 4 }}</text>
|
|
159
|
+
<text class="cos-chart-label" x="55" y="124" text-anchor="end">{{ maxLoc | divided_by: 2 }}</text>
|
|
160
|
+
<text class="cos-chart-label" x="55" y="169" text-anchor="end">{{ maxLoc | divided_by: 4 }}</text>
|
|
161
|
+
<text class="cos-chart-label" x="55" y="214" text-anchor="end">0</text>
|
|
162
|
+
{% for s in featuredSessions %}
|
|
163
|
+
{% assign barX = forloop.index0 | times: barGap | plus: chartLeft %}
|
|
164
|
+
{% assign barCenterX = barX | plus: 27 %}
|
|
165
|
+
{% if maxLoc > 0 %}
|
|
166
|
+
{% assign barH = s.locChanged | times: chartHeight | divided_by: maxLoc %}
|
|
167
|
+
{% else %}
|
|
168
|
+
{% assign barH = 0 %}
|
|
169
|
+
{% endif %}
|
|
170
|
+
{% assign barY = chartBottom | minus: barH %}
|
|
171
|
+
<g class="cos-chart-bar">
|
|
172
|
+
<rect x="{{ barX }}" y="{{ barY }}" width="{{ barWidth }}" height="{{ barH }}" rx="4" fill="var(--cos-accent)" opacity="0.7" />
|
|
173
|
+
<text class="cos-chart-value" x="{{ barCenterX }}" y="{{ barY | minus: 6 }}" text-anchor="middle">{{ s.locChanged }}</text>
|
|
174
|
+
<text class="cos-chart-label" x="{{ barCenterX }}" y="228" text-anchor="middle">S{{ forloop.index }}</text>
|
|
175
|
+
</g>
|
|
176
|
+
{% endfor %}
|
|
177
|
+
</svg>
|
|
178
|
+
</div>
|
|
179
|
+
</section>
|
|
180
|
+
{% endif %}
|
|
181
|
+
|
|
182
|
+
{%- comment -%} Orbital Timeline {%- endcomment -%}
|
|
183
|
+
{% if arc.size > 0 %}
|
|
184
|
+
<section class="cos-section cos-orbit-timeline" aria-label="Project phases orbital timeline">
|
|
185
|
+
<h2 class="cos-section-title">Orbital Timeline</h2>
|
|
186
|
+
{% assign nodeCount = arc.size %}
|
|
187
|
+
{% assign svgWidth = 800 %}
|
|
188
|
+
<svg class="cos-orbit-svg" viewBox="0 0 {{ svgWidth }} 200" role="img" aria-label="Phase timeline showing {{ nodeCount }} project phases as points along an orbital path">
|
|
189
|
+
<path class="cos-orbit-path" d="M50,100 C150,30 250,170 400,100 C550,30 650,170 750,100" />
|
|
190
|
+
<path class="cos-orbit-path-active" d="M50,100 C150,30 250,170 400,100 C550,30 650,170 750,100" />
|
|
191
|
+
{% for item in arc %}
|
|
192
|
+
{% assign segWidth = 700 | divided_by: nodeCount %}
|
|
193
|
+
{% assign nodeX = forloop.index0 | times: segWidth | plus: 50 | plus: segWidth | divided_by: 2 %}
|
|
194
|
+
{% assign oddPhase = forloop.index0 | modulo: 2 %}
|
|
195
|
+
{% if oddPhase == 0 %}
|
|
196
|
+
{% assign nodeY = 65 %}
|
|
197
|
+
{% assign labelY = 50 %}
|
|
198
|
+
{% assign textY = 40 %}
|
|
199
|
+
{% else %}
|
|
200
|
+
{% assign nodeY = 145 %}
|
|
201
|
+
{% assign labelY = 170 %}
|
|
202
|
+
{% assign textY = 190 %}
|
|
203
|
+
{% endif %}
|
|
204
|
+
<text class="cos-orbit-phase-label" x="{{ nodeX }}" y="{{ labelY }}">{{ item.title }}</text>
|
|
205
|
+
<g class="cos-orbit-node">
|
|
206
|
+
<circle cx="{{ nodeX }}" cy="{{ nodeY }}" r="6" fill="var(--cos-bg, #030712)" stroke="var(--cos-accent)" stroke-width="2" />
|
|
207
|
+
{% if item.dates != blank %}
|
|
208
|
+
<text x="{{ nodeX }}" y="{{ textY }}" text-anchor="middle">{{ item.dates }}</text>
|
|
209
|
+
{% endif %}
|
|
210
|
+
</g>
|
|
211
|
+
{% endfor %}
|
|
212
|
+
</svg>
|
|
213
|
+
</section>
|
|
214
|
+
{% endif %}
|
|
215
|
+
|
|
216
|
+
{%- comment -%} Phase Cards {%- endcomment -%}
|
|
217
|
+
{% if arc.size > 0 %}
|
|
218
|
+
<section class="cos-section" aria-label="Phase details">
|
|
219
|
+
<h2 class="cos-section-title">Phases</h2>
|
|
220
|
+
<div class="cos-phases">
|
|
221
|
+
{% for item in arc %}
|
|
222
|
+
<div class="cos-phase-card">
|
|
223
|
+
<div class="cos-phase-number">Phase {{ item.phase }}</div>
|
|
224
|
+
<h3>{{ item.title }}</h3>
|
|
225
|
+
<p class="cos-phase-desc">{{ item.description }}</p>
|
|
226
|
+
</div>
|
|
227
|
+
{% endfor %}
|
|
228
|
+
</div>
|
|
229
|
+
</section>
|
|
230
|
+
{% endif %}
|
|
231
|
+
|
|
232
|
+
{%- comment -%} Key Decisions {%- endcomment -%}
|
|
233
|
+
{% if arc.size > 0 %}
|
|
234
|
+
<section class="cos-section cos-decisions" aria-label="Key decisions">
|
|
235
|
+
<h2 class="cos-section-title">Key Decisions</h2>
|
|
236
|
+
{% for item in arc %}
|
|
237
|
+
<div class="cos-decision">
|
|
238
|
+
<span class="cos-decision-number" aria-hidden="true">{{ item.phase }}</span>
|
|
239
|
+
<p>{{ item.description }}</p>
|
|
240
|
+
</div>
|
|
241
|
+
{% endfor %}
|
|
242
|
+
</section>
|
|
243
|
+
{% endif %}
|
|
244
|
+
|
|
245
|
+
{%- comment -%} Skills {%- endcomment -%}
|
|
246
|
+
{% if project.skills.size > 0 %}
|
|
247
|
+
<section class="cos-section" aria-label="Skills used">
|
|
248
|
+
<h2 class="cos-section-title">Skills</h2>
|
|
249
|
+
<div class="cos-skill-chips" style="margin-block-end: 2.5rem;">
|
|
250
|
+
{% for skill in project.skills %}
|
|
251
|
+
<span class="cos-skill-chip">{{ skill }}</span>
|
|
252
|
+
{% endfor %}
|
|
253
|
+
</div>
|
|
254
|
+
</section>
|
|
255
|
+
{% endif %}
|
|
256
|
+
|
|
257
|
+
{%- comment -%} Source Breakdown {%- endcomment -%}
|
|
258
|
+
{% if sourceCounts.size > 0 %}
|
|
259
|
+
<section class="cos-section cos-source-section" aria-label="Source breakdown">
|
|
260
|
+
<h2 class="cos-section-title">Source Breakdown</h2>
|
|
261
|
+
{% assign totalSourceSessions = 0 %}
|
|
262
|
+
{% for src in sourceCounts %}
|
|
263
|
+
{% assign totalSourceSessions = totalSourceSessions | plus: src.count %}
|
|
264
|
+
{% endfor %}
|
|
265
|
+
{% if totalSourceSessions > 0 %}
|
|
266
|
+
<div class="cos-source-bar-large">
|
|
267
|
+
{% for src in sourceCounts %}
|
|
268
|
+
{% assign srcPct = src.count | times: 100.0 | divided_by: totalSourceSessions | round %}
|
|
269
|
+
{% if forloop.first %}
|
|
270
|
+
<div class="cos-source-fill-claude" style="width: {{ srcPct }}%"></div>
|
|
271
|
+
{% else %}
|
|
272
|
+
<div class="cos-source-fill-cursor" style="width: {{ srcPct }}%"></div>
|
|
273
|
+
{% endif %}
|
|
274
|
+
{% endfor %}
|
|
275
|
+
</div>
|
|
276
|
+
<div class="cos-source-labels">
|
|
277
|
+
{% for src in sourceCounts %}
|
|
278
|
+
{% assign srcPct = src.count | times: 100.0 | divided_by: totalSourceSessions | round %}
|
|
279
|
+
<span>
|
|
280
|
+
{% if forloop.first %}
|
|
281
|
+
<span class="cos-source-dot claude" aria-hidden="true"></span>
|
|
282
|
+
{% else %}
|
|
283
|
+
<span class="cos-source-dot cursor" aria-hidden="true"></span>
|
|
284
|
+
{% endif %}
|
|
285
|
+
{{ src.tool }} {{ srcPct }}% ({{ src.count }} session{% if src.count != 1 %}s{% endif %})
|
|
286
|
+
</span>
|
|
287
|
+
{% endfor %}
|
|
288
|
+
</div>
|
|
289
|
+
{% endif %}
|
|
290
|
+
</section>
|
|
291
|
+
{% endif %}
|
|
292
|
+
|
|
293
|
+
{%- comment -%} Featured Sessions {%- endcomment -%}
|
|
294
|
+
{% if featuredSessions.size > 0 %}
|
|
295
|
+
<section class="cos-section" aria-label="Featured sessions">
|
|
296
|
+
<h2 class="cos-section-title">Sessions</h2>
|
|
297
|
+
<div class="cos-sessions">
|
|
298
|
+
{% for s in featuredSessions %}
|
|
299
|
+
<article class="cos-session-card">
|
|
300
|
+
<h3><a href="{{ sessionBaseUrl }}/{{ s.slug }}{{ sessionSuffix }}">{{ s.title }}</a></h3>
|
|
301
|
+
<div class="cos-session-meta">
|
|
302
|
+
<span><strong>{{ s.durationMinutes | formatDuration }}</strong></span>
|
|
303
|
+
<span><strong>{{ s.locChanged | localeNumber }}</strong> LOC</span>
|
|
304
|
+
{% if s.agentSummary %}
|
|
305
|
+
<span><strong>{{ s.agentSummary.agents.size }}</strong> agents</span>
|
|
306
|
+
{% endif %}
|
|
307
|
+
</div>
|
|
308
|
+
{% if s.skills.size > 0 %}
|
|
309
|
+
<span class="cos-session-tag">{{ s.skills | first }}</span>
|
|
310
|
+
{% endif %}
|
|
311
|
+
</article>
|
|
312
|
+
{% endfor %}
|
|
313
|
+
</div>
|
|
314
|
+
</section>
|
|
315
|
+
{% endif %}
|
|
316
|
+
|
|
317
|
+
</main>
|
|
318
|
+
|
|
319
|
+
<footer class="cos-footer">
|
|
320
|
+
<p>Built with <a href="https://heyi.am">heyi.am</a></p>
|
|
321
|
+
</footer>
|
|
322
|
+
|
|
323
|
+
</div>
|
|
324
|
+
|
|
325
|
+
{%- comment -%} Animation scripts {%- endcomment -%}
|
|
326
|
+
|
|
327
|
+
</div>
|