project-logbook 0.4.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/README.md +36 -1
  2. package/dist/commands/build.js +34 -76
  3. package/dist/commands/build.js.map +1 -0
  4. package/dist/commands/init.js +1 -0
  5. package/dist/commands/init.js.map +1 -0
  6. package/dist/commands/lint.js +7 -2
  7. package/dist/commands/lint.js.map +1 -0
  8. package/dist/commands/list.js +4 -16
  9. package/dist/commands/list.js.map +1 -0
  10. package/dist/commands/log.d.ts +1 -3
  11. package/dist/commands/log.js +4 -3
  12. package/dist/commands/log.js.map +1 -0
  13. package/dist/commands/new.js +1 -0
  14. package/dist/commands/new.js.map +1 -0
  15. package/dist/commands/preview.js +1 -0
  16. package/dist/commands/preview.js.map +1 -0
  17. package/dist/commands/release.js +1 -0
  18. package/dist/commands/release.js.map +1 -0
  19. package/dist/commands/start.d.ts +1 -1
  20. package/dist/commands/start.js +53 -12
  21. package/dist/commands/start.js.map +1 -0
  22. package/dist/commands/status.js +7 -18
  23. package/dist/commands/status.js.map +1 -0
  24. package/dist/commands/steer.js +1 -0
  25. package/dist/commands/steer.js.map +1 -0
  26. package/dist/commands/upgrade.js +1 -0
  27. package/dist/commands/upgrade.js.map +1 -0
  28. package/dist/index.js +3 -3
  29. package/dist/index.js.map +1 -0
  30. package/dist/lib/about-content.js +1 -0
  31. package/dist/lib/about-content.js.map +1 -0
  32. package/dist/lib/adr-renderer.d.ts +12 -0
  33. package/dist/lib/adr-renderer.js +53 -0
  34. package/dist/lib/adr-renderer.js.map +1 -0
  35. package/dist/lib/build-helpers.js +8 -3
  36. package/dist/lib/build-helpers.js.map +1 -0
  37. package/dist/lib/build-steps.d.ts +20 -2
  38. package/dist/lib/build-steps.js +107 -13
  39. package/dist/lib/build-steps.js.map +1 -0
  40. package/dist/lib/config.d.ts +8 -0
  41. package/dist/lib/config.js +19 -1
  42. package/dist/lib/config.js.map +1 -0
  43. package/dist/lib/entry-id.js +1 -0
  44. package/dist/lib/entry-id.js.map +1 -0
  45. package/dist/lib/entry-paths.js +1 -0
  46. package/dist/lib/entry-paths.js.map +1 -0
  47. package/dist/lib/git-helpers.d.ts +5 -16
  48. package/dist/lib/git-helpers.js +52 -78
  49. package/dist/lib/git-helpers.js.map +1 -0
  50. package/dist/lib/git-url-helpers.d.ts +16 -0
  51. package/dist/lib/git-url-helpers.js +76 -0
  52. package/dist/lib/git-url-helpers.js.map +1 -0
  53. package/dist/lib/hast-helpers.js +1 -0
  54. package/dist/lib/hast-helpers.js.map +1 -0
  55. package/dist/lib/html-attributes.js +1 -0
  56. package/dist/lib/html-attributes.js.map +1 -0
  57. package/dist/lib/html-escape.js +1 -0
  58. package/dist/lib/html-escape.js.map +1 -0
  59. package/dist/lib/image-helpers.js +20 -30
  60. package/dist/lib/image-helpers.js.map +1 -0
  61. package/dist/lib/jira-helpers.js +1 -0
  62. package/dist/lib/jira-helpers.js.map +1 -0
  63. package/dist/lib/lint-runner.js +1 -0
  64. package/dist/lib/lint-runner.js.map +1 -0
  65. package/dist/lib/lint-types.js +1 -0
  66. package/dist/lib/lint-types.js.map +1 -0
  67. package/dist/lib/lockfile.js +1 -0
  68. package/dist/lib/lockfile.js.map +1 -0
  69. package/dist/lib/logbook-client.js +1 -0
  70. package/dist/lib/logbook-client.js.map +1 -0
  71. package/dist/lib/markdown-processors.js +1 -0
  72. package/dist/lib/markdown-processors.js.map +1 -0
  73. package/dist/lib/migrations.js +1 -0
  74. package/dist/lib/migrations.js.map +1 -0
  75. package/dist/lib/package-version.js +1 -0
  76. package/dist/lib/package-version.js.map +1 -0
  77. package/dist/lib/rss.js +1 -0
  78. package/dist/lib/rss.js.map +1 -0
  79. package/dist/lib/session.js +47 -35
  80. package/dist/lib/session.js.map +1 -0
  81. package/dist/lib/styles.js +1 -0
  82. package/dist/lib/styles.js.map +1 -0
  83. package/dist/lib/template-helpers.d.ts +6 -1
  84. package/dist/lib/template-helpers.js +64 -0
  85. package/dist/lib/template-helpers.js.map +1 -0
  86. package/dist/lib/template-types.d.ts +22 -2
  87. package/dist/lib/template-types.js +1 -0
  88. package/dist/lib/template-types.js.map +1 -0
  89. package/dist/lib/templates.d.ts +7 -2
  90. package/dist/lib/templates.js +54 -34
  91. package/dist/lib/templates.js.map +1 -0
  92. package/dist/lib/theme.js +1 -0
  93. package/dist/lib/theme.js.map +1 -0
  94. package/dist/lib/url-helpers.js +1 -0
  95. package/dist/lib/url-helpers.js.map +1 -0
  96. package/dist/linters/diff-to-narrative.d.ts +2 -1
  97. package/dist/linters/diff-to-narrative.js +3 -10
  98. package/dist/linters/diff-to-narrative.js.map +1 -0
  99. package/dist/linters/frontmatter.js +1 -0
  100. package/dist/linters/frontmatter.js.map +1 -0
  101. package/dist/linters/index.js +1 -0
  102. package/dist/linters/index.js.map +1 -0
  103. package/dist/linters/jira-prefix.js +1 -0
  104. package/dist/linters/jira-prefix.js.map +1 -0
  105. package/dist/linters/links.js +26 -4
  106. package/dist/linters/links.js.map +1 -0
  107. package/dist/linters/lockfile.js +1 -0
  108. package/dist/linters/lockfile.js.map +1 -0
  109. package/dist/linters/placeholders.js +6 -4
  110. package/dist/linters/placeholders.js.map +1 -0
  111. package/dist/linters/project-integrity.js +1 -0
  112. package/dist/linters/project-integrity.js.map +1 -0
  113. package/dist/linters/readability.js +2 -3
  114. package/dist/linters/readability.js.map +1 -0
  115. package/dist/linters/technical-log.js +1 -0
  116. package/dist/linters/technical-log.js.map +1 -0
  117. package/dist/linters/workspaces.js +1 -0
  118. package/dist/linters/workspaces.js.map +1 -0
  119. package/dist/templates/WELCOME.md +12 -0
  120. package/dist/templates/index.md +2 -1
  121. package/dist/templates/logbook-client.js +29 -0
  122. package/dist/templates/styles.css +205 -32
  123. package/dist/utils/date.js +1 -0
  124. package/dist/utils/date.js.map +1 -0
  125. package/dist/utils/frontmatter.d.ts +9 -0
  126. package/dist/utils/frontmatter.js +16 -0
  127. package/dist/utils/frontmatter.js.map +1 -0
  128. package/dist/utils/fs.d.ts +10 -0
  129. package/dist/utils/fs.js +112 -0
  130. package/dist/utils/fs.js.map +1 -0
  131. package/dist/utils/id.js +1 -0
  132. package/dist/utils/id.js.map +1 -0
  133. package/dist/utils/log-timeline.d.ts +2 -1
  134. package/dist/utils/log-timeline.js +1 -0
  135. package/dist/utils/log-timeline.js.map +1 -0
  136. package/dist/utils/slug.js +1 -0
  137. package/dist/utils/slug.js.map +1 -0
  138. package/dist/utils/string.js +1 -0
  139. package/dist/utils/string.js.map +1 -0
  140. package/dist/utils/timeline-helpers.d.ts +2 -2
  141. package/dist/utils/timeline-helpers.js +5 -2
  142. package/dist/utils/timeline-helpers.js.map +1 -0
  143. package/dist/utils/validation.d.ts +5 -0
  144. package/dist/utils/validation.js +21 -0
  145. package/dist/utils/validation.js.map +1 -0
  146. package/package.json +10 -4
  147. package/src/templates/WELCOME.md +12 -0
  148. package/src/templates/index.md +2 -1
  149. package/src/templates/logbook-client.js +29 -0
  150. package/src/templates/styles.css +205 -32
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../src/linters/workspaces.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,MAAM,GAAW;IACrB,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,iDAAiD;IAC9D,KAAK,CAAC,KAAK,CAAC,OAAsB;QAChC,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,WAAW;YAAE,OAAO,EAAE,CAAC;QAE1D,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;QAChC,IAAI,WAAW,CAAC,UAAU,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QAEpD,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,MAAM,mBAAmB,GAAG,aAAa,EAAE,CAAC;QAC5C,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAE5F,KAAK,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC;YACjC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,OAAO;oBACd,QAAQ,EAAE,WAAW;oBACrB,OAAO,EAAE,sBAAsB,EAAE,4BAA4B,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBAC9F,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,12 @@
1
+ # Welcome to the Project Logbook!
2
+
3
+ This website is a **Project Logbook** — a chronological timeline of this project's evolution, design decisions, and development history.
4
+
5
+ Unlike traditional static documentation, a logbook behaves like a **dev log** or **news feed** of the codebase. Each item in the timeline below represents a completed feature or bugfix, containing:
6
+ - **Original Specifications:** The initial requirements and user stories.
7
+ - **Technical Log:** Step-by-step notes and decisions made during development.
8
+ - **The Story:** An engaging narrative explaining the rationale, pivots, and solutions.
9
+
10
+ Click around to explore how this project was built step by step!
11
+
12
+ Wait, did we mention it has an [**RSS Feed**](rss.xml)? Yes, you can subscribe to stay updated on new logbook entries in real-time!
@@ -31,4 +31,5 @@ TODO: Write a polished, highly readable ticket summary that reads like an engagi
31
31
  - **Use bullet points:** TODO: Whenever listing multiple items (like friction points, test scenarios, or rewritten paths), use a bulleted list instead of a dense paragraph to make it scannable.
32
32
  - **Use bold emphasis:** TODO: Bold key concepts, problems, and solutions to guide the reader's eye.
33
33
  - **Format code:** TODO: Use inline backticks for files, plugins, HTML elements, and code snippets (e.g., `src/lib/build-helpers.ts`).
34
- - **Keep paragraphs short:** TODO: Ensure no paragraph is longer than 3-4 sentences. Keep the pacing quick and engaging.
34
+ - **Keep paragraphs short:** TODO: Ensure no paragraph is longer than 3-4 sentences. Keep the pacing quick and engaging.
35
+ - **Do not state the obvious**: TODO: Passed tests, lints, pre-commit suites are mandatory and no ticket is released without this. This does not need to be mentioned
@@ -168,6 +168,32 @@
168
168
  }
169
169
  }
170
170
 
171
+ /* ── 4. Welcome banner functionality ────────────────────────────────────── */
172
+ function initWelcomeBanner() {
173
+ var banner = document.getElementById('welcome-banner');
174
+ if (!banner) return;
175
+ try {
176
+ if (localStorage.getItem('welcome-banner-dismissed') !== 'true') {
177
+ banner.style.display = 'block';
178
+ }
179
+ } catch (e) {
180
+ // In case localStorage is disabled/unavailable, default to showing
181
+ banner.style.display = 'block';
182
+ }
183
+
184
+ var closeBtn = document.getElementById('welcome-banner-close');
185
+ if (closeBtn) {
186
+ closeBtn.addEventListener('click', function () {
187
+ banner.style.display = 'none';
188
+ try {
189
+ localStorage.setItem('welcome-banner-dismissed', 'true');
190
+ } catch (e) {
191
+ /* localStorage unavailable */
192
+ }
193
+ });
194
+ }
195
+ }
196
+
171
197
  /* ── Bootstrap ─────────────────────────────────────────────────────────── */
172
198
  document.addEventListener('DOMContentLoaded', function () {
173
199
  updateRelativeDates();
@@ -181,6 +207,9 @@
181
207
 
182
208
  // Initialize tab functionality
183
209
  initTabs();
210
+
211
+ // Initialize welcome banner if present
212
+ initWelcomeBanner();
184
213
  });
185
214
 
186
215
  // Expose showTab globally for onclick handlers
@@ -19,10 +19,16 @@ body {
19
19
  header {
20
20
  background: var(--card-bg);
21
21
  border-bottom: 1px solid var(--border);
22
- padding: 2rem 1rem;
22
+ padding: 2rem 0 0 0;
23
23
  text-align: center;
24
24
  }
25
25
 
26
+ .header-inner {
27
+ max-width: var(--max-width);
28
+ margin: 0 auto;
29
+ padding: 0 1.5rem;
30
+ }
31
+
26
32
  header h1 {
27
33
  margin: 0;
28
34
  font-size: 2.25rem;
@@ -168,15 +174,15 @@ main {
168
174
  display: inline-flex;
169
175
  align-items: center;
170
176
  font-size: 0.8125rem;
171
- font-weight: 500;
172
177
  color: var(--primary);
173
178
  text-decoration: none;
174
- transition:
175
- color 0.2s,
176
- background 0.2s;
177
179
  background: var(--primary-soft);
178
180
  padding: 0.5rem 1rem;
179
181
  border-radius: 2rem;
182
+ font-weight: 500;
183
+ transition:
184
+ background 0.2s,
185
+ color 0.2s;
180
186
  }
181
187
 
182
188
  .back-link:hover {
@@ -184,23 +190,7 @@ main {
184
190
  color: white;
185
191
  }
186
192
 
187
- /* Action bar - Back button + tabs on same line */
188
- .action-bar {
189
- display: flex;
190
- align-items: center;
191
- justify-content: space-between;
192
- gap: 1rem;
193
- margin-bottom: 3rem;
194
- flex-wrap: wrap;
195
- }
196
-
197
- .action-tabs-wrapper {
198
- display: flex;
199
- align-items: center;
200
- gap: 1rem;
201
- flex-wrap: wrap;
202
- }
203
-
193
+ /* Jira Action Button */
204
194
  .jira-link-btn {
205
195
  display: inline-flex;
206
196
  align-items: center;
@@ -221,6 +211,48 @@ main {
221
211
  color: white;
222
212
  }
223
213
 
214
+ /* Header Navigation - Back button, tabs, and Jira link */
215
+ .header-nav {
216
+ display: grid;
217
+ grid-template-columns: 1fr auto 1fr;
218
+ align-items: center;
219
+ margin-top: 2rem;
220
+ gap: 1rem;
221
+ }
222
+
223
+ .header-nav-left {
224
+ text-align: left;
225
+ display: flex;
226
+ align-items: center;
227
+ }
228
+
229
+ .header-nav-right {
230
+ text-align: right;
231
+ display: flex;
232
+ align-items: center;
233
+ justify-content: flex-end;
234
+ }
235
+
236
+ .header-nav--center {
237
+ display: flex;
238
+ justify-content: center;
239
+ }
240
+
241
+ @media (max-width: 640px) {
242
+ .header-nav {
243
+ display: flex;
244
+ flex-direction: column;
245
+ align-items: center;
246
+ gap: 1rem;
247
+ padding-bottom: 1rem;
248
+ }
249
+ .header-nav-left,
250
+ .header-nav-right {
251
+ text-align: center;
252
+ justify-content: center;
253
+ }
254
+ }
255
+
224
256
  /* Jira link in build-meta - inline style */
225
257
  .build-meta .jira-link-btn {
226
258
  margin-left: 0.5rem;
@@ -261,21 +293,25 @@ article h1 {
261
293
 
262
294
  .tabs {
263
295
  display: flex;
264
- gap: 0.5rem;
265
- background: #f4f4f4;
266
- padding: 0.25rem;
267
- border-radius: 0.75rem;
296
+ gap: 1.5rem;
297
+ background: none;
298
+ padding: 0;
299
+ border-radius: 0;
268
300
  width: fit-content;
301
+ margin-bottom: -1px;
302
+ position: relative;
303
+ z-index: 2;
269
304
  }
270
305
 
271
306
  .tab {
272
- padding: 0.625rem 1.25rem;
273
- font-size: 0.8125rem;
307
+ padding: 0.75rem 0.25rem;
308
+ font-size: 0.875rem;
274
309
  font-weight: 600;
275
310
  color: var(--text-muted);
276
311
  cursor: pointer;
277
- border-radius: 0.5rem;
278
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
312
+ border-bottom: 2px solid transparent;
313
+ transition: all 0.2s ease;
314
+ border-radius: 0;
279
315
  }
280
316
 
281
317
  .tab:hover {
@@ -284,8 +320,9 @@ article h1 {
284
320
 
285
321
  .tab.active {
286
322
  color: var(--primary);
287
- background: white;
288
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
323
+ border-bottom-color: var(--primary);
324
+ background: none;
325
+ box-shadow: none;
289
326
  }
290
327
 
291
328
  /* Pagination Links */
@@ -504,6 +541,11 @@ footer .build-time a:hover {
504
541
  color: #374151;
505
542
  }
506
543
 
544
+ .tag-superseded {
545
+ background: #f3f4f6;
546
+ color: #4b5563;
547
+ }
548
+
507
549
  /* Timeline card tag styling */
508
550
  .timeline-card .tags-wrapper {
509
551
  margin-top: 0.5rem;
@@ -812,3 +854,134 @@ article img[src$='.svg'] {
812
854
  font-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, monospace;
813
855
  font-size: 0.8125rem;
814
856
  }
857
+
858
+ /* Welcome Banner */
859
+ .welcome-banner {
860
+ background: var(--bg-card, #ffffff);
861
+ border: 1px solid var(--border, #e2e8f0);
862
+ padding: 1.5rem;
863
+ border-radius: 0.5rem;
864
+ margin-top: 1.5rem;
865
+ margin-bottom: 2rem;
866
+ position: relative;
867
+ box-shadow:
868
+ 0 1px 3px 0 rgba(0, 0, 0, 0.1),
869
+ 0 1px 2px -1px rgba(0, 0, 0, 0.1);
870
+ }
871
+
872
+ .welcome-banner-content h1 {
873
+ font-size: 1.25rem;
874
+ margin-top: 0;
875
+ margin-bottom: 0.75rem;
876
+ color: var(--text-main, #1e293b);
877
+ display: flex;
878
+ align-items: center;
879
+ gap: 0.5rem;
880
+ }
881
+
882
+ .welcome-banner-content p {
883
+ margin: 0 0 0.75rem 0;
884
+ line-height: 1.5;
885
+ color: var(--text, #334155);
886
+ }
887
+
888
+ .welcome-banner-content ul {
889
+ margin: 0 0 1rem 0;
890
+ padding-left: 1.25rem;
891
+ color: var(--text, #334155);
892
+ }
893
+
894
+ .welcome-banner-content li {
895
+ margin-bottom: 0.5rem;
896
+ line-height: 1.4;
897
+ }
898
+
899
+ .welcome-banner-close {
900
+ position: absolute;
901
+ top: 1rem;
902
+ right: 1rem;
903
+ background: none;
904
+ border: none;
905
+ font-size: 1.25rem;
906
+ cursor: pointer;
907
+ color: var(--text-muted, #64748b);
908
+ line-height: 1;
909
+ padding: 0.25rem;
910
+ border-radius: 0.25rem;
911
+ display: flex;
912
+ align-items: center;
913
+ justify-content: center;
914
+ transition:
915
+ background-color 0.2s,
916
+ color 0.2s;
917
+ }
918
+
919
+ .welcome-banner-close:hover {
920
+ background-color: var(--primary-soft, #f0fdf4);
921
+ color: var(--text-main, #1e293b);
922
+ }
923
+
924
+ /* ADR Details and Cards */
925
+ .adr-detail-card {
926
+ max-width: var(--max-width);
927
+ margin: 0 auto;
928
+ background: var(--card-bg);
929
+ padding: 2rem;
930
+ border-radius: 0.5rem;
931
+ border: 1px solid var(--border);
932
+ }
933
+
934
+ .adr-detail-meta {
935
+ margin-bottom: 1.5rem;
936
+ font-size: 0.85rem;
937
+ color: var(--text-muted);
938
+ }
939
+
940
+ .adr-status-badge {
941
+ margin-right: 0.5rem;
942
+ text-transform: uppercase;
943
+ font-size: 0.7rem;
944
+ padding: 0.15rem 0.4rem;
945
+ }
946
+
947
+ .adr-detail-title {
948
+ font-size: 2rem;
949
+ margin-top: 0;
950
+ margin-bottom: 1.5rem;
951
+ letter-spacing: -0.025em;
952
+ font-weight: 800;
953
+ }
954
+
955
+ .adr-detail-body {
956
+ margin-top: 2rem;
957
+ }
958
+
959
+ .adr-detail-tags {
960
+ margin-top: 2rem;
961
+ border-top: 1px solid var(--border);
962
+ padding-top: 1.5rem;
963
+ }
964
+
965
+ .adr-indicator-badge {
966
+ background: #e0f2fe !important;
967
+ color: #0369a1 !important;
968
+ font-weight: bold;
969
+ }
970
+
971
+ .timeline-card--adr {
972
+ background: color-mix(in srgb, var(--primary) 4%, var(--card-bg, #ffffff)) !important;
973
+ border: 1px solid color-mix(in srgb, var(--primary) 12%, var(--border, #e5e7eb)) !important;
974
+ border-radius: 0.5rem;
975
+ }
976
+
977
+ .timeline-card--adr .item-summary {
978
+ font-style: italic;
979
+ border-left: 2px solid var(--primary);
980
+ padding-left: 0.75rem;
981
+ margin-top: 0.5rem;
982
+ color: var(--text-muted);
983
+ }
984
+
985
+ .timeline-card--adr .tags-wrapper {
986
+ margin-top: 0.5rem;
987
+ }
@@ -98,3 +98,4 @@ export function formatDateTimeForRss(date) {
98
98
  return new Date().toUTCString();
99
99
  return d.toUTCString();
100
100
  }
101
+ //# sourceMappingURL=date.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date.js","sourceRoot":"","sources":["../../src/utils/date.ts"],"names":[],"mappings":"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"}
@@ -24,3 +24,12 @@ export declare function asString(value: unknown, fallback: string): string;
24
24
  * @returns Array of strings, or empty array if input is not convertible
25
25
  */
26
26
  export declare function asStringArray(value: unknown): string[];
27
+ /**
28
+ * Strips the frontmatter block from a raw markdown string, returning only the body.
29
+ */
30
+ export declare function stripFrontmatter(rawMarkdown: string): string;
31
+ /**
32
+ * Extracts the raw frontmatter block (including the enclosing `---` delimiters)
33
+ * from a raw markdown string. If no frontmatter block is found, returns the original string.
34
+ */
35
+ export declare function getRawFrontmatterBlock(rawMarkdown: string): string;
@@ -1,3 +1,4 @@
1
+ import matter from 'gray-matter';
1
2
  /**
2
3
  * Normalizes a frontmatter field that may be a scalar string or a YAML list of strings.
3
4
  * Used when displaying frontmatter fields like 'harness', 'llm', 'prompter' in the timeline.
@@ -35,3 +36,18 @@ export function asStringArray(value) {
35
36
  }
36
37
  return [];
37
38
  }
39
+ /**
40
+ * Strips the frontmatter block from a raw markdown string, returning only the body.
41
+ */
42
+ export function stripFrontmatter(rawMarkdown) {
43
+ return matter(rawMarkdown).content;
44
+ }
45
+ /**
46
+ * Extracts the raw frontmatter block (including the enclosing `---` delimiters)
47
+ * from a raw markdown string. If no frontmatter block is found, returns the original string.
48
+ */
49
+ export function getRawFrontmatterBlock(rawMarkdown) {
50
+ const match = rawMarkdown.match(/^---\r?\n[\s\S]*?\r?\n---/);
51
+ return match ? match[0] : rawMarkdown;
52
+ }
53
+ //# sourceMappingURL=frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,CAAU;IACxC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,IAAI,SAAS,CAAC;IACjD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/E,OAAO,MAAM,IAAI,SAAS,CAAC;IAC7B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAYD,MAAM,UAAU,QAAQ,CAAC,KAAc,EAAE,QAAiB;IACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACrD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9B,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,WAAmB;IACxD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC7D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;AACxC,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { TimelineAdrItem } from '../lib/template-types.js';
1
2
  export interface EntryMeta {
2
3
  slug: string;
3
4
  path: string;
@@ -24,3 +25,12 @@ export declare function readFileIfExists(filePath: string): Promise<string>;
24
25
  * @returns The path if it exists, otherwise null
25
26
  */
26
27
  export declare function pathExistsOrNull(filePath: string): Promise<string | null>;
28
+ /**
29
+ * Extract the full content block immediately following the ## Decision heading in a markdown string,
30
+ * up until the next heading.
31
+ */
32
+ export declare function extractDecisionSection(content: string): string;
33
+ /**
34
+ * Reads the ADR directory and returns parsed TimelineAdrItem objects.
35
+ */
36
+ export declare function getAdrEntries(adrDir: string, relativeAdrDir: string): Promise<TimelineAdrItem[]>;
package/dist/utils/fs.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import fs from 'fs-extra';
2
2
  import { join } from 'node:path';
3
3
  import matter from 'gray-matter';
4
+ import { formatAbsoluteDate, getMonthYear, getSortTime } from './date.js';
4
5
  /**
5
6
  * Reads the logbook directory and returns metadata for all entries.
6
7
  * Filters for directories and parses index.md if it exists.
@@ -59,3 +60,114 @@ export async function pathExistsOrNull(filePath) {
59
60
  }
60
61
  return null;
61
62
  }
63
+ /**
64
+ * Extract the full content block immediately following the ## Decision heading in a markdown string,
65
+ * up until the next heading.
66
+ */
67
+ export function extractDecisionSection(content) {
68
+ const lines = content.split('\n');
69
+ let insideDecision = false;
70
+ const decisionLines = [];
71
+ for (const line of lines) {
72
+ const trimmed = line.trim();
73
+ // Flexible match for Decision heading
74
+ if (/^#+\s+(?:\d+\.\s+)?Decision(?:\s+.*)?$/i.test(trimmed)) {
75
+ insideDecision = true;
76
+ continue;
77
+ }
78
+ // If we are inside the Decision section and hit another heading, stop
79
+ if (insideDecision && /^#+\s+/.test(trimmed)) {
80
+ break;
81
+ }
82
+ if (insideDecision) {
83
+ decisionLines.push(line);
84
+ }
85
+ }
86
+ const rawDecision = decisionLines.join('\n').trim();
87
+ if (!rawDecision)
88
+ return 'No decision specified.';
89
+ return rawDecision;
90
+ }
91
+ /**
92
+ * Reads the ADR directory and returns parsed TimelineAdrItem objects.
93
+ */
94
+ export async function getAdrEntries(adrDir, relativeAdrDir) {
95
+ if (!(await fs.pathExists(adrDir))) {
96
+ return [];
97
+ }
98
+ const files = await fs.readdir(adrDir);
99
+ const results = [];
100
+ for (const file of files) {
101
+ if (!file.endsWith('.md'))
102
+ continue;
103
+ const filePath = join(adrDir, file);
104
+ if ((await fs.stat(filePath)).isDirectory())
105
+ continue;
106
+ const raw = await fs.readFile(filePath, 'utf8');
107
+ const { data, content } = matter(raw);
108
+ // Skip if it doesn't have an ID (not a valid/standard ADR for our parser)
109
+ if (data.id === undefined)
110
+ continue;
111
+ const id = Number(data.id);
112
+ const title = String(data.title || file.replace(/\.md$/i, ''));
113
+ const status = String(data.status || 'proposed');
114
+ // Parse date
115
+ let dateStr = '';
116
+ const stat = await fs.stat(filePath);
117
+ const mtime = stat.mtime;
118
+ let parsedDate = null;
119
+ if (data.date instanceof Date) {
120
+ parsedDate = data.date;
121
+ }
122
+ else if (typeof data.date === 'string' && !isNaN(Date.parse(data.date))) {
123
+ parsedDate = new Date(data.date);
124
+ }
125
+ if (parsedDate) {
126
+ // Check if the date is date-only (parsed at UTC midnight: 00:00:00.000)
127
+ const isDateOnly = parsedDate.getUTCHours() === 0 &&
128
+ parsedDate.getUTCMinutes() === 0 &&
129
+ parsedDate.getUTCSeconds() === 0 &&
130
+ parsedDate.getUTCMilliseconds() === 0;
131
+ if (isDateOnly) {
132
+ // Extract UTC calendar components to keep the user's chosen day absolute
133
+ const year = parsedDate.getUTCFullYear();
134
+ const month = parsedDate.getUTCMonth();
135
+ const day = parsedDate.getUTCDate();
136
+ // Augment with the local sub-day components from file modification stats (mtime)
137
+ const hours = mtime.getHours();
138
+ const minutes = mtime.getMinutes();
139
+ const seconds = mtime.getSeconds();
140
+ const ms = mtime.getMilliseconds();
141
+ parsedDate = new Date(year, month, day, hours, minutes, seconds, ms);
142
+ }
143
+ dateStr = parsedDate.toISOString();
144
+ }
145
+ else {
146
+ // Fallback to file creation/modification time
147
+ dateStr = mtime.toISOString();
148
+ }
149
+ const author = String(data.author || 'Unknown');
150
+ const superseded_by = data.superseded_by !== undefined && data.superseded_by !== null ? Number(data.superseded_by) : null;
151
+ const tags = Array.isArray(data.tags) ? data.tags.map(String) : [];
152
+ const decision = extractDecisionSection(content);
153
+ results.push({
154
+ kind: 'adr',
155
+ id,
156
+ filepath: join(relativeAdrDir, file),
157
+ title,
158
+ status,
159
+ date: dateStr,
160
+ displayDate: formatAbsoluteDate(dateStr),
161
+ author,
162
+ superseded_by,
163
+ tags,
164
+ decision,
165
+ monthGroup: getMonthYear(dateStr),
166
+ sortTime: getSortTime(dateStr),
167
+ });
168
+ }
169
+ // Sort ADRs descending by ID
170
+ results.sort((a, b) => b.id - a.id);
171
+ return results;
172
+ }
173
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"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"}
package/dist/utils/id.js CHANGED
@@ -34,3 +34,4 @@ export function getNextId(logbookDir, prefix) {
34
34
  const nextNumber = maxNumber + 1;
35
35
  return `${prefix.toUpperCase()}-${nextNumber}`;
36
36
  }
37
+ //# sourceMappingURL=id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,sFAAsF;AACtF,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACzD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IAC5E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,SAAS,CAAC,UAAkB,EAAE,MAAc;IAC1D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC;IAEnE,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACtD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;QAC3E,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnC,IAAI,GAAG,GAAG,SAAS,EAAE,CAAC;gBACpB,SAAS,GAAG,GAAG,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,GAAG,CAAC,CAAC;IACjC,OAAO,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,UAAU,EAAE,CAAC;AACjD,CAAC"}
@@ -12,7 +12,7 @@ export interface LogEntry {
12
12
  /**
13
13
  * Timeline item for rendering - either a log entry or a gap indicator.
14
14
  */
15
- export interface TimelineItem {
15
+ interface TimelineItem {
16
16
  type: 'entry' | 'gap';
17
17
  timestamp?: Date;
18
18
  isoTimestamp?: string;
@@ -67,3 +67,4 @@ export declare function getLastLogEntry(logMarkdown: string): LogEntry | null;
67
67
  * @returns HTML string (timeline if successful, plain markdown otherwise)
68
68
  */
69
69
  export declare function transformLogToTimeline(logMarkdown: string): Promise<string>;
70
+ export {};
@@ -216,3 +216,4 @@ export async function transformLogToTimeline(logMarkdown) {
216
216
  const timeline = createTimelineFromEntries(entries);
217
217
  return renderTimelineHtml(timeline);
218
218
  }
219
+ //# sourceMappingURL=log-timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-timeline.js","sourceRoot":"","sources":["../../src/utils/log-timeline.ts"],"names":[],"mappings":"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"}
@@ -7,3 +7,4 @@ export function sanitiseSlug(title) {
7
7
  .replace(/-{2,}/g, '-')
8
8
  .replace(/^-+|-+$/g, ''); // Trim hyphens from ends
9
9
  }
10
+ //# sourceMappingURL=slug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.js","sourceRoot":"","sources":["../../src/utils/slug.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,yCAAyC;SAChE,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,yBAAyB;AACvD,CAAC"}
@@ -2,3 +2,4 @@
2
2
  export function stripAnsi(str) {
3
3
  return String(str ?? '').replace(/\x1B\[[0-9;]*m/g, '');
4
4
  }
5
+ //# sourceMappingURL=string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/utils/string.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,UAAU,SAAS,CAAC,GAAY;IACpC,OAAO,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAC1D,CAAC"}
@@ -1,4 +1,4 @@
1
- import { TimelineEntry, TimelineCommitItem, TimelineTagItem, TimelineGroup } from '../lib/template-types.js';
1
+ import { TimelineEntry, TimelineCommitItem, TimelineTagItem, TimelineAdrItem, TimelineGroup } from '../lib/template-types.js';
2
2
  export declare function groupTimelineItems(entries: (TimelineEntry & {
3
3
  monthGroup: string;
4
- })[], commits: TimelineCommitItem[], tags: TimelineTagItem[]): TimelineGroup[];
4
+ })[], commits: TimelineCommitItem[], tags: TimelineTagItem[], adrs?: TimelineAdrItem[]): TimelineGroup[];