heyiam 0.2.4 → 0.2.6
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/dist/bridge.js +6 -0
- package/dist/bridge.js.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/parsers/claude.js +6 -5
- package/dist/parsers/claude.js.map +1 -1
- package/dist/parsers/codex.d.ts +1 -1
- package/dist/parsers/codex.js +9 -13
- package/dist/parsers/codex.js.map +1 -1
- package/dist/parsers/types.d.ts +5 -0
- package/dist/parsers/types.js +24 -0
- package/dist/parsers/types.js.map +1 -1
- package/dist/render/templates/project.liquid +211 -0
- package/dist/render/templates/session.liquid +158 -0
- package/dist/render/templates/styles.css +569 -0
- package/dist/render/templates/templates/project.liquid +211 -0
- package/dist/render/templates/templates/session.liquid +158 -0
- package/dist/render/templates/templates/styles.css +569 -0
- package/dist/server.js +6 -1
- package/dist/server.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
<div class="heyiam-project" data-render-version="2">
|
|
2
|
+
|
|
3
|
+
{%- comment -%} Title {%- endcomment -%}
|
|
4
|
+
<h1 class="project-title">{{ project.title }}</h1>
|
|
5
|
+
|
|
6
|
+
{%- comment -%} Project links {%- endcomment -%}
|
|
7
|
+
{% if project.repoUrl or project.projectUrl %}
|
|
8
|
+
<div class="project-links">
|
|
9
|
+
{% if project.repoUrl %}
|
|
10
|
+
<a href="{{ project.repoUrl }}" target="_blank" rel="noopener noreferrer" class="project-link">
|
|
11
|
+
<svg class="project-link__icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/></svg>
|
|
12
|
+
{{ project.repoUrl | stripProtocol }}
|
|
13
|
+
</a>
|
|
14
|
+
{% endif %}
|
|
15
|
+
{% if project.projectUrl %}
|
|
16
|
+
<a href="{{ project.projectUrl }}" target="_blank" rel="noopener noreferrer" class="project-link">
|
|
17
|
+
<svg class="project-link__icon" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M6.5 10.5l3-3m-1.5-2a2.5 2.5 0 013.54 3.54l-1.5 1.5m-4.08-1.08a2.5 2.5 0 01-3.54-3.54l1.5-1.5"/></svg>
|
|
18
|
+
{{ project.projectUrl | stripProtocol }}
|
|
19
|
+
</a>
|
|
20
|
+
{% endif %}
|
|
21
|
+
</div>
|
|
22
|
+
{% endif %}
|
|
23
|
+
|
|
24
|
+
{%- comment -%} Screenshot with browser chrome {%- endcomment -%}
|
|
25
|
+
{% if project.screenshotUrl %}
|
|
26
|
+
<div class="browser-chrome">
|
|
27
|
+
<div class="browser-chrome__bar">
|
|
28
|
+
<span class="browser-chrome__dot browser-chrome__dot--red"></span>
|
|
29
|
+
<span class="browser-chrome__dot browser-chrome__dot--yellow"></span>
|
|
30
|
+
<span class="browser-chrome__dot browser-chrome__dot--green"></span>
|
|
31
|
+
</div>
|
|
32
|
+
<div class="browser-chrome__viewport">
|
|
33
|
+
<img src="{{ project.screenshotUrl }}" alt="Screenshot of {{ project.title }}" class="browser-chrome__img" loading="lazy" />
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
{% endif %}
|
|
37
|
+
|
|
38
|
+
{%- comment -%} Narrative {%- endcomment -%}
|
|
39
|
+
{% if project.narrative != blank %}
|
|
40
|
+
<div class="card">
|
|
41
|
+
<div class="section-header">
|
|
42
|
+
<h3 class="section-header__title">Narrative summary</h3>
|
|
43
|
+
</div>
|
|
44
|
+
<p class="narrative-text">{{ project.narrative }}</p>
|
|
45
|
+
</div>
|
|
46
|
+
{% endif %}
|
|
47
|
+
|
|
48
|
+
{%- comment -%} Stats grid {%- endcomment -%}
|
|
49
|
+
<div class="stat-grid">
|
|
50
|
+
<div class="stat-card">
|
|
51
|
+
<div class="stat-card__label">Sessions</div>
|
|
52
|
+
<div class="stat-card__value">{{ project.totalSessions }}</div>
|
|
53
|
+
</div>
|
|
54
|
+
<div class="stat-card">
|
|
55
|
+
<div class="stat-card__label">{{ durationLabel }}</div>
|
|
56
|
+
<div class="stat-card__value">
|
|
57
|
+
{% if project.totalAgentDurationMinutes %}
|
|
58
|
+
{{ project.totalDurationMinutes | formatDuration }} / {{ project.totalAgentDurationMinutes | formatDuration }}
|
|
59
|
+
{% else %}
|
|
60
|
+
{{ project.totalDurationMinutes | formatDuration }}
|
|
61
|
+
{% endif %}
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
<div class="stat-card">
|
|
65
|
+
<div class="stat-card__label">Lines changed</div>
|
|
66
|
+
<div class="stat-card__value">{{ project.totalLoc | formatLoc }}</div>
|
|
67
|
+
</div>
|
|
68
|
+
<div class="stat-card">
|
|
69
|
+
<div class="stat-card__label">Files</div>
|
|
70
|
+
<div class="stat-card__value">{{ project.totalFilesChanged }}</div>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
|
|
74
|
+
{%- comment -%} Work Timeline mount point {%- endcomment -%}
|
|
75
|
+
<div class="card">
|
|
76
|
+
<div class="section-header">
|
|
77
|
+
<h3 class="section-header__title">Work timeline</h3>
|
|
78
|
+
<span class="section-header__meta">sessions over time</span>
|
|
79
|
+
</div>
|
|
80
|
+
<div data-work-timeline data-sessions='{{ sessionsJson | raw }}'></div>
|
|
81
|
+
</div>
|
|
82
|
+
|
|
83
|
+
{%- comment -%} Growth Chart mount point {%- endcomment -%}
|
|
84
|
+
<div class="card">
|
|
85
|
+
<div class="section-header">
|
|
86
|
+
<h3 class="section-header__title">Project growth</h3>
|
|
87
|
+
<span class="section-header__meta">cumulative LOC</span>
|
|
88
|
+
</div>
|
|
89
|
+
<div data-growth-chart data-total-loc="{{ project.totalLoc }}" data-total-files="{{ project.totalFilesChanged }}" data-sessions='{{ growthJson | raw }}'></div>
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
{%- comment -%} Key decisions + Source breakdown {%- endcomment -%}
|
|
93
|
+
<div class="two-col">
|
|
94
|
+
<div class="card">
|
|
95
|
+
<div class="section-header">
|
|
96
|
+
<h3 class="section-header__title">Key decisions</h3>
|
|
97
|
+
<span class="section-header__meta">signal</span>
|
|
98
|
+
</div>
|
|
99
|
+
{% if arc.size > 0 %}
|
|
100
|
+
<div class="note-stack">
|
|
101
|
+
{% for phase in arc limit: 3 %}
|
|
102
|
+
<div class="note">
|
|
103
|
+
<div class="note__title">{{ phase.title }}</div>
|
|
104
|
+
<div class="note__body">{{ phase.description }}</div>
|
|
105
|
+
</div>
|
|
106
|
+
{% endfor %}
|
|
107
|
+
</div>
|
|
108
|
+
{% else %}
|
|
109
|
+
<div class="note">
|
|
110
|
+
<div class="note__body">Enhance this project to extract key decisions.</div>
|
|
111
|
+
</div>
|
|
112
|
+
{% endif %}
|
|
113
|
+
</div>
|
|
114
|
+
<div class="card">
|
|
115
|
+
<div class="section-header">
|
|
116
|
+
<h3 class="section-header__title">Source breakdown</h3>
|
|
117
|
+
<span class="section-header__meta">provenance</span>
|
|
118
|
+
</div>
|
|
119
|
+
<table class="source-table">
|
|
120
|
+
<thead>
|
|
121
|
+
<tr>
|
|
122
|
+
<th class="source-table__th">Source</th>
|
|
123
|
+
<th class="source-table__th">Count</th>
|
|
124
|
+
</tr>
|
|
125
|
+
</thead>
|
|
126
|
+
<tbody>
|
|
127
|
+
{% for src in sourceCounts %}
|
|
128
|
+
<tr>
|
|
129
|
+
<td class="source-table__td">{{ src.tool }}</td>
|
|
130
|
+
<td class="source-table__td">{{ src.count }}</td>
|
|
131
|
+
</tr>
|
|
132
|
+
{% endfor %}
|
|
133
|
+
</tbody>
|
|
134
|
+
</table>
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
|
|
138
|
+
{%- comment -%} Project phases {%- endcomment -%}
|
|
139
|
+
{% if arc.size > 0 %}
|
|
140
|
+
<div class="card">
|
|
141
|
+
<div class="section-header">
|
|
142
|
+
<h3 class="section-header__title">Project phases</h3>
|
|
143
|
+
<span class="section-header__meta">timeline</span>
|
|
144
|
+
</div>
|
|
145
|
+
<div class="phase-timeline">
|
|
146
|
+
<div class="phase-timeline__line"></div>
|
|
147
|
+
{% for phase in arc %}
|
|
148
|
+
<div class="phase-timeline__item">
|
|
149
|
+
<div class="phase-timeline__dot"></div>
|
|
150
|
+
<div class="phase-timeline__label">{{ phase.title }}</div>
|
|
151
|
+
<div class="note">
|
|
152
|
+
<div class="note__body">{{ phase.description }}</div>
|
|
153
|
+
</div>
|
|
154
|
+
</div>
|
|
155
|
+
{% endfor %}
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
{% endif %}
|
|
159
|
+
|
|
160
|
+
{%- comment -%} Skills {%- endcomment -%}
|
|
161
|
+
{% if project.skills.size > 0 %}
|
|
162
|
+
<div class="card">
|
|
163
|
+
<div class="section-header">
|
|
164
|
+
<h3 class="section-header__title">Skills</h3>
|
|
165
|
+
</div>
|
|
166
|
+
<div class="chip-list">
|
|
167
|
+
{% for skill in project.skills %}
|
|
168
|
+
<span class="chip chip--violet">{{ skill }}</span>
|
|
169
|
+
{% endfor %}
|
|
170
|
+
</div>
|
|
171
|
+
</div>
|
|
172
|
+
{% endif %}
|
|
173
|
+
|
|
174
|
+
{%- comment -%} Featured session cards {%- endcomment -%}
|
|
175
|
+
{% if featuredSessions.size > 0 %}
|
|
176
|
+
<div class="card">
|
|
177
|
+
<div class="section-header">
|
|
178
|
+
<h3 class="section-header__title">Featured sessions</h3>
|
|
179
|
+
<span class="section-header__meta">{{ sessions.size }} total</span>
|
|
180
|
+
</div>
|
|
181
|
+
<div class="session-grid">
|
|
182
|
+
{% for session in featuredSessions %}
|
|
183
|
+
{% if sessionBaseUrl %}
|
|
184
|
+
<a href="{{ sessionBaseUrl }}/{{ session.slug | default: session.token }}.html" class="session-card-link">
|
|
185
|
+
{% endif %}
|
|
186
|
+
<div class="session-card" data-session-id="{{ session.token }}">
|
|
187
|
+
<div class="session-card__bar session-card__bar--{{ forloop.index0 | durationColor }}"></div>
|
|
188
|
+
<h4 class="session-card__title">{{ session.title }}</h4>
|
|
189
|
+
<span class="session-card__meta">
|
|
190
|
+
{{ session.durationMinutes | formatDuration }} · {{ session.turns }} turns · {{ session.locChanged | formatLoc }} lines
|
|
191
|
+
</span>
|
|
192
|
+
{% if session.skills.size > 0 %}
|
|
193
|
+
<div class="session-card__skills">
|
|
194
|
+
<span class="chip chip--violet">{{ session.skills[0] }}</span>
|
|
195
|
+
</div>
|
|
196
|
+
{% endif %}
|
|
197
|
+
</div>
|
|
198
|
+
{% if sessionBaseUrl %}
|
|
199
|
+
</a>
|
|
200
|
+
{% endif %}
|
|
201
|
+
{% endfor %}
|
|
202
|
+
</div>
|
|
203
|
+
</div>
|
|
204
|
+
{% endif %}
|
|
205
|
+
|
|
206
|
+
{%- comment -%} Footer {%- endcomment -%}
|
|
207
|
+
<div class="export-footer">
|
|
208
|
+
<span class="export-footer__text">exported from heyi.am</span>
|
|
209
|
+
</div>
|
|
210
|
+
|
|
211
|
+
</div>
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
<div class="heyiam-session" data-render-version="2" data-template="{{ session.template }}">
|
|
2
|
+
|
|
3
|
+
<div class="session-layout">
|
|
4
|
+
|
|
5
|
+
{%- comment -%} Sidebar {%- endcomment -%}
|
|
6
|
+
<aside class="session-sidebar">
|
|
7
|
+
{% if session.toolBreakdown.size > 0 %}
|
|
8
|
+
<div class="sidebar-section">
|
|
9
|
+
<h3 class="sidebar-section__heading">Tool Usage</h3>
|
|
10
|
+
<ul class="tool-list">
|
|
11
|
+
{% for t in session.toolBreakdown %}
|
|
12
|
+
<li class="tool-list__item">
|
|
13
|
+
<span class="tool-list__name">{{ t.tool }}</span>
|
|
14
|
+
<span class="tool-list__count">{{ t.count }}</span>
|
|
15
|
+
</li>
|
|
16
|
+
{% endfor %}
|
|
17
|
+
</ul>
|
|
18
|
+
</div>
|
|
19
|
+
{% endif %}
|
|
20
|
+
|
|
21
|
+
{% if session.topFiles.size > 0 %}
|
|
22
|
+
<div class="sidebar-section">
|
|
23
|
+
<h3 class="sidebar-section__heading">Top Files</h3>
|
|
24
|
+
<ul class="file-list">
|
|
25
|
+
{% for f in session.topFiles %}
|
|
26
|
+
<li class="file-list__item">
|
|
27
|
+
<span class="file-list__path">{{ f.path }}</span>
|
|
28
|
+
<span class="file-list__adds">+{{ f.additions }}</span>
|
|
29
|
+
<span class="file-list__dels">-{{ f.deletions }}</span>
|
|
30
|
+
</li>
|
|
31
|
+
{% endfor %}
|
|
32
|
+
</ul>
|
|
33
|
+
</div>
|
|
34
|
+
{% endif %}
|
|
35
|
+
</aside>
|
|
36
|
+
|
|
37
|
+
{%- comment -%} Main content {%- endcomment -%}
|
|
38
|
+
<main class="session-main">
|
|
39
|
+
|
|
40
|
+
{%- comment -%} Breadcrumb {%- endcomment -%}
|
|
41
|
+
<nav class="breadcrumb">
|
|
42
|
+
<a href="/@{{ user.username }}">{{ user.username }}</a>
|
|
43
|
+
{% if projectSlug %}
|
|
44
|
+
<span class="breadcrumb__sep" aria-hidden="true">/</span>
|
|
45
|
+
<a href="/@{{ user.username }}/p/{{ projectSlug }}">{{ projectSlug }}</a>
|
|
46
|
+
{% endif %}
|
|
47
|
+
<span class="breadcrumb__sep" aria-hidden="true">/</span>
|
|
48
|
+
<span>{{ session.title }}</span>
|
|
49
|
+
</nav>
|
|
50
|
+
|
|
51
|
+
{%- comment -%} Header {%- endcomment -%}
|
|
52
|
+
<header class="session-header">
|
|
53
|
+
<h1 class="session-header__title">{{ session.title }}</h1>
|
|
54
|
+
|
|
55
|
+
<div class="session-header__meta">
|
|
56
|
+
<time class="session-header__date" datetime="{{ session.recordedAt }}">
|
|
57
|
+
{{ session.recordedAt | formatDate }}
|
|
58
|
+
</time>
|
|
59
|
+
<span class="session-header__source">{{ session.sourceTool }}</span>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
{% if session.devTake != blank %}
|
|
63
|
+
<blockquote class="session-header__devtake">
|
|
64
|
+
<p>{{ session.devTake }}</p>
|
|
65
|
+
</blockquote>
|
|
66
|
+
{% endif %}
|
|
67
|
+
|
|
68
|
+
{% if session.context != blank %}
|
|
69
|
+
<p class="session-header__context">{{ session.context }}</p>
|
|
70
|
+
{% endif %}
|
|
71
|
+
|
|
72
|
+
<div class="stat-grid stat-grid--4">
|
|
73
|
+
<span class="stat">
|
|
74
|
+
<span class="stat__value">{{ session.durationMinutes | formatDuration }}</span>
|
|
75
|
+
<span class="stat__label">active</span>
|
|
76
|
+
</span>
|
|
77
|
+
<span class="stat">
|
|
78
|
+
<span class="stat__value">{{ session.turns }}</span>
|
|
79
|
+
<span class="stat__label">turns</span>
|
|
80
|
+
</span>
|
|
81
|
+
<span class="stat">
|
|
82
|
+
<span class="stat__value">{{ session.locChanged | localeNumber }}</span>
|
|
83
|
+
<span class="stat__label">lines changed</span>
|
|
84
|
+
</span>
|
|
85
|
+
<span class="stat">
|
|
86
|
+
<span class="stat__value">{{ session.filesChanged }}</span>
|
|
87
|
+
<span class="stat__label">files</span>
|
|
88
|
+
</span>
|
|
89
|
+
</div>
|
|
90
|
+
</header>
|
|
91
|
+
|
|
92
|
+
{%- comment -%} Skills {%- endcomment -%}
|
|
93
|
+
{% if session.skills.size > 0 %}
|
|
94
|
+
<section class="content-section">
|
|
95
|
+
<div class="chip-list">
|
|
96
|
+
{% for skill in session.skills %}
|
|
97
|
+
<span class="chip chip--violet">{{ skill }}</span>
|
|
98
|
+
{% endfor %}
|
|
99
|
+
</div>
|
|
100
|
+
</section>
|
|
101
|
+
{% endif %}
|
|
102
|
+
|
|
103
|
+
{%- comment -%} Narrative {%- endcomment -%}
|
|
104
|
+
{% if session.narrative != blank %}
|
|
105
|
+
<section class="content-section">
|
|
106
|
+
<h2 class="content-section__heading">Narrative</h2>
|
|
107
|
+
<p>{{ session.narrative }}</p>
|
|
108
|
+
</section>
|
|
109
|
+
{% endif %}
|
|
110
|
+
|
|
111
|
+
{%- comment -%} Highlights {%- endcomment -%}
|
|
112
|
+
{% if session.highlights.size > 0 %}
|
|
113
|
+
<section class="content-section">
|
|
114
|
+
<h2 class="content-section__heading">Highlights</h2>
|
|
115
|
+
<ul class="highlights-list">
|
|
116
|
+
{% for h in session.highlights %}
|
|
117
|
+
<li>{{ h }}</li>
|
|
118
|
+
{% endfor %}
|
|
119
|
+
</ul>
|
|
120
|
+
</section>
|
|
121
|
+
{% endif %}
|
|
122
|
+
|
|
123
|
+
{%- comment -%} Execution Path {%- endcomment -%}
|
|
124
|
+
{% if session.beats.size > 0 %}
|
|
125
|
+
<section class="content-section">
|
|
126
|
+
<h2 class="content-section__heading">Execution Path</h2>
|
|
127
|
+
<ol class="beats-list">
|
|
128
|
+
{% for beat in session.beats %}
|
|
129
|
+
<li class="beat">
|
|
130
|
+
<span class="beat__number">{{ beat.stepNumber }}</span>
|
|
131
|
+
<div class="beat__content">
|
|
132
|
+
<strong class="beat__title">{{ beat.title }}</strong>
|
|
133
|
+
<p class="beat__body">{{ beat.body }}</p>
|
|
134
|
+
</div>
|
|
135
|
+
</li>
|
|
136
|
+
{% endfor %}
|
|
137
|
+
</ol>
|
|
138
|
+
</section>
|
|
139
|
+
{% endif %}
|
|
140
|
+
|
|
141
|
+
{%- comment -%} Q&A {%- endcomment -%}
|
|
142
|
+
{% if session.qaPairs.size > 0 %}
|
|
143
|
+
<section class="content-section">
|
|
144
|
+
<h2 class="content-section__heading">Q&A</h2>
|
|
145
|
+
<div class="qa-list">
|
|
146
|
+
{% for qa in session.qaPairs %}
|
|
147
|
+
<div class="qa-pair">
|
|
148
|
+
<p class="qa-pair__question">{{ qa.question }}</p>
|
|
149
|
+
<p class="qa-pair__answer">{{ qa.answer }}</p>
|
|
150
|
+
</div>
|
|
151
|
+
{% endfor %}
|
|
152
|
+
</div>
|
|
153
|
+
</section>
|
|
154
|
+
{% endif %}
|
|
155
|
+
|
|
156
|
+
</main>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|