heyiam 0.2.29 → 0.3.1
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/auth.js +29 -3
- package/dist/config.js +10 -1
- package/dist/db.js +0 -1
- package/dist/export.js +124 -27
- package/dist/format-utils.js +5 -0
- package/dist/github.js +381 -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/index.js +22 -3
- package/dist/parsers/types.js +0 -1
- package/dist/public/assets/index-Coilyhtr.css +1 -0
- package/dist/public/assets/index-D0noVMFu.js +44 -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 +192 -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 +1184 -0
- package/dist/render/templates/bauhaus/portfolio.liquid +169 -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 +1645 -0
- package/dist/render/templates/blueprint/portfolio.liquid +153 -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 +1289 -0
- package/dist/render/templates/canvas/portfolio.liquid +203 -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 +1440 -0
- package/dist/render/templates/carbon/portfolio.liquid +160 -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 +1097 -0
- package/dist/render/templates/chalk/portfolio.liquid +189 -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 +1161 -0
- package/dist/render/templates/circuit/portfolio.liquid +152 -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 +1409 -0
- package/dist/render/templates/cosmos/portfolio.liquid +222 -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 +1157 -0
- package/dist/render/templates/daylight/portfolio.liquid +207 -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 +1315 -0
- package/dist/render/templates/editorial/portfolio.liquid +110 -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 +826 -0
- package/dist/render/templates/ember/portfolio.liquid +306 -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 +1289 -0
- package/dist/render/templates/glacier/portfolio.liquid +261 -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 +1204 -0
- package/dist/render/templates/grid/portfolio.liquid +255 -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 +1445 -0
- package/dist/render/templates/kinetic/portfolio.liquid +158 -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 +948 -0
- package/dist/render/templates/meridian/portfolio.liquid +243 -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 +1375 -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 +529 -0
- package/dist/render/templates/mono/portfolio.liquid +281 -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 +1022 -0
- package/dist/render/templates/neon/portfolio.liquid +207 -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 +1271 -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 +1229 -0
- package/dist/render/templates/obsidian/portfolio.liquid +247 -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 +1407 -0
- package/dist/render/templates/paper/portfolio.liquid +257 -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 +1513 -0
- package/dist/render/templates/parallax/portfolio.liquid +295 -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 +1880 -0
- package/dist/render/templates/parchment/portfolio.liquid +280 -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 +1401 -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 +223 -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 +1055 -0
- package/dist/render/templates/showcase/portfolio.liquid +221 -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 +1284 -0
- package/dist/render/templates/signal/portfolio.liquid +217 -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 +1401 -0
- package/dist/render/templates/strata/portfolio.liquid +180 -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 +1354 -0
- package/dist/render/templates/styles.css +1190 -0
- package/dist/render/templates/terminal/portfolio.liquid +102 -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 +497 -0
- package/dist/render/templates/verdant/portfolio.liquid +321 -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 +1261 -0
- package/dist/render/templates/zen/portfolio.liquid +124 -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 +1211 -0
- package/dist/render/templates.js +90 -0
- package/dist/routes/auth.js +7 -3
- package/dist/routes/context.js +17 -10
- package/dist/routes/delete.js +195 -0
- package/dist/routes/enhance.js +57 -40
- package/dist/routes/export.js +14 -4
- package/dist/routes/github.js +254 -0
- package/dist/routes/index.js +2 -0
- package/dist/routes/portfolio-render-data.js +160 -0
- package/dist/routes/preview.js +555 -108
- package/dist/routes/projects.js +61 -24
- package/dist/routes/publish.js +320 -31
- package/dist/routes/settings.js +194 -1
- package/dist/routes/sse.js +9 -0
- package/dist/search.js +6 -0
- package/dist/server.js +11 -3
- package/dist/settings.js +112 -9
- package/package.json +3 -4
- package/dist/public/assets/index-CC9G8EF1.js +0 -21
- package/dist/public/assets/index-Dalqz2mC.css +0 -1
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
<div class="heyiam-portfolio mono" data-render-version="2" data-template="mono" data-username="{{ user.username }}">
|
|
2
|
+
|
|
3
|
+
<div class="mono-page">
|
|
4
|
+
|
|
5
|
+
{%- comment -%} Hero {%- endcomment -%}
|
|
6
|
+
{% if hasProfile %}
|
|
7
|
+
<section class="mono-section" aria-label="Profile">
|
|
8
|
+
<div class="terminal-block">
|
|
9
|
+
<div class="terminal-header">
|
|
10
|
+
<div class="terminal-dots">
|
|
11
|
+
<span class="dot-red" aria-hidden="true"></span>
|
|
12
|
+
<span class="dot-yellow" aria-hidden="true"></span>
|
|
13
|
+
<span class="dot-green" aria-hidden="true"></span>
|
|
14
|
+
</div>
|
|
15
|
+
<span>{{ user.username }}@heyi.am ~ portfolio</span>
|
|
16
|
+
</div>
|
|
17
|
+
<div class="terminal-body">
|
|
18
|
+
<div class="hero-profile">
|
|
19
|
+
{% if user.photoUrl %}
|
|
20
|
+
<img src="{{ user.photoUrl }}" alt="{{ user.displayName }}" class="hero-photo" width="120" height="150" data-portfolio-field="photoBase64"{% unless user.photoUrl %} data-portfolio-empty="true"{% endunless %}>
|
|
21
|
+
{% endif %}
|
|
22
|
+
<div class="hero-info">
|
|
23
|
+
{% if user.displayName != blank %}
|
|
24
|
+
<h1 class="hero-title" aria-label="{{ user.displayName }}" data-portfolio-field="displayName">{{ user.displayName }}</h1>
|
|
25
|
+
{% endif %}
|
|
26
|
+
<p class="hero-handle">
|
|
27
|
+
<span style="color: var(--mono-accent, #4ade80);">@</span>{{ user.username }}
|
|
28
|
+
</p>
|
|
29
|
+
{% if user.bio %}
|
|
30
|
+
<p class="hero-bio">
|
|
31
|
+
<span class="comment">// </span><span data-portfolio-field="bio">{{ user.bio }}</span>
|
|
32
|
+
</p>
|
|
33
|
+
{% endif %}
|
|
34
|
+
{% if user.location %}
|
|
35
|
+
<p class="hero-location">
|
|
36
|
+
<span class="comment">location: </span><span data-portfolio-field="location">{{ user.location }}</span>
|
|
37
|
+
</p>
|
|
38
|
+
{% endif %}
|
|
39
|
+
{% if user.email or user.linkedinUrl or user.githubUrl or user.twitterHandle or user.websiteUrl %}
|
|
40
|
+
<ul class="hero-contact" aria-label="Contact and social links">
|
|
41
|
+
<li data-portfolio-field="email"{% unless user.email %} data-portfolio-empty="true"{% endunless %}><a href="{% if user.email %}mailto:{{ user.email }}{% endif %}"><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>
|
|
42
|
+
<li data-portfolio-field="linkedinUrl"{% unless user.linkedinUrl %} data-portfolio-empty="true"{% endunless %}><a href="{% if user.linkedinUrl %}{{ user.linkedinUrl }}{% endif %}" 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>
|
|
43
|
+
<li data-portfolio-field="githubUrl"{% unless user.githubUrl %} data-portfolio-empty="true"{% endunless %}><a href="{% if user.githubUrl %}{{ user.githubUrl }}{% endif %}" 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>
|
|
44
|
+
<li data-portfolio-field="twitterHandle"{% unless user.twitterHandle %} data-portfolio-empty="true"{% endunless %}><a href="{% if user.twitterHandle %}https://x.com/{{ user.twitterHandle }}{% endif %}" 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>
|
|
45
|
+
<li data-portfolio-field="websiteUrl"{% unless user.websiteUrl %} data-portfolio-empty="true"{% endunless %}><a href="{% if user.websiteUrl %}{{ user.websiteUrl }}{% endif %}" target="_blank" rel="noopener"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7z"/><circle cx="12" cy="9" r="2.5"/></svg>{{ user.websiteUrl | stripProtocol }}</a></li>
|
|
46
|
+
</ul>
|
|
47
|
+
{% endif %}
|
|
48
|
+
{% if user.resumeUrl %}
|
|
49
|
+
<a href="{{ user.resumeUrl }}" class="hero-resume-btn"><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>
|
|
50
|
+
{% endif %}
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
</section>
|
|
56
|
+
{% endif %}
|
|
57
|
+
|
|
58
|
+
{%- comment -%} Stats {%- endcomment -%}
|
|
59
|
+
<section class="mono-section" aria-label="Aggregate statistics">
|
|
60
|
+
<h2 class="mono-heading"># stats</h2>
|
|
61
|
+
<div class="stats-grid" role="list">
|
|
62
|
+
<div class="stat-cell" role="listitem">
|
|
63
|
+
<div class="stat-key">projects:</div>
|
|
64
|
+
<div class="stat-value">{{ projects.size }}</div>
|
|
65
|
+
</div>
|
|
66
|
+
<div class="stat-cell" role="listitem">
|
|
67
|
+
<div class="stat-key">sessions:</div>
|
|
68
|
+
<div class="stat-value">{{ totalSessions }}</div>
|
|
69
|
+
</div>
|
|
70
|
+
{% if efficiencyMultiplier %}
|
|
71
|
+
<div class="stat-cell stat-cell--leverage" role="listitem">
|
|
72
|
+
<div class="leverage-terminal">
|
|
73
|
+
<div class="lev-line"><span class="lev-key">human:</span> <span class="lev-val">{{ totalDurationMinutes | formatDuration }}</span></div>
|
|
74
|
+
<div class="lev-line"><span class="lev-key">agents:</span> <span class="lev-val lev-val--agent">{{ totalAgentDurationMinutes | formatDuration }}</span></div>
|
|
75
|
+
<div class="lev-line"><span class="lev-key">multi:</span> <span class="lev-val lev-val--multi">{{ efficiencyMultiplier }}</span></div>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
{% else %}
|
|
79
|
+
<div class="stat-cell" role="listitem">
|
|
80
|
+
<div class="stat-key">time:</div>
|
|
81
|
+
<div class="stat-value">{{ durationLabel }}</div>
|
|
82
|
+
</div>
|
|
83
|
+
{% endif %}
|
|
84
|
+
<div class="stat-cell" role="listitem">
|
|
85
|
+
<div class="stat-key">lines_changed:</div>
|
|
86
|
+
<div class="stat-value">{{ totalLoc | localeNumber }}</div>
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
</section>
|
|
90
|
+
|
|
91
|
+
{%- comment -%} Work Timeline chart mount {%- endcomment -%}
|
|
92
|
+
{% if sessionsJson %}
|
|
93
|
+
<section class="mono-section" aria-label="Work timeline">
|
|
94
|
+
<h2 class="mono-heading"># work_timeline</h2>
|
|
95
|
+
<div class="terminal-block">
|
|
96
|
+
<div class="terminal-header">
|
|
97
|
+
<div class="terminal-dots">
|
|
98
|
+
<span class="dot-red" aria-hidden="true"></span>
|
|
99
|
+
<span class="dot-yellow" aria-hidden="true"></span>
|
|
100
|
+
<span class="dot-green" aria-hidden="true"></span>
|
|
101
|
+
</div>
|
|
102
|
+
<span>hours per project</span>
|
|
103
|
+
</div>
|
|
104
|
+
<div class="terminal-body">
|
|
105
|
+
<div data-work-timeline data-sessions='{{ sessionsJson | raw }}'></div>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
</section>
|
|
109
|
+
{% endif %}
|
|
110
|
+
|
|
111
|
+
{%- comment -%} Projects {%- endcomment -%}
|
|
112
|
+
{% if projects.size > 0 %}
|
|
113
|
+
<section class="mono-section" aria-label="Projects">
|
|
114
|
+
<h2 class="mono-heading"># projects</h2>
|
|
115
|
+
<div class="project-list">
|
|
116
|
+
{% for p in projects %}
|
|
117
|
+
<a href="/{{ user.username }}/{{ p.slug }}" class="project-card">
|
|
118
|
+
<div class="project-card-header">
|
|
119
|
+
<h3 class="project-name">{{ p.title }}</h3>
|
|
120
|
+
</div>
|
|
121
|
+
<div class="project-card-body">
|
|
122
|
+
{% if p.narrative != blank %}
|
|
123
|
+
<p class="project-narrative">{{ p.narrative }}</p>
|
|
124
|
+
{% endif %}
|
|
125
|
+
<div class="project-stats-row">
|
|
126
|
+
<span class="project-stat"><strong>{{ p.totalSessions }}</strong> sessions</span>
|
|
127
|
+
<span class="project-stat"><strong>{{ p.totalDurationMinutes | formatDuration }}</strong></span>
|
|
128
|
+
<span class="project-stat"><strong>{{ p.totalLoc | localeNumber }}</strong> LOC</span>
|
|
129
|
+
</div>
|
|
130
|
+
{% if p.skills.size > 0 %}
|
|
131
|
+
<div class="project-tags">
|
|
132
|
+
{% for skill in p.skills %}
|
|
133
|
+
<span class="tag">[{{ skill }}]</span>
|
|
134
|
+
{% endfor %}
|
|
135
|
+
</div>
|
|
136
|
+
{% endif %}
|
|
137
|
+
{% if p.sourceCounts.size > 0 %}
|
|
138
|
+
{% assign pTotalSrc = 0 %}
|
|
139
|
+
{% for src in p.sourceCounts %}{% assign pTotalSrc = pTotalSrc | plus: src.count %}{% endfor %}
|
|
140
|
+
{% if pTotalSrc > 0 %}
|
|
141
|
+
<div class="source-bar" role="img" aria-label="Source mix">
|
|
142
|
+
{% for src in p.sourceCounts %}
|
|
143
|
+
{% assign pSrcPct = src.count | times: 100.0 | divided_by: pTotalSrc | round %}
|
|
144
|
+
<div class="source-bar-segment {% if forloop.first %}claude{% else %}cursor{% endif %}" style="width: {{ pSrcPct }}%;"></div>
|
|
145
|
+
{% endfor %}
|
|
146
|
+
</div>
|
|
147
|
+
<div class="source-legend" aria-hidden="true">
|
|
148
|
+
{% for src in p.sourceCounts %}
|
|
149
|
+
{% assign pSrcPct = src.count | times: 100.0 | divided_by: pTotalSrc | round %}
|
|
150
|
+
<span><span class="source-legend-dot {% if forloop.first %}claude{% else %}cursor{% endif %}"></span>{{ src.tool }} {{ pSrcPct }}%</span>
|
|
151
|
+
{% endfor %}
|
|
152
|
+
</div>
|
|
153
|
+
{% endif %}
|
|
154
|
+
{% endif %}
|
|
155
|
+
</div>
|
|
156
|
+
</a>
|
|
157
|
+
{% endfor %}
|
|
158
|
+
</div>
|
|
159
|
+
</section>
|
|
160
|
+
{% endif %}
|
|
161
|
+
|
|
162
|
+
{%- comment -%} LOC Breakdown (ASCII) {%- endcomment -%}
|
|
163
|
+
{% if projects.size > 0 %}
|
|
164
|
+
<section class="mono-section" aria-label="Lines of code per project">
|
|
165
|
+
<h2 class="mono-heading"># loc_breakdown</h2>
|
|
166
|
+
<div class="terminal-block">
|
|
167
|
+
<div class="terminal-header">
|
|
168
|
+
<div class="terminal-dots">
|
|
169
|
+
<span class="dot-red" aria-hidden="true"></span>
|
|
170
|
+
<span class="dot-yellow" aria-hidden="true"></span>
|
|
171
|
+
<span class="dot-green" aria-hidden="true"></span>
|
|
172
|
+
</div>
|
|
173
|
+
<span>lines of code per project</span>
|
|
174
|
+
</div>
|
|
175
|
+
<div class="terminal-body">
|
|
176
|
+
<div class="ascii-chart" role="img" aria-label="Lines of code per project">
|
|
177
|
+
{% assign maxLoc = 0 %}
|
|
178
|
+
{% for p in projects %}
|
|
179
|
+
{% if p.totalLoc > maxLoc %}{% assign maxLoc = p.totalLoc %}{% endif %}
|
|
180
|
+
{% endfor %}
|
|
181
|
+
{% for p in projects %}
|
|
182
|
+
<div class="ascii-row">
|
|
183
|
+
<span class="ascii-label">{{ p.title }}</span>
|
|
184
|
+
<div class="ascii-bar">
|
|
185
|
+
{% if maxLoc > 0 %}
|
|
186
|
+
{% assign locPct = p.totalLoc | times: 45 | divided_by: maxLoc %}
|
|
187
|
+
{% else %}
|
|
188
|
+
{% assign locPct = 0 %}
|
|
189
|
+
{% endif %}
|
|
190
|
+
{% assign filledBlocks = '' %}
|
|
191
|
+
{% assign emptyBlocks = '' %}
|
|
192
|
+
{% for i in (1..45) %}
|
|
193
|
+
{% if i <= locPct %}{% assign filledBlocks = filledBlocks | append: '▓' %}{% else %}{% assign emptyBlocks = emptyBlocks | append: '░' %}{% endif %}
|
|
194
|
+
{% endfor %}
|
|
195
|
+
<span class="ascii-bar-fill" aria-hidden="true">{{ filledBlocks }}{{ emptyBlocks }}</span>
|
|
196
|
+
<span class="ascii-bar-value">{{ p.totalLoc | localeNumber }}</span>
|
|
197
|
+
</div>
|
|
198
|
+
</div>
|
|
199
|
+
{% endfor %}
|
|
200
|
+
</div>
|
|
201
|
+
</div>
|
|
202
|
+
</div>
|
|
203
|
+
</section>
|
|
204
|
+
{% endif %}
|
|
205
|
+
|
|
206
|
+
{%- comment -%} Sessions per Project (ASCII) {%- endcomment -%}
|
|
207
|
+
{% if projects.size > 0 %}
|
|
208
|
+
<section class="mono-section" aria-label="Sessions per project">
|
|
209
|
+
<h2 class="mono-heading"># sessions_per_project</h2>
|
|
210
|
+
<div class="terminal-block">
|
|
211
|
+
<div class="terminal-header">
|
|
212
|
+
<div class="terminal-dots">
|
|
213
|
+
<span class="dot-red" aria-hidden="true"></span>
|
|
214
|
+
<span class="dot-yellow" aria-hidden="true"></span>
|
|
215
|
+
<span class="dot-green" aria-hidden="true"></span>
|
|
216
|
+
</div>
|
|
217
|
+
<span>session count per project</span>
|
|
218
|
+
</div>
|
|
219
|
+
<div class="terminal-body">
|
|
220
|
+
<div class="ascii-chart" role="img" aria-label="Sessions per project">
|
|
221
|
+
{% assign maxSessions = 0 %}
|
|
222
|
+
{% for p in projects %}
|
|
223
|
+
{% if p.totalSessions > maxSessions %}{% assign maxSessions = p.totalSessions %}{% endif %}
|
|
224
|
+
{% endfor %}
|
|
225
|
+
{% for p in projects %}
|
|
226
|
+
<div class="ascii-row">
|
|
227
|
+
<span class="ascii-label">{{ p.title }}</span>
|
|
228
|
+
<div class="ascii-bar">
|
|
229
|
+
{% if maxSessions > 0 %}
|
|
230
|
+
{% assign sesPct = p.totalSessions | times: 45 | divided_by: maxSessions %}
|
|
231
|
+
{% else %}
|
|
232
|
+
{% assign sesPct = 0 %}
|
|
233
|
+
{% endif %}
|
|
234
|
+
{% assign filledBlocks = '' %}
|
|
235
|
+
{% assign emptyBlocks = '' %}
|
|
236
|
+
{% for i in (1..45) %}
|
|
237
|
+
{% if i <= sesPct %}{% assign filledBlocks = filledBlocks | append: '▓' %}{% else %}{% assign emptyBlocks = emptyBlocks | append: '░' %}{% endif %}
|
|
238
|
+
{% endfor %}
|
|
239
|
+
<span class="ascii-bar-fill" aria-hidden="true">{{ filledBlocks }}{{ emptyBlocks }}</span>
|
|
240
|
+
<span class="ascii-bar-value">{{ p.totalSessions }}</span>
|
|
241
|
+
</div>
|
|
242
|
+
</div>
|
|
243
|
+
{% endfor %}
|
|
244
|
+
</div>
|
|
245
|
+
</div>
|
|
246
|
+
</div>
|
|
247
|
+
</section>
|
|
248
|
+
{% endif %}
|
|
249
|
+
|
|
250
|
+
{%- comment -%} Skills Aggregate {%- endcomment -%}
|
|
251
|
+
{% if allSkills.size > 0 %}
|
|
252
|
+
<section class="mono-section" aria-label="All skills">
|
|
253
|
+
<h2 class="mono-heading"># skills --all</h2>
|
|
254
|
+
<div class="terminal-block">
|
|
255
|
+
<div class="terminal-header">
|
|
256
|
+
<div class="terminal-dots">
|
|
257
|
+
<span class="dot-red" aria-hidden="true"></span>
|
|
258
|
+
<span class="dot-yellow" aria-hidden="true"></span>
|
|
259
|
+
<span class="dot-green" aria-hidden="true"></span>
|
|
260
|
+
</div>
|
|
261
|
+
<span>cat skills.json | sort</span>
|
|
262
|
+
</div>
|
|
263
|
+
<div class="terminal-body">
|
|
264
|
+
<div class="project-tags">
|
|
265
|
+
{% for skill in allSkills %}
|
|
266
|
+
<span class="tag">[{{ skill.name }}]</span>
|
|
267
|
+
{% endfor %}
|
|
268
|
+
</div>
|
|
269
|
+
</div>
|
|
270
|
+
</div>
|
|
271
|
+
</section>
|
|
272
|
+
{% endif %}
|
|
273
|
+
|
|
274
|
+
</div>
|
|
275
|
+
|
|
276
|
+
<footer class="mono-footer">
|
|
277
|
+
<p>// generated by heyi.am · mono template</p>
|
|
278
|
+
</footer>
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
</div>
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
<div class="heyiam-project mono" data-render-version="2" data-template="mono"{% if sessionBaseUrl %} data-session-base-url="{{ sessionBaseUrl }}"{% endif %} data-username="{{ user.username }}" data-project-slug="{{ project.slug }}">
|
|
2
|
+
|
|
3
|
+
<div class="mono-page">
|
|
4
|
+
|
|
5
|
+
{%- comment -%} Breadcrumb {%- endcomment -%}
|
|
6
|
+
<nav class="breadcrumb" aria-label="Breadcrumb">
|
|
7
|
+
<a href="/{{ user.username }}">{{ user.username }}</a>
|
|
8
|
+
<span class="sep">/</span>
|
|
9
|
+
<span>{{ project.slug }}</span>
|
|
10
|
+
</nav>
|
|
11
|
+
|
|
12
|
+
{%- comment -%} Hero {%- endcomment -%}
|
|
13
|
+
<section class="mono-section" aria-label="Project header">
|
|
14
|
+
<h1 class="hero-title--project" aria-label="{{ project.title }}">{{ project.title }}</h1>
|
|
15
|
+
{% if project.repoUrl or project.projectUrl %}
|
|
16
|
+
<div class="hero-links">
|
|
17
|
+
{% if project.repoUrl %}
|
|
18
|
+
<a href="{{ project.repoUrl }}" target="_blank" rel="noopener">{{ project.repoUrl | stripProtocol }}</a>
|
|
19
|
+
{% endif %}
|
|
20
|
+
{% if project.projectUrl %}
|
|
21
|
+
<a href="{{ project.projectUrl }}" target="_blank" rel="noopener">{{ project.projectUrl | stripProtocol }}</a>
|
|
22
|
+
{% endif %}
|
|
23
|
+
</div>
|
|
24
|
+
{% endif %}
|
|
25
|
+
|
|
26
|
+
{% if project.screenshotUrl %}
|
|
27
|
+
<div class="screenshot-frame">
|
|
28
|
+
<div class="screenshot-chrome">
|
|
29
|
+
<div class="dots">
|
|
30
|
+
<span class="dot-r" aria-hidden="true"></span>
|
|
31
|
+
<span class="dot-y" aria-hidden="true"></span>
|
|
32
|
+
<span class="dot-g" aria-hidden="true"></span>
|
|
33
|
+
</div>
|
|
34
|
+
{% if project.projectUrl %}
|
|
35
|
+
<div class="url-bar">{{ project.projectUrl | stripProtocol }}</div>
|
|
36
|
+
{% endif %}
|
|
37
|
+
</div>
|
|
38
|
+
<img src="{{ project.screenshotUrl }}" alt="{{ project.title }} screenshot" class="screenshot-body">
|
|
39
|
+
</div>
|
|
40
|
+
{% endif %}
|
|
41
|
+
</section>
|
|
42
|
+
|
|
43
|
+
{%- comment -%} Stats {%- endcomment -%}
|
|
44
|
+
<section class="mono-section" aria-label="Project statistics">
|
|
45
|
+
<h2 class="mono-heading"># stats</h2>
|
|
46
|
+
<div class="stats-grid" role="list">
|
|
47
|
+
<div class="stat-cell" role="listitem">
|
|
48
|
+
<div class="stat-key">sessions:</div>
|
|
49
|
+
<div class="stat-value">{{ project.totalSessions }}</div>
|
|
50
|
+
</div>
|
|
51
|
+
{% if efficiencyMultiplier %}
|
|
52
|
+
<div class="stat-cell stat-cell--leverage" role="listitem">
|
|
53
|
+
<div class="leverage-terminal">
|
|
54
|
+
<div class="lev-line"><span class="lev-key">human:</span> <span class="lev-val">{{ project.totalDurationMinutes | formatDuration }}</span></div>
|
|
55
|
+
<div class="lev-line"><span class="lev-key">agents:</span> <span class="lev-val lev-val--agent">{{ project.totalAgentDurationMinutes | formatDuration }}</span></div>
|
|
56
|
+
<div class="lev-line"><span class="lev-key">multi:</span> <span class="lev-val lev-val--multi">{{ efficiencyMultiplier }}</span></div>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
{% else %}
|
|
60
|
+
<div class="stat-cell" role="listitem">
|
|
61
|
+
<div class="stat-key">time:</div>
|
|
62
|
+
<div class="stat-value">{{ project.totalDurationMinutes | formatDuration }}</div>
|
|
63
|
+
</div>
|
|
64
|
+
{% endif %}
|
|
65
|
+
<div class="stat-cell" role="listitem">
|
|
66
|
+
<div class="stat-key">loc:</div>
|
|
67
|
+
<div class="stat-value">{{ project.totalLoc | localeNumber }}</div>
|
|
68
|
+
</div>
|
|
69
|
+
<div class="stat-cell" role="listitem">
|
|
70
|
+
<div class="stat-key">files:</div>
|
|
71
|
+
<div class="stat-value">{{ project.totalFilesChanged | localeNumber }}</div>
|
|
72
|
+
</div>
|
|
73
|
+
{% if project.totalTokens %}
|
|
74
|
+
<div class="stat-cell" role="listitem">
|
|
75
|
+
<div class="stat-key">tokens:</div>
|
|
76
|
+
<div class="stat-value">{{ project.totalTokens | formatTokens }}</div>
|
|
77
|
+
</div>
|
|
78
|
+
{% endif %}
|
|
79
|
+
</div>
|
|
80
|
+
</section>
|
|
81
|
+
|
|
82
|
+
{%- comment -%} Narrative {%- endcomment -%}
|
|
83
|
+
{% if project.narrative %}
|
|
84
|
+
<section class="mono-section" aria-label="Project narrative">
|
|
85
|
+
<h2 class="mono-heading"># narrative</h2>
|
|
86
|
+
<div class="terminal-block">
|
|
87
|
+
<div class="terminal-header">
|
|
88
|
+
<div class="terminal-dots">
|
|
89
|
+
<span class="dot-red" aria-hidden="true"></span>
|
|
90
|
+
<span class="dot-yellow" aria-hidden="true"></span>
|
|
91
|
+
<span class="dot-green" aria-hidden="true"></span>
|
|
92
|
+
</div>
|
|
93
|
+
<span>cat narrative.md</span>
|
|
94
|
+
</div>
|
|
95
|
+
<div class="narrative-block">
|
|
96
|
+
<p class="narrative-line">{{ project.narrative }}</p>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
</section>
|
|
100
|
+
{% endif %}
|
|
101
|
+
|
|
102
|
+
{%- comment -%} Phases (Git Log) {%- endcomment -%}
|
|
103
|
+
{% if arc.size > 0 %}
|
|
104
|
+
<section class="mono-section" aria-label="Project phases">
|
|
105
|
+
<h2 class="mono-heading"># git log --phases</h2>
|
|
106
|
+
<div class="terminal-block">
|
|
107
|
+
<div class="terminal-header">
|
|
108
|
+
<div class="terminal-dots">
|
|
109
|
+
<span class="dot-red" aria-hidden="true"></span>
|
|
110
|
+
<span class="dot-yellow" aria-hidden="true"></span>
|
|
111
|
+
<span class="dot-green" aria-hidden="true"></span>
|
|
112
|
+
</div>
|
|
113
|
+
<span>git log --oneline --graph</span>
|
|
114
|
+
</div>
|
|
115
|
+
<div class="terminal-body">
|
|
116
|
+
<div class="git-log" role="list" aria-label="Project phases as git log">
|
|
117
|
+
{% for item in arc %}
|
|
118
|
+
<div class="git-log-entry" role="listitem">
|
|
119
|
+
<div class="git-log-graph" aria-hidden="true">
|
|
120
|
+
<div class="git-log-node"></div>
|
|
121
|
+
{% unless forloop.last %}<div class="git-log-line"></div>{% endunless %}
|
|
122
|
+
</div>
|
|
123
|
+
<div class="git-log-content">
|
|
124
|
+
<div><span class="git-log-hash">{{ item.phase | prepend: '0' | slice: -2, 2 }}</span> <span class="git-log-msg">{{ item.title }}</span></div>
|
|
125
|
+
{% if item.dates != blank %}
|
|
126
|
+
<div class="git-log-date">{{ item.dates }}</div>
|
|
127
|
+
{% endif %}
|
|
128
|
+
<div class="git-log-detail">{{ item.description }}</div>
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
{% endfor %}
|
|
132
|
+
</div>
|
|
133
|
+
</div>
|
|
134
|
+
</div>
|
|
135
|
+
</section>
|
|
136
|
+
{% endif %}
|
|
137
|
+
|
|
138
|
+
{%- comment -%} Work Timeline (ASCII bar chart) {%- endcomment -%}
|
|
139
|
+
{% if featuredSessions.size > 0 %}
|
|
140
|
+
{% assign maxLoc = 1 %}
|
|
141
|
+
{% for s in featuredSessions %}
|
|
142
|
+
{% if s.locChanged > maxLoc %}{% assign maxLoc = s.locChanged %}{% endif %}
|
|
143
|
+
{% endfor %}
|
|
144
|
+
<section class="mono-section" aria-label="Session work timeline">
|
|
145
|
+
<h2 class="mono-heading"># work_timeline</h2>
|
|
146
|
+
<div class="terminal-block">
|
|
147
|
+
<div class="terminal-header">
|
|
148
|
+
<div class="terminal-dots">
|
|
149
|
+
<span class="dot-red" aria-hidden="true"></span>
|
|
150
|
+
<span class="dot-yellow" aria-hidden="true"></span>
|
|
151
|
+
<span class="dot-green" aria-hidden="true"></span>
|
|
152
|
+
</div>
|
|
153
|
+
<span>LOC per session</span>
|
|
154
|
+
</div>
|
|
155
|
+
<div class="terminal-body">
|
|
156
|
+
<div class="ascii-chart" role="img" aria-label="Lines of code per session bar chart">
|
|
157
|
+
{% for s in featuredSessions %}
|
|
158
|
+
{% assign barPct = s.locChanged | times: 100 | divided_by: maxLoc %}
|
|
159
|
+
{% assign fillCount = barPct | times: 40 | divided_by: 100 %}
|
|
160
|
+
{% if fillCount < 1 %}{% assign fillCount = 1 %}{% endif %}
|
|
161
|
+
<div class="ascii-row">
|
|
162
|
+
<span class="ascii-label">{{ s.title | truncate: 12 }}</span>
|
|
163
|
+
<div class="ascii-bar">
|
|
164
|
+
<span class="ascii-bar-fill" aria-hidden="true">{% for i in (1..fillCount) %}▓{% endfor %}</span>
|
|
165
|
+
<span class="ascii-bar-value">{{ s.locChanged | localeNumber }}</span>
|
|
166
|
+
</div>
|
|
167
|
+
</div>
|
|
168
|
+
{% endfor %}
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
</div>
|
|
172
|
+
</section>
|
|
173
|
+
{% endif %}
|
|
174
|
+
|
|
175
|
+
{%- comment -%} Skills {%- endcomment -%}
|
|
176
|
+
{% if project.skills.size > 0 %}
|
|
177
|
+
<section class="mono-section" aria-label="Skills used">
|
|
178
|
+
<h2 class="mono-heading"># skills</h2>
|
|
179
|
+
<div class="tag-list">
|
|
180
|
+
{% for skill in project.skills %}
|
|
181
|
+
<span class="tag">[{{ skill }}]</span>
|
|
182
|
+
{% endfor %}
|
|
183
|
+
</div>
|
|
184
|
+
</section>
|
|
185
|
+
{% endif %}
|
|
186
|
+
|
|
187
|
+
{%- comment -%} Key Decisions {%- endcomment -%}
|
|
188
|
+
{% if arc.size > 0 %}
|
|
189
|
+
<section class="mono-section" aria-label="Key decisions">
|
|
190
|
+
<h2 class="mono-heading"># key_decisions</h2>
|
|
191
|
+
<div class="terminal-block">
|
|
192
|
+
<div class="terminal-header">
|
|
193
|
+
<div class="terminal-dots">
|
|
194
|
+
<span class="dot-red" aria-hidden="true"></span>
|
|
195
|
+
<span class="dot-yellow" aria-hidden="true"></span>
|
|
196
|
+
<span class="dot-green" aria-hidden="true"></span>
|
|
197
|
+
</div>
|
|
198
|
+
<span>cat decisions.log</span>
|
|
199
|
+
</div>
|
|
200
|
+
<div class="terminal-body">
|
|
201
|
+
<ol class="decisions-list">
|
|
202
|
+
{% for item in arc %}
|
|
203
|
+
<li>
|
|
204
|
+
<span class="decision-num">[{{ forloop.index }}]</span>
|
|
205
|
+
<span>{{ item.description }}</span>
|
|
206
|
+
</li>
|
|
207
|
+
{% endfor %}
|
|
208
|
+
</ol>
|
|
209
|
+
</div>
|
|
210
|
+
</div>
|
|
211
|
+
</section>
|
|
212
|
+
{% endif %}
|
|
213
|
+
|
|
214
|
+
{%- comment -%} Source Breakdown {%- endcomment -%}
|
|
215
|
+
{% if sourceCounts.size > 0 %}
|
|
216
|
+
<section class="mono-section" aria-label="Source breakdown">
|
|
217
|
+
<h2 class="mono-heading"># source_breakdown</h2>
|
|
218
|
+
{% assign totalSourceSessions = 0 %}
|
|
219
|
+
{% for src in sourceCounts %}
|
|
220
|
+
{% assign totalSourceSessions = totalSourceSessions | plus: src.count %}
|
|
221
|
+
{% endfor %}
|
|
222
|
+
{% if totalSourceSessions > 0 %}
|
|
223
|
+
<div class="source-breakdown">
|
|
224
|
+
{% for src in sourceCounts %}
|
|
225
|
+
{% assign srcPct = src.count | times: 100.0 | divided_by: totalSourceSessions | round %}
|
|
226
|
+
<span{% if forloop.first %} style="color: var(--mono-accent, #4ade80);"{% else %} style="color: var(--mono-text-dim, #666666);"{% endif %}>{{ src.tool }} {{ srcPct }}%</span>
|
|
227
|
+
{% endfor %}
|
|
228
|
+
</div>
|
|
229
|
+
<div class="source-bar" role="img" aria-label="Source mix">
|
|
230
|
+
{% for src in sourceCounts %}
|
|
231
|
+
{% assign srcPct = src.count | times: 100.0 | divided_by: totalSourceSessions | round %}
|
|
232
|
+
<div class="source-bar-segment{% if forloop.first %} claude{% else %} cursor{% endif %}" style="width: {{ srcPct }}%;"></div>
|
|
233
|
+
{% endfor %}
|
|
234
|
+
</div>
|
|
235
|
+
{% endif %}
|
|
236
|
+
</section>
|
|
237
|
+
{% endif %}
|
|
238
|
+
|
|
239
|
+
{%- comment -%} Featured Sessions {%- endcomment -%}
|
|
240
|
+
{% if featuredSessions.size > 0 %}
|
|
241
|
+
<section class="mono-section" aria-label="Featured sessions">
|
|
242
|
+
<h2 class="mono-heading"># sessions</h2>
|
|
243
|
+
<div class="session-grid">
|
|
244
|
+
{% for s in featuredSessions %}
|
|
245
|
+
<article class="session-card">
|
|
246
|
+
<div class="session-card-header">
|
|
247
|
+
<span aria-hidden="true">$</span> session #{{ forloop.index }}
|
|
248
|
+
</div>
|
|
249
|
+
<div class="session-card-body">
|
|
250
|
+
<h3 class="session-card-title"><a href="{{ sessionBaseUrl }}/{{ s.slug }}{{ sessionSuffix }}">{{ s.title }}</a></h3>
|
|
251
|
+
<div class="session-kv"><span class="session-kv-key">duration:</span><span class="session-kv-value">{{ s.durationMinutes | formatDuration }}</span></div>
|
|
252
|
+
<div class="session-kv"><span class="session-kv-key">loc:</span><span class="session-kv-value">{{ s.locChanged | localeNumber }}</span></div>
|
|
253
|
+
{% if s.agentSummary %}
|
|
254
|
+
<div class="session-kv"><span class="session-kv-key">agents:</span><span class="session-kv-value">{{ s.agentSummary.agents.size }}</span></div>
|
|
255
|
+
{% else %}
|
|
256
|
+
<div class="session-kv"><span class="session-kv-key">turns:</span><span class="session-kv-value">{{ s.turns }}</span></div>
|
|
257
|
+
{% endif %}
|
|
258
|
+
{% if s.skills.size > 0 %}
|
|
259
|
+
<span class="session-card-tag">[{{ s.skills | first }}]</span>
|
|
260
|
+
{% endif %}
|
|
261
|
+
</div>
|
|
262
|
+
</article>
|
|
263
|
+
{% endfor %}
|
|
264
|
+
</div>
|
|
265
|
+
</section>
|
|
266
|
+
{% endif %}
|
|
267
|
+
|
|
268
|
+
</div>
|
|
269
|
+
|
|
270
|
+
<footer class="mono-footer">
|
|
271
|
+
<p>// generated by heyi.am · mono template</p>
|
|
272
|
+
</footer>
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
</div>
|