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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "project-logbook",
3
- "version": "0.4.1",
3
+ "version": "1.1.0",
4
4
  "description": "A command-line tool for project logbooks.",
5
5
  "workspaces": [
6
6
  "demo-app"
@@ -24,9 +24,10 @@
24
24
  "lint": "eslint src --ext .ts --fix",
25
25
  "format": "prettier --write --list-different .",
26
26
  "knip": "cross-env NO_CONSOLE=true knip || true",
27
- "madge": "npx --yes madge --circular --extensions ts --ts-config ./tsconfig.json src/index.ts",
27
+ "madge": "madge --circular --extensions ts --ts-config ./tsconfig.json src/index.ts",
28
+ "jscpd": "jscpd src",
28
29
  "test": "vitest run",
29
- "pre": "npm run format && npm run lint && npm run test && npm run build && npm run knip && npm run madge && npm run dev build && npm run dev lint",
30
+ "pre": "npm run format && npm run lint && npm run test && npm run build && npm run knip && npm run madge && npm run jscpd && npm run dev build && npm run dev lint && npm audit",
30
31
  "next": "node scripts/create-ticket-from-backlog.js",
31
32
  "link": "npm run build && npm link",
32
33
  "open": "npm run dev build && node scripts/open-and-view-dist.js"
@@ -36,7 +37,7 @@
36
37
  "cli",
37
38
  "project"
38
39
  ],
39
- "author": "",
40
+ "author": "falvhb",
40
41
  "license": "MIT",
41
42
  "devDependencies": {
42
43
  "@types/fs-extra": "^11.0.4",
@@ -45,15 +46,20 @@
45
46
  "@types/rss": "^0.0.32",
46
47
  "@typescript-eslint/eslint-plugin": "^8.32.1",
47
48
  "@typescript-eslint/parser": "^8.32.1",
48
- "@vitest/coverage-v8": "^3.1.4",
49
+ "@vitest/coverage-v8": "^4.1.8",
49
50
  "cross-env": "^7.0.3",
50
51
  "eslint": "^9.27.0",
52
+ "jscpd": "^4.2.4",
51
53
  "knip": "^5.55.0",
54
+ "madge": "^8.0.0",
52
55
  "prettier": "^3.5.3",
53
56
  "rimraf": "^6.1.3",
54
57
  "tsx": "^4.21.0",
55
58
  "typescript": "^6.0.3",
56
- "vitest": "^3.1.4"
59
+ "vitest": "^4.1.8"
60
+ },
61
+ "overrides": {
62
+ "typescript": "^6.0.3"
57
63
  },
58
64
  "dependencies": {
59
65
  "chalk": "^5.6.2",
@@ -84,4 +84,13 @@ If `jiraPrefix` is configured, entry folder names and ticket references must mat
84
84
  ## Tone & Style
85
85
  - **Narrative over Lists**: In `index.md`, tell a story. Why did we make this change? What were the challenges?
86
86
  - **Technical Precision**: In `log.md`, be specific. Mention file paths, error messages, and specific design patterns. Log in real time — do not reconstruct after the fact.
87
- - **No Boilerplate in Commits**: All template placeholders must be replaced or removed before `logbook release`.
87
+ - **No Boilerplate in Commits**: All template placeholders must be replaced or removed before `logbook release`.
88
+
89
+ ## Research Logs
90
+ For exploratory research, technical spike investigations, and architectural decision groundwork, we use **Research Logs**.
91
+ - **Location**: Stored in `docs/research/` (configurable via `researchDir`).
92
+ - **Scaffolding**: Run `logbook new [ID] [Slug] --research` or `logbook new -r` to scaffold. This automatically generates a numeric ID prefixed with `RES-` (e.g. `RES-1`).
93
+ - **Commands**: Commands like `logbook start RES-1`, `logbook log`, and `logbook release` work transparently.
94
+ - **Auto-Activity Tracking**: Writing a log message via `logbook log` automatically updates the `updated` frontmatter field inside the research log's `index.md`.
95
+ - **Status Lifecycle**: The frontmatter `status` field tracks progress: `active`, `paused`, `postponed`, or `completed`.
96
+ - **Visuals**: Research logs are compiled and displayed under a dedicated "Research" tab on the built logbook homepage, sorted by their latest `updated` date.
@@ -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
@@ -1,4 +1,4 @@
1
- # Technical Log: {{id}}-{{slug}}
1
+ # Technical Log: {{id}} - {{title}}
2
2
 
3
3
  > **REMINDER**: Log your work in real-time using `logbook log "<message>"`. Don't wait until the end!
4
4
  >
@@ -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
+ }