project-logbook 0.4.1 → 1.1.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 (169) hide show
  1. package/README.md +38 -2
  2. package/dist/commands/build.js +75 -85
  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 +9 -3
  7. package/dist/commands/lint.js.map +1 -0
  8. package/dist/commands/list.js +14 -26
  9. package/dist/commands/list.js.map +1 -0
  10. package/dist/commands/log.d.ts +1 -3
  11. package/dist/commands/log.js +28 -4
  12. package/dist/commands/log.js.map +1 -0
  13. package/dist/commands/new.d.ts +4 -1
  14. package/dist/commands/new.js +73 -52
  15. package/dist/commands/new.js.map +1 -0
  16. package/dist/commands/preview.js +1 -0
  17. package/dist/commands/preview.js.map +1 -0
  18. package/dist/commands/release.js +2 -1
  19. package/dist/commands/release.js.map +1 -0
  20. package/dist/commands/start.d.ts +1 -1
  21. package/dist/commands/start.js +76 -16
  22. package/dist/commands/start.js.map +1 -0
  23. package/dist/commands/status.js +10 -18
  24. package/dist/commands/status.js.map +1 -0
  25. package/dist/commands/steer.js +1 -0
  26. package/dist/commands/steer.js.map +1 -0
  27. package/dist/commands/upgrade.js +1 -0
  28. package/dist/commands/upgrade.js.map +1 -0
  29. package/dist/index.js +7 -5
  30. package/dist/index.js.map +1 -0
  31. package/dist/lib/about-content.js +1 -0
  32. package/dist/lib/about-content.js.map +1 -0
  33. package/dist/lib/adr-renderer.d.ts +12 -0
  34. package/dist/lib/adr-renderer.js +53 -0
  35. package/dist/lib/adr-renderer.js.map +1 -0
  36. package/dist/lib/autolink.d.ts +15 -0
  37. package/dist/lib/autolink.js +39 -0
  38. package/dist/lib/autolink.js.map +1 -0
  39. package/dist/lib/build-helpers.d.ts +1 -1
  40. package/dist/lib/build-helpers.js +24 -7
  41. package/dist/lib/build-helpers.js.map +1 -0
  42. package/dist/lib/build-steps.d.ts +16 -2
  43. package/dist/lib/build-steps.js +124 -20
  44. package/dist/lib/build-steps.js.map +1 -0
  45. package/dist/lib/config.d.ts +22 -0
  46. package/dist/lib/config.js +29 -1
  47. package/dist/lib/config.js.map +1 -0
  48. package/dist/lib/custom-card-renderer.d.ts +2 -0
  49. package/dist/lib/custom-card-renderer.js +58 -0
  50. package/dist/lib/custom-card-renderer.js.map +1 -0
  51. package/dist/lib/custom-types-builder.d.ts +4 -0
  52. package/dist/lib/custom-types-builder.js +37 -0
  53. package/dist/lib/custom-types-builder.js.map +1 -0
  54. package/dist/lib/entry-id.js +1 -0
  55. package/dist/lib/entry-id.js.map +1 -0
  56. package/dist/lib/entry-paths.js +1 -0
  57. package/dist/lib/entry-paths.js.map +1 -0
  58. package/dist/lib/git-helpers.d.ts +5 -16
  59. package/dist/lib/git-helpers.js +61 -78
  60. package/dist/lib/git-helpers.js.map +1 -0
  61. package/dist/lib/git-url-helpers.d.ts +16 -0
  62. package/dist/lib/git-url-helpers.js +76 -0
  63. package/dist/lib/git-url-helpers.js.map +1 -0
  64. package/dist/lib/hast-helpers.js +1 -0
  65. package/dist/lib/hast-helpers.js.map +1 -0
  66. package/dist/lib/html-attributes.js +1 -0
  67. package/dist/lib/html-attributes.js.map +1 -0
  68. package/dist/lib/html-escape.js +1 -0
  69. package/dist/lib/html-escape.js.map +1 -0
  70. package/dist/lib/image-dimension-parser.d.ts +11 -0
  71. package/dist/lib/image-dimension-parser.js +127 -0
  72. package/dist/lib/image-dimension-parser.js.map +1 -0
  73. package/dist/lib/image-helpers.d.ts +2 -0
  74. package/dist/lib/image-helpers.js +22 -30
  75. package/dist/lib/image-helpers.js.map +1 -0
  76. package/dist/lib/jira-helpers.js +1 -0
  77. package/dist/lib/jira-helpers.js.map +1 -0
  78. package/dist/lib/lint-runner.js +1 -0
  79. package/dist/lib/lint-runner.js.map +1 -0
  80. package/dist/lib/lint-types.js +1 -0
  81. package/dist/lib/lint-types.js.map +1 -0
  82. package/dist/lib/lockfile.js +1 -0
  83. package/dist/lib/lockfile.js.map +1 -0
  84. package/dist/lib/logbook-client.js +1 -0
  85. package/dist/lib/logbook-client.js.map +1 -0
  86. package/dist/lib/markdown-processors.js +1 -0
  87. package/dist/lib/markdown-processors.js.map +1 -0
  88. package/dist/lib/migrations.js +1 -0
  89. package/dist/lib/migrations.js.map +1 -0
  90. package/dist/lib/package-version.js +1 -0
  91. package/dist/lib/package-version.js.map +1 -0
  92. package/dist/lib/post-template.d.ts +5 -0
  93. package/dist/lib/post-template.js +48 -0
  94. package/dist/lib/post-template.js.map +1 -0
  95. package/dist/lib/rss.js +1 -0
  96. package/dist/lib/rss.js.map +1 -0
  97. package/dist/lib/session.d.ts +2 -2
  98. package/dist/lib/session.js +75 -35
  99. package/dist/lib/session.js.map +1 -0
  100. package/dist/lib/styles.js +1 -0
  101. package/dist/lib/styles.js.map +1 -0
  102. package/dist/lib/template-helpers.d.ts +6 -1
  103. package/dist/lib/template-helpers.js +81 -1
  104. package/dist/lib/template-helpers.js.map +1 -0
  105. package/dist/lib/template-types.d.ts +37 -5
  106. package/dist/lib/template-types.js +1 -0
  107. package/dist/lib/template-types.js.map +1 -0
  108. package/dist/lib/templates.d.ts +11 -8
  109. package/dist/lib/templates.js +59 -60
  110. package/dist/lib/templates.js.map +1 -0
  111. package/dist/lib/theme.js +1 -0
  112. package/dist/lib/theme.js.map +1 -0
  113. package/dist/lib/url-helpers.js +1 -0
  114. package/dist/lib/url-helpers.js.map +1 -0
  115. package/dist/linters/diff-to-narrative.d.ts +2 -1
  116. package/dist/linters/diff-to-narrative.js +3 -10
  117. package/dist/linters/diff-to-narrative.js.map +1 -0
  118. package/dist/linters/frontmatter.js +1 -0
  119. package/dist/linters/frontmatter.js.map +1 -0
  120. package/dist/linters/index.js +1 -0
  121. package/dist/linters/index.js.map +1 -0
  122. package/dist/linters/jira-prefix.js +1 -0
  123. package/dist/linters/jira-prefix.js.map +1 -0
  124. package/dist/linters/links.js +26 -4
  125. package/dist/linters/links.js.map +1 -0
  126. package/dist/linters/lockfile.js +1 -0
  127. package/dist/linters/lockfile.js.map +1 -0
  128. package/dist/linters/placeholders.js +6 -4
  129. package/dist/linters/placeholders.js.map +1 -0
  130. package/dist/linters/project-integrity.js +1 -0
  131. package/dist/linters/project-integrity.js.map +1 -0
  132. package/dist/linters/readability.js +2 -3
  133. package/dist/linters/readability.js.map +1 -0
  134. package/dist/linters/technical-log.js +1 -0
  135. package/dist/linters/technical-log.js.map +1 -0
  136. package/dist/linters/workspaces.js +1 -0
  137. package/dist/linters/workspaces.js.map +1 -0
  138. package/dist/templates/CONTRIBUTING.md +10 -1
  139. package/dist/templates/index.md +2 -1
  140. package/dist/templates/log.md +1 -1
  141. package/dist/templates/styles.css +171 -32
  142. package/dist/utils/date.js +1 -0
  143. package/dist/utils/date.js.map +1 -0
  144. package/dist/utils/frontmatter.d.ts +9 -0
  145. package/dist/utils/frontmatter.js +16 -0
  146. package/dist/utils/frontmatter.js.map +1 -0
  147. package/dist/utils/fs.d.ts +10 -0
  148. package/dist/utils/fs.js +112 -0
  149. package/dist/utils/fs.js.map +1 -0
  150. package/dist/utils/id.js +1 -0
  151. package/dist/utils/id.js.map +1 -0
  152. package/dist/utils/log-timeline.d.ts +2 -1
  153. package/dist/utils/log-timeline.js +1 -0
  154. package/dist/utils/log-timeline.js.map +1 -0
  155. package/dist/utils/slug.js +1 -0
  156. package/dist/utils/slug.js.map +1 -0
  157. package/dist/utils/string.js +1 -0
  158. package/dist/utils/string.js.map +1 -0
  159. package/dist/utils/timeline-helpers.d.ts +2 -2
  160. package/dist/utils/timeline-helpers.js +5 -2
  161. package/dist/utils/timeline-helpers.js.map +1 -0
  162. package/dist/utils/validation.d.ts +5 -0
  163. package/dist/utils/validation.js +21 -0
  164. package/dist/utils/validation.js.map +1 -0
  165. package/package.json +12 -6
  166. package/src/templates/CONTRIBUTING.md +10 -1
  167. package/src/templates/index.md +2 -1
  168. package/src/templates/log.md +1 -1
  169. package/src/templates/styles.css +171 -32
@@ -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;
@@ -163,20 +169,52 @@ main {
163
169
  transform: translateX(4px);
164
170
  }
165
171
 
172
+ .teaser-image-right {
173
+ flex-shrink: 0;
174
+ max-width: 200px;
175
+ max-height: 120px;
176
+ display: flex;
177
+ align-items: center;
178
+ justify-content: center;
179
+ overflow: hidden;
180
+ border-radius: 4px;
181
+ }
182
+
183
+ .teaser-image-right img {
184
+ max-width: 100%;
185
+ max-height: 100%;
186
+ object-fit: contain;
187
+ }
188
+
189
+ .teaser-image-bottom {
190
+ margin-top: 0.75rem;
191
+ display: flex;
192
+ justify-content: center;
193
+ align-items: center;
194
+ width: 100%;
195
+ }
196
+
197
+ .teaser-image-bottom img {
198
+ max-width: 100%;
199
+ max-height: 200px;
200
+ object-fit: contain;
201
+ border-radius: 4px;
202
+ }
203
+
166
204
  /* Post Page */
167
205
  .back-link {
168
206
  display: inline-flex;
169
207
  align-items: center;
170
208
  font-size: 0.8125rem;
171
- font-weight: 500;
172
209
  color: var(--primary);
173
210
  text-decoration: none;
174
- transition:
175
- color 0.2s,
176
- background 0.2s;
177
211
  background: var(--primary-soft);
178
212
  padding: 0.5rem 1rem;
179
213
  border-radius: 2rem;
214
+ font-weight: 500;
215
+ transition:
216
+ background 0.2s,
217
+ color 0.2s;
180
218
  }
181
219
 
182
220
  .back-link:hover {
@@ -184,23 +222,7 @@ main {
184
222
  color: white;
185
223
  }
186
224
 
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
-
225
+ /* Jira Action Button */
204
226
  .jira-link-btn {
205
227
  display: inline-flex;
206
228
  align-items: center;
@@ -221,6 +243,48 @@ main {
221
243
  color: white;
222
244
  }
223
245
 
246
+ /* Header Navigation - Back button, tabs, and Jira link */
247
+ .header-nav {
248
+ display: grid;
249
+ grid-template-columns: 1fr auto 1fr;
250
+ align-items: center;
251
+ margin-top: 2rem;
252
+ gap: 1rem;
253
+ }
254
+
255
+ .header-nav-left {
256
+ text-align: left;
257
+ display: flex;
258
+ align-items: center;
259
+ }
260
+
261
+ .header-nav-right {
262
+ text-align: right;
263
+ display: flex;
264
+ align-items: center;
265
+ justify-content: flex-end;
266
+ }
267
+
268
+ .header-nav--center {
269
+ display: flex;
270
+ justify-content: center;
271
+ }
272
+
273
+ @media (max-width: 640px) {
274
+ .header-nav {
275
+ display: flex;
276
+ flex-direction: column;
277
+ align-items: center;
278
+ gap: 1rem;
279
+ padding-bottom: 1rem;
280
+ }
281
+ .header-nav-left,
282
+ .header-nav-right {
283
+ text-align: center;
284
+ justify-content: center;
285
+ }
286
+ }
287
+
224
288
  /* Jira link in build-meta - inline style */
225
289
  .build-meta .jira-link-btn {
226
290
  margin-left: 0.5rem;
@@ -261,21 +325,25 @@ article h1 {
261
325
 
262
326
  .tabs {
263
327
  display: flex;
264
- gap: 0.5rem;
265
- background: #f4f4f4;
266
- padding: 0.25rem;
267
- border-radius: 0.75rem;
328
+ gap: 1.5rem;
329
+ background: none;
330
+ padding: 0;
331
+ border-radius: 0;
268
332
  width: fit-content;
333
+ margin-bottom: -1px;
334
+ position: relative;
335
+ z-index: 2;
269
336
  }
270
337
 
271
338
  .tab {
272
- padding: 0.625rem 1.25rem;
273
- font-size: 0.8125rem;
339
+ padding: 0.75rem 0.25rem;
340
+ font-size: 0.875rem;
274
341
  font-weight: 600;
275
342
  color: var(--text-muted);
276
343
  cursor: pointer;
277
- border-radius: 0.5rem;
278
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
344
+ border-bottom: 2px solid transparent;
345
+ transition: all 0.2s ease;
346
+ border-radius: 0;
279
347
  }
280
348
 
281
349
  .tab:hover {
@@ -284,8 +352,9 @@ article h1 {
284
352
 
285
353
  .tab.active {
286
354
  color: var(--primary);
287
- background: white;
288
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
355
+ border-bottom-color: var(--primary);
356
+ background: none;
357
+ box-shadow: none;
289
358
  }
290
359
 
291
360
  /* Pagination Links */
@@ -504,6 +573,11 @@ footer .build-time a:hover {
504
573
  color: #374151;
505
574
  }
506
575
 
576
+ .tag-superseded {
577
+ background: #f3f4f6;
578
+ color: #4b5563;
579
+ }
580
+
507
581
  /* Timeline card tag styling */
508
582
  .timeline-card .tags-wrapper {
509
583
  margin-top: 0.5rem;
@@ -878,3 +952,68 @@ article img[src$='.svg'] {
878
952
  background-color: var(--primary-soft, #f0fdf4);
879
953
  color: var(--text-main, #1e293b);
880
954
  }
955
+
956
+ /* ADR Details and Cards */
957
+ .adr-detail-card {
958
+ max-width: var(--max-width);
959
+ margin: 0 auto;
960
+ background: var(--card-bg);
961
+ padding: 2rem;
962
+ border-radius: 0.5rem;
963
+ border: 1px solid var(--border);
964
+ }
965
+
966
+ .adr-detail-meta {
967
+ margin-bottom: 1.5rem;
968
+ font-size: 0.85rem;
969
+ color: var(--text-muted);
970
+ }
971
+
972
+ .adr-status-badge {
973
+ margin-right: 0.5rem;
974
+ text-transform: uppercase;
975
+ font-size: 0.7rem;
976
+ padding: 0.15rem 0.4rem;
977
+ }
978
+
979
+ .adr-detail-title {
980
+ font-size: 2rem;
981
+ margin-top: 0;
982
+ margin-bottom: 1.5rem;
983
+ letter-spacing: -0.025em;
984
+ font-weight: 800;
985
+ }
986
+
987
+ .adr-detail-body {
988
+ margin-top: 2rem;
989
+ }
990
+
991
+ .adr-detail-tags {
992
+ margin-top: 2rem;
993
+ border-top: 1px solid var(--border);
994
+ padding-top: 1.5rem;
995
+ }
996
+
997
+ .adr-indicator-badge {
998
+ background: #e0f2fe !important;
999
+ color: #0369a1 !important;
1000
+ font-weight: bold;
1001
+ }
1002
+
1003
+ .timeline-card--adr {
1004
+ background: color-mix(in srgb, var(--primary) 4%, var(--card-bg, #ffffff)) !important;
1005
+ border: 1px solid color-mix(in srgb, var(--primary) 12%, var(--border, #e5e7eb)) !important;
1006
+ border-radius: 0.5rem;
1007
+ }
1008
+
1009
+ .timeline-card--adr .item-summary {
1010
+ font-style: italic;
1011
+ border-left: 2px solid var(--primary);
1012
+ padding-left: 0.75rem;
1013
+ margin-top: 0.5rem;
1014
+ color: var(--text-muted);
1015
+ }
1016
+
1017
+ .timeline-card--adr .tags-wrapper {
1018
+ margin-top: 0.5rem;
1019
+ }
@@ -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[];
@@ -1,10 +1,12 @@
1
- export function groupTimelineItems(entries, commits, tags) {
1
+ export function groupTimelineItems(entries, commits, tags, adrs = []) {
2
2
  const toMs = (item) => {
3
3
  if (item.kind === 'entry')
4
4
  return item.dateEnd ? new Date(item.dateEnd).getTime() : new Date(item.dateStart).getTime();
5
+ if (item.kind === 'adr')
6
+ return new Date(item.date).getTime();
5
7
  return new Date(item.timestamp).getTime();
6
8
  };
7
- const all = [...entries, ...commits, ...tags];
9
+ const all = [...entries, ...commits, ...tags, ...adrs];
8
10
  all.sort((a, b) => toMs(b) - toMs(a));
9
11
  const groups = [];
10
12
  for (const item of all) {
@@ -17,3 +19,4 @@ export function groupTimelineItems(entries, commits, tags) {
17
19
  }
18
20
  return groups;
19
21
  }
22
+ //# sourceMappingURL=timeline-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-helpers.js","sourceRoot":"","sources":["../../src/utils/timeline-helpers.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,kBAAkB,CAChC,OAAmD,EACnD,OAA6B,EAC7B,IAAuB,EACvB,OAA0B,EAAE;IAG5B,MAAM,IAAI,GAAG,CAAC,IAAa,EAAU,EAAE;QACrC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;YACvB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9F,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9D,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IAC5C,CAAC,CAAC;IAEF,MAAM,GAAG,GAAc,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;IAClE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtC,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,IAAI,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { EntryMeta } from './fs.js';
2
+ /**
3
+ * Check if a logbook entry contains bracket-style template placeholders, TODOs, or fallback prompt text.
4
+ */
5
+ export declare function hasUnfilledPlaceholders(entry: EntryMeta): boolean;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Check if a logbook entry contains bracket-style template placeholders, TODOs, or fallback prompt text.
3
+ */
4
+ export function hasUnfilledPlaceholders(entry) {
5
+ // Check frontmatter field values for bracket-style unfilled placeholders
6
+ const dataValues = Object.values(entry.data)
7
+ .filter((v) => typeof v === 'string')
8
+ .join('\n');
9
+ const frontmatterHasPlaceholders = dataValues.includes('[DATE_END]') ||
10
+ dataValues.includes('[DATE_START]') ||
11
+ dataValues.includes('[WRITE_SUMMARY_HERE]') ||
12
+ dataValues.includes('[PROMPTER]') ||
13
+ dataValues.includes('[HARNESS]') ||
14
+ dataValues.includes('[LLM]');
15
+ // Check body content for unfilled template hints (strip fenced and inline code blocks to avoid false positives)
16
+ const contentWithoutCode = entry.content.replace(/```[\s\S]*?```/g, '').replace(/`[^`]*`/g, '');
17
+ const bodyHasPlaceholders = contentWithoutCode.includes('TODO:') ||
18
+ entry.content.includes('Write a polished, highly readable "short story" of the change here.');
19
+ return frontmatterHasPlaceholders || bodyHasPlaceholders;
20
+ }
21
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAgB;IACtD,yEAAyE;IACzE,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;SACzC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;SACjD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,0BAA0B,GAC9B,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC;QACjC,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC;QACnC,UAAU,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAC3C,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC;QACjC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC;QAChC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE/B,gHAAgH;IAChH,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAChG,MAAM,mBAAmB,GACvB,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC;QACpC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,qEAAqE,CAAC,CAAC;IAEhG,OAAO,0BAA0B,IAAI,mBAAmB,CAAC;AAC3D,CAAC"}