project-logbook 1.0.0 → 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 (65) hide show
  1. package/README.md +2 -1
  2. package/dist/commands/build.js +49 -15
  3. package/dist/commands/build.js.map +1 -1
  4. package/dist/commands/lint.js +2 -1
  5. package/dist/commands/lint.js.map +1 -1
  6. package/dist/commands/list.js +10 -10
  7. package/dist/commands/list.js.map +1 -1
  8. package/dist/commands/log.js +24 -1
  9. package/dist/commands/log.js.map +1 -1
  10. package/dist/commands/new.d.ts +4 -1
  11. package/dist/commands/new.js +72 -52
  12. package/dist/commands/new.js.map +1 -1
  13. package/dist/commands/release.js +1 -1
  14. package/dist/commands/release.js.map +1 -1
  15. package/dist/commands/start.js +27 -8
  16. package/dist/commands/start.js.map +1 -1
  17. package/dist/commands/status.js +3 -0
  18. package/dist/commands/status.js.map +1 -1
  19. package/dist/index.js +4 -2
  20. package/dist/index.js.map +1 -1
  21. package/dist/lib/autolink.d.ts +15 -0
  22. package/dist/lib/autolink.js +39 -0
  23. package/dist/lib/autolink.js.map +1 -0
  24. package/dist/lib/build-helpers.d.ts +1 -1
  25. package/dist/lib/build-helpers.js +16 -4
  26. package/dist/lib/build-helpers.js.map +1 -1
  27. package/dist/lib/build-steps.d.ts +2 -2
  28. package/dist/lib/build-steps.js +30 -3
  29. package/dist/lib/build-steps.js.map +1 -1
  30. package/dist/lib/config.d.ts +14 -0
  31. package/dist/lib/config.js +10 -0
  32. package/dist/lib/config.js.map +1 -1
  33. package/dist/lib/custom-card-renderer.d.ts +2 -0
  34. package/dist/lib/custom-card-renderer.js +58 -0
  35. package/dist/lib/custom-card-renderer.js.map +1 -0
  36. package/dist/lib/custom-types-builder.d.ts +4 -0
  37. package/dist/lib/custom-types-builder.js +37 -0
  38. package/dist/lib/custom-types-builder.js.map +1 -0
  39. package/dist/lib/git-helpers.js +10 -1
  40. package/dist/lib/git-helpers.js.map +1 -1
  41. package/dist/lib/image-dimension-parser.d.ts +11 -0
  42. package/dist/lib/image-dimension-parser.js +127 -0
  43. package/dist/lib/image-dimension-parser.js.map +1 -0
  44. package/dist/lib/image-helpers.d.ts +2 -0
  45. package/dist/lib/image-helpers.js +2 -0
  46. package/dist/lib/image-helpers.js.map +1 -1
  47. package/dist/lib/post-template.d.ts +5 -0
  48. package/dist/lib/post-template.js +48 -0
  49. package/dist/lib/post-template.js.map +1 -0
  50. package/dist/lib/session.d.ts +2 -2
  51. package/dist/lib/session.js +29 -1
  52. package/dist/lib/session.js.map +1 -1
  53. package/dist/lib/template-helpers.js +17 -1
  54. package/dist/lib/template-helpers.js.map +1 -1
  55. package/dist/lib/template-types.d.ts +16 -3
  56. package/dist/lib/templates.d.ts +5 -7
  57. package/dist/lib/templates.js +39 -53
  58. package/dist/lib/templates.js.map +1 -1
  59. package/dist/templates/CONTRIBUTING.md +10 -1
  60. package/dist/templates/log.md +1 -1
  61. package/dist/templates/styles.css +32 -0
  62. package/package.json +4 -4
  63. package/src/templates/CONTRIBUTING.md +10 -1
  64. package/src/templates/log.md +1 -1
  65. package/src/templates/styles.css +32 -0
@@ -1,6 +1,9 @@
1
- import { ATTR_PAGE_SLUG, ATTR_DATA_DATE } from './html-attributes.js';
2
- import { escapeHtml, validateUrlScheme } from './html-escape.js';
3
- import { html, navLink, renderTagsAndWorkspaces, renderCommits, renderTimelineEntryItem, renderTimelineCommitItem, renderTimelineTagItem, renderTimelineAdrItem, paginationLinks, } from './template-helpers.js';
1
+ import { ATTR_PAGE_SLUG } from './html-attributes.js';
2
+ import { escapeHtml } from './html-escape.js';
3
+ import { html, renderTimelineEntryItem, renderTimelineCommitItem, renderTimelineTagItem, renderTimelineAdrItem, paginationLinks, } from './template-helpers.js';
4
+ import { renderCustomCard } from './custom-card-renderer.js';
5
+ import { autolinkReferences, getRegisteredResearchEntries } from './autolink.js';
6
+ export { postTemplate } from './post-template.js';
4
7
  export const tabsComponent = (tabs, defaultActive = 0) => {
5
8
  const tabsHtml = tabs
6
9
  .map((tab, index) => `<div class="tab ${index === defaultActive ? 'active' : ''}" role="tab" aria-selected="${index === defaultActive}" aria-controls="${escapeHtml(tab.id)}" tabindex="${index === defaultActive ? '0' : '-1'}" onclick="showTab(event, '${escapeHtml(tab.id)}')">${escapeHtml(tab.title)}</div>`)
@@ -13,6 +16,9 @@ export const tabsComponent = (tabs, defaultActive = 0) => {
13
16
  export const layout = ({ title, header, content, projectName, basePath = './', description, bodySlug, buildMeta, includeRssLink = false, prevUrl, nextUrl, }) => {
14
17
  const metaDescription = description ||
15
18
  `A chronological timeline of recent development changes, narrative updates, and commits for ${projectName}.`;
19
+ const registeredResearchEntries = getRegisteredResearchEntries();
20
+ const processedHeader = registeredResearchEntries.length > 0 ? autolinkReferences(header, registeredResearchEntries, basePath) : header;
21
+ const processedContent = registeredResearchEntries.length > 0 ? autolinkReferences(content, registeredResearchEntries, basePath) : content;
16
22
  return html `<!DOCTYPE html>
17
23
  <html lang="en">
18
24
  <head>
@@ -26,7 +32,7 @@ export const layout = ({ title, header, content, projectName, basePath = './', d
26
32
  <link rel="stylesheet" href="${basePath}style.css">
27
33
  </head>
28
34
  <body${bodySlug ? ` ${ATTR_PAGE_SLUG}="${bodySlug}"` : ''} class="tabs-wrapper">
29
- ${header}<main>${content}</main>
35
+ ${processedHeader}<main>${processedContent}</main>
30
36
  <footer>
31
37
  ${buildMeta ? `<p class="build-time">${buildMeta}${includeRssLink ? ` • <a href="${basePath}rss.xml">RSS Feed</a>` : ''}</p>` : ''}
32
38
  </footer>
@@ -61,11 +67,35 @@ export const timelineTemplate = (props) => {
61
67
  .join('')}
62
68
  ${paginationLinks(currentPage, totalPages)}
63
69
  </div>`;
64
- const { tabsHtml, sectionsHtml } = tabsComponent([
65
- { id: 'timeline', title: 'Timeline', content: timelineTab },
66
- { id: 'readme', title: 'Project Readme', content: readmeHtml || '<p>No README available.</p>' },
67
- { id: 'about', title: 'About this Logbook', content: aboutHtml || '<p>No information available.</p>' },
68
- ], 0);
70
+ const tabs = [{ id: 'timeline', title: 'Timeline', content: timelineTab }];
71
+ if (props.adrItems && props.adrItems.length > 0) {
72
+ const adrTabHtml = html `
73
+ <div class="timeline">${props.adrItems.map((item) => renderTimelineAdrItem(item)).join('')}</div>
74
+ `;
75
+ tabs.push({ id: 'adrs', title: 'ADRs', content: adrTabHtml });
76
+ }
77
+ if (props.researchEntries && props.researchEntries.length > 0) {
78
+ const researchHtml = html `
79
+ <div class="timeline">
80
+ ${props.researchEntries.map((e) => renderCustomCard(e, 'research', 'RESEARCH')).join('')}
81
+ </div>
82
+ `;
83
+ tabs.push({ id: 'research', title: 'Research', content: researchHtml });
84
+ }
85
+ if (props.customTabs) {
86
+ for (const tab of props.customTabs) {
87
+ if (tab.items && tab.items.length > 0) {
88
+ const tabHtml = html `
89
+ <div class="timeline">
90
+ ${tab.items.map((e) => renderCustomCard(e, tab.id, tab.title.toUpperCase())).join('')}
91
+ </div>
92
+ `;
93
+ tabs.push({ id: tab.id, title: tab.title, content: tabHtml });
94
+ }
95
+ }
96
+ }
97
+ tabs.push({ id: 'readme', title: 'Project Readme', content: readmeHtml || '<p>No README available.</p>' }, { id: 'about', title: 'About this Logbook', content: aboutHtml || '<p>No information available.</p>' });
98
+ const { tabsHtml, sectionsHtml } = tabsComponent(tabs, 0);
69
99
  const header = html `<header>
70
100
  <div class="header-inner">
71
101
  <h1><a href="./index.html">${escapeHtml(projectName)}</a></h1>
@@ -77,48 +107,4 @@ export const timelineTemplate = (props) => {
77
107
  </header>`;
78
108
  return { header, content: sectionsHtml };
79
109
  };
80
- export const postTemplate = (props) => {
81
- const { title, displayDate, dateStart, harness, llm, prompter, content, ticketHtml, logHtml, commits, version, jiraUrl, repositoryUrl, prevEntry, nextEntry, tags, workspaces } = props; // prettier-ignore
82
- // Validate jiraUrl scheme to prevent javascript: URLs
83
- const validatedJiraUrl = jiraUrl ? validateUrlScheme(jiraUrl) : undefined;
84
- const jiraBtn = validatedJiraUrl
85
- ? `<a href="${escapeHtml(validatedJiraUrl)}" class="jira-link-btn" target="_blank" rel="noopener noreferrer">View in Jira ↗</a>`
86
- : '';
87
- const tabBtn = (id, label, active = false) => `<div class="tab${active ? ' active' : ''}" role="tab" aria-selected="${active}" aria-controls="${escapeHtml(id)}" tabindex="${active ? '0' : '-1'}" onclick="showTab(event, '${escapeHtml(id)}')">${escapeHtml(label)}</div>`;
88
- const header = html `<header>
89
- <div class="header-inner">
90
- <h1>${escapeHtml(title)}</h1>
91
- <div class="tagline">
92
- <span ${ATTR_DATA_DATE}="${dateStart}">${displayDate}</span> •
93
- ${llm ? `${escapeHtml(llm)} via ` : ''}${escapeHtml(harness)}${prompter ? ` / ${escapeHtml(prompter)}` : ''} •
94
- v${version}
95
- </div>
96
- <div class="header-nav">
97
- <div class="header-nav-left">
98
- <a href="../index.html" class="back-link">← Back to Timeline</a>
99
- </div>
100
- <div class="tabs" role="tablist" aria-label="Entry sections">
101
- ${tabBtn('story', 'Story', true)}${tabBtn('spec', 'Original Spec')}${tabBtn('log', 'Technical Log')}
102
- </div>
103
- <div class="header-nav-right">${jiraBtn ? `${jiraBtn}` : '<span></span>'}</div>
104
- </div>
105
- </div>
106
- </header>`;
107
- const mainContent = html `<article>
108
- <div class="content-sections">
109
- <div id="story" class="content-section" role="tabpanel">
110
- ${renderTagsAndWorkspaces(tags, workspaces)}${content}
111
- </div>
112
- <div id="spec" class="content-section" role="tabpanel" style="display:none;">${ticketHtml}</div>
113
- <div id="log" class="content-section" role="tabpanel" style="display:none;">
114
- ${logHtml}${renderCommits(commits, repositoryUrl)}
115
- </div>
116
- </div>
117
- <nav class="post-nav">
118
- <div class="post-nav-prev">${prevEntry ? navLink(prevEntry, 'prev') : '<span></span>'}</div>
119
- <div class="post-nav-next">${nextEntry ? navLink(nextEntry, 'next') : '<span></span>'}</div>
120
- </nav>
121
- </article>`;
122
- return { header, content: mainContent };
123
- };
124
110
  //# sourceMappingURL=templates.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"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"}
@@ -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.
@@ -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
  >
@@ -169,6 +169,38 @@ main {
169
169
  transform: translateX(4px);
170
170
  }
171
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
+
172
204
  /* Post Page */
173
205
  .back-link {
174
206
  display: inline-flex;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "project-logbook",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "A command-line tool for project logbooks.",
5
5
  "workspaces": [
6
6
  "demo-app"
@@ -27,7 +27,7 @@
27
27
  "madge": "madge --circular --extensions ts --ts-config ./tsconfig.json src/index.ts",
28
28
  "jscpd": "jscpd src",
29
29
  "test": "vitest run",
30
- "pre": "npm run format && npm run lint && npm audit && npm run test && npm run build && npm run knip && npm run madge && npm run jscpd && 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",
31
31
  "next": "node scripts/create-ticket-from-backlog.js",
32
32
  "link": "npm run build && npm link",
33
33
  "open": "npm run dev build && node scripts/open-and-view-dist.js"
@@ -46,7 +46,7 @@
46
46
  "@types/rss": "^0.0.32",
47
47
  "@typescript-eslint/eslint-plugin": "^8.32.1",
48
48
  "@typescript-eslint/parser": "^8.32.1",
49
- "@vitest/coverage-v8": "^3.1.4",
49
+ "@vitest/coverage-v8": "^4.1.8",
50
50
  "cross-env": "^7.0.3",
51
51
  "eslint": "^9.27.0",
52
52
  "jscpd": "^4.2.4",
@@ -56,7 +56,7 @@
56
56
  "rimraf": "^6.1.3",
57
57
  "tsx": "^4.21.0",
58
58
  "typescript": "^6.0.3",
59
- "vitest": "^3.1.4"
59
+ "vitest": "^4.1.8"
60
60
  },
61
61
  "overrides": {
62
62
  "typescript": "^6.0.3"
@@ -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.
@@ -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
  >
@@ -169,6 +169,38 @@ main {
169
169
  transform: translateX(4px);
170
170
  }
171
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
+
172
204
  /* Post Page */
173
205
  .back-link {
174
206
  display: inline-flex;