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
@@ -2,6 +2,7 @@ import fs from 'fs-extra';
2
2
  import { join } from 'node:path';
3
3
  import { getConfig, getLogbookDirPath } from '../lib/config.js';
4
4
  import { getLogbookEntries } from '../utils/fs.js';
5
+ import { hasUnfilledPlaceholders } from '../utils/validation.js';
5
6
  import { getActiveEntry } from '../lib/session.js';
6
7
  import { parseTicketId } from '../utils/id.js';
7
8
  import { error, neutral, highlight, bold, warning } from '../lib/theme.js';
@@ -31,23 +32,7 @@ export async function status() {
31
32
  draftCount++;
32
33
  continue;
33
34
  }
34
- const { data, content } = entry;
35
- // Check frontmatter field values for bracket-style unfilled placeholders
36
- const dataValues = Object.values(data)
37
- .filter((v) => typeof v === 'string')
38
- .join('\n');
39
- const frontmatterHasPlaceholders = dataValues.includes('[DATE_END]') ||
40
- dataValues.includes('[DATE_START]') ||
41
- dataValues.includes('[WRITE_SUMMARY_HERE]') ||
42
- dataValues.includes('[PROMPTER]') ||
43
- dataValues.includes('[HARNESS]') ||
44
- dataValues.includes('[LLM]');
45
- // Check body content for unfilled template hints (strip inline code spans to avoid false positives)
46
- const contentWithoutCode = content.replace(/`[^`]*`/g, '');
47
- const bodyHasPlaceholders = contentWithoutCode.includes('TODO:') ||
48
- content.includes('Write a polished, highly readable "short story" of the change here.');
49
- const hasPlaceholders = frontmatterHasPlaceholders || bodyHasPlaceholders;
50
- if (hasPlaceholders) {
35
+ if (hasUnfilledPlaceholders(entry)) {
51
36
  draftCount++;
52
37
  }
53
38
  else if (!isActive) {
@@ -114,6 +99,9 @@ export async function status() {
114
99
  console.log(` ${bold('Project Name:')} ${config.projectName}`);
115
100
  console.log(` ${bold('Logbook Directory:')} ${config.logbookDir}`);
116
101
  console.log(` ${bold('Output Directory:')} ${config.outputDir}`);
102
+ if (config.adrDir) {
103
+ console.log(` ${bold('ADR Directory:')} ${config.adrDir}`);
104
+ }
117
105
  console.log(` ${bold('Primary Color:')} ${config.primaryColor}`);
118
106
  if (config.jiraBaseUrl) {
119
107
  console.log(` ${bold('Jira Base URL:')} ${config.jiraBaseUrl}`);
@@ -122,7 +110,7 @@ export async function status() {
122
110
  console.log(` ${bold('Jira Prefix:')} ${config.jiraPrefix}`);
123
111
  }
124
112
  if (config.repositoryUrl) {
125
- console.log(` ${bold('Repository URL:')} ${config.repositoryUrl}`);
113
+ console.log(` ${bold('Repository URL:')} ${config.repositoryUrl}`);
126
114
  }
127
115
  if (config.tags?.allowed) {
128
116
  console.log(` ${bold('Allowed Tags:')} ${config.tags.allowed.join(', ')}`);
@@ -136,3 +124,4 @@ export async function status() {
136
124
  console.log(` ${bold('Latest Entry:')} ${latestText}`);
137
125
  console.log('');
138
126
  }
127
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -20,3 +20,4 @@ export async function steer() {
20
20
  .replace(/Quality Gate:/g, errorStyle('Quality Gate:'));
21
21
  console.log(formatted);
22
22
  }
23
+ //# sourceMappingURL=steer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steer.js","sourceRoot":"","sources":["../../src/commands/steer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,OAAO,IAAI,YAAY,EACvB,MAAM,EACN,KAAK,IAAI,UAAU,EACnB,OAAO,EACP,YAAY,EACZ,IAAI,EACJ,SAAS,GACV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,EAAE,WAAW,CAAC,CAAC;IAEvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,8BAA8B,CAAC,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAEpD,gDAAgD;IAChD,MAAM,SAAS,GAAG,QAAQ;SACvB,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3D,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAC1C,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SAC1C,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SACrC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;SAClD,OAAO,CAAC,qBAAqB,EAAE,YAAY,CAAC,oBAAoB,CAAC,CAAC;SAClE,OAAO,CAAC,gBAAgB,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;IAE1D,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACzB,CAAC"}
@@ -21,3 +21,4 @@ export async function upgrade() {
21
21
  console.log(success(`\nSuccessfully upgraded ${updatedCount} files.`));
22
22
  }
23
23
  }
24
+ //# sourceMappingURL=upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,MAAM,aAAa,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC/C,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC5F,YAAY,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,qCAAqC,CAAC,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,2BAA2B,YAAY,SAAS,CAAC,CAAC,CAAC;IACzE,CAAC;AACH,CAAC"}
package/dist/index.js CHANGED
@@ -78,10 +78,9 @@ program
78
78
  program
79
79
  .command('log <message>')
80
80
  .description('Append a timestamped log entry to the active log.md (e.g. logbook log "Did a thing")')
81
- .option('-i, --id <id>', 'Override active logbook entry ID')
82
- .action(async (message, options) => {
81
+ .action(async (message) => {
83
82
  const { log } = await import('./commands/log.js');
84
- await log([message], options);
83
+ await log([message]);
85
84
  });
86
85
  program
87
86
  .command('steer')
@@ -91,3 +90,4 @@ program
91
90
  await steer();
92
91
  });
93
92
  program.parse();
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -5,3 +5,4 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
5
5
  export function getAboutContent() {
6
6
  return readFileSync(join(__dirname, '../templates/ABOUT.md'), 'utf8');
7
7
  }
8
+ //# sourceMappingURL=about-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"about-content.js","sourceRoot":"","sources":["../../src/lib/about-content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,EAAE,MAAM,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { LogbookConfig } from './config.js';
2
+ import type { TimelineAdrItem } from './template-types.js';
3
+ /**
4
+ * Compiles a parsed ADR into its own beautiful, static detail HTML page.
5
+ */
6
+ export declare function renderAdr(adr: TimelineAdrItem, ctx: {
7
+ adrDir: string;
8
+ outputDir: string;
9
+ config: LogbookConfig;
10
+ version: string;
11
+ buildTime: string;
12
+ }): Promise<void>;
@@ -0,0 +1,53 @@
1
+ import fs from 'fs-extra';
2
+ import { join } from 'node:path';
3
+ import matter from 'gray-matter';
4
+ import { layout } from './templates.js';
5
+ import { mdToHtml, generateBuildMeta } from './build-helpers.js';
6
+ import { escapeHtml } from './html-escape.js';
7
+ import { html, getAdrStatusInfo } from './template-helpers.js';
8
+ /**
9
+ * Compiles a parsed ADR into its own beautiful, static detail HTML page.
10
+ */
11
+ export async function renderAdr(adr, ctx) {
12
+ const adrSourcePath = join(ctx.adrDir, adr.filepath.split('/').pop() || '');
13
+ const mdContent = await fs.readFile(adrSourcePath, 'utf8');
14
+ const { content } = matter(mdContent);
15
+ const bodyHtml = await mdToHtml(content);
16
+ const buildMeta = generateBuildMeta(ctx.version, ctx.buildTime);
17
+ const adrId = `ADR-${String(adr.id).padStart(4, '0')}`;
18
+ const status = adr.status.toLowerCase();
19
+ const { badgeClass: statusBadgeClass, icon: statusIcon } = getAdrStatusInfo(status);
20
+ const tagsHtml = adr.tags && adr.tags.length > 0
21
+ ? adr.tags.map((tag) => `<span class="tag-badge tag-workspace">${escapeHtml(tag)}</span>`).join('')
22
+ : '';
23
+ const pageHtml = layout({
24
+ title: adr.title,
25
+ projectName: ctx.config.projectName,
26
+ basePath: '../../',
27
+ buildMeta,
28
+ header: html `<header>
29
+ <div class="header-inner">
30
+ <h1><a href="../../index.html">${escapeHtml(ctx.config.projectName)}</a></h1>
31
+ <p class="tagline">Architecture Decision Record</p>
32
+ </div>
33
+ </header>`,
34
+ content: html `<article class="post-card adr-detail-card">
35
+ <div class="item-meta adr-detail-meta">
36
+ <span class="${statusBadgeClass} adr-status-badge">${statusIcon} ${status}</span>
37
+ <strong>${adrId}</strong> • Created by <strong>${escapeHtml(adr.author)}</strong> on
38
+ <strong>${escapeHtml(adr.displayDate)}</strong>
39
+ </div>
40
+ <h2 class="adr-detail-title">${escapeHtml(adr.title)}</h2>
41
+ <div class="markdown-body adr-detail-body">${bodyHtml}</div>
42
+ <div class="tags-wrapper adr-detail-tags">
43
+ <span class="tag-badge adr-indicator-badge">ADR</span>
44
+ ${tagsHtml}
45
+ </div>
46
+ </article>`,
47
+ });
48
+ const stem = adr.filepath.split('/').pop()?.replace(/\.md$/i, '') || '';
49
+ const outDir = join(ctx.outputDir, 'adr', stem);
50
+ await fs.mkdirp(outDir);
51
+ await fs.writeFile(join(outDir, 'index.html'), pageHtml);
52
+ }
53
+ //# sourceMappingURL=adr-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adr-renderer.js","sourceRoot":"","sources":["../../src/lib/adr-renderer.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import fs from 'fs-extra';
2
- import { join, resolve } from 'node:path';
2
+ import { join } from 'node:path';
3
3
  import matter from 'gray-matter';
4
4
  import { layout, postTemplate } from './templates.js';
5
5
  import { getGitCommits } from './git-helpers.js';
@@ -70,8 +70,8 @@ async function renderLinkedMdFiles(markdownSources, entryPath, entryOutputDir, c
70
70
  continue;
71
71
  }
72
72
  // Path traversal protection: ensure resolved path stays within project boundaries
73
- const resolvedPath = resolve(sourcePath);
74
- const projectRoot = resolve(process.cwd());
73
+ const resolvedPath = fs.realpathSync(sourcePath);
74
+ const projectRoot = fs.realpathSync(process.cwd());
75
75
  if (!resolvedPath.startsWith(projectRoot + '/') && resolvedPath !== projectRoot) {
76
76
  console.warn(` Path traversal blocked: ${href}`);
77
77
  continue;
@@ -129,6 +129,8 @@ export async function renderPost(data, i, allEntries, ctx) {
129
129
  });
130
130
  const descriptionRaw = typeof data.summary === 'string' ? data.summary.replace(/[*#`]/g, '').trim() : '';
131
131
  const buildMeta = generateBuildMeta(ctx.version, ctx.buildTime);
132
+ const prevUrl = prev ? `../${prev.slug}/index.html` : undefined;
133
+ const nextUrl = next ? `../${next.slug}/index.html` : undefined;
132
134
  const postHtml = layout({
133
135
  title: data.title ?? data.slug,
134
136
  projectName: ctx.config.projectName,
@@ -138,6 +140,8 @@ export async function renderPost(data, i, allEntries, ctx) {
138
140
  buildMeta,
139
141
  header: postHeader,
140
142
  content: postMainContent,
143
+ prevUrl,
144
+ nextUrl,
141
145
  });
142
146
  const entryOutputDir = join(ctx.outputDir, data.slug);
143
147
  await fs.mkdirp(entryOutputDir);
@@ -156,3 +160,4 @@ export async function renderPost(data, i, allEntries, ctx) {
156
160
  export function generateBuildMeta(version, buildTime) {
157
161
  return `Generated by <a href="https://www.npmjs.com/package/project-logbook" target="_blank" rel="noopener noreferrer">Project Logbook CLI</a> v${version} • ${buildTime}`;
158
162
  }
163
+ //# sourceMappingURL=build-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-helpers.js","sourceRoot":"","sources":["../../src/lib/build-helpers.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import type { LogbookConfig } from './config.js';
2
+ import type { TimelineEntry } from './template-types.js';
3
+ import type { EntryMeta } from '../utils/fs.js';
2
4
  /**
3
5
  * Set up the output directory: create it, copy static assets (favicon, styles, script).
4
6
  */
@@ -13,8 +15,24 @@ export declare function processReadme(projectRoot: string): Promise<{
13
15
  /**
14
16
  * Copy README images to the output directory.
15
17
  */
16
- export declare function copyReadmeImages(projectRoot: string, outputDir: string, imagePaths: string[]): Promise<void>;
18
+ export declare const copyReadmeImages: (projectRoot: string, outputDir: string, imagePaths: string[]) => Promise<void>;
17
19
  /**
18
20
  * Process the About content and return rendered HTML.
19
21
  */
20
- export declare function processAboutContent(aboutContent: string): Promise<string>;
22
+ export declare const processAboutContent: (aboutContent: string) => Promise<string>;
23
+ /**
24
+ * Process the Welcome content and return rendered HTML.
25
+ */
26
+ export declare function processWelcomeContent(): Promise<string>;
27
+ /**
28
+ * Generate and write RSS feed to the output directory.
29
+ */
30
+ export declare function buildRssFeed(outputDir: string, timelineEntries: TimelineEntry[], config: LogbookConfig, version: string): Promise<void>;
31
+ /**
32
+ * Processes raw logbook entry metadata into chronological timeline entries.
33
+ */
34
+ export declare function processTimelineEntries(logbookEntries: EntryMeta[], activeEntry: {
35
+ slug: string;
36
+ } | null | undefined, availableWorkspaces: string[]): (TimelineEntry & {
37
+ monthGroup: string;
38
+ })[];
@@ -4,21 +4,27 @@
4
4
  */
5
5
  import fs from 'fs-extra';
6
6
  import { join } from 'node:path';
7
- import { warning } from './theme.js';
8
- import { URL } from 'node:url';
7
+ import { warning, error, neutral } from './theme.js';
8
+ import { URL, fileURLToPath } from 'node:url';
9
9
  import { mdToHtmlWithImages, copyImages } from './image-helpers.js';
10
10
  import { getStyles } from './styles.js';
11
11
  import { getClientScript } from './logbook-client.js';
12
12
  import { mdToHtml } from './build-helpers.js';
13
+ import { generateRssFeed, validateRssXml } from './rss.js';
14
+ import { asString, asStringArray, toDisplayString } from '../utils/frontmatter.js';
15
+ import { formatAbsoluteDate, getMonthYear, getSortTime } from '../utils/date.js';
16
+ import { getEntryDisplayId, getEntryDisplayTitle } from './entry-id.js';
13
17
  /**
14
18
  * Set up the output directory: create it, copy static assets (favicon, styles, script).
15
19
  */
16
20
  export async function setupOutputDirectory(outputDir, config) {
17
21
  await fs.remove(outputDir);
18
22
  await fs.mkdirp(outputDir);
19
- await fs.copyFile(new URL('../templates/favicon.svg', import.meta.url), join(outputDir, 'favicon.svg'));
20
- await fs.writeFile(join(outputDir, 'style.css'), getStyles(config.primaryColor));
21
- await fs.writeFile(join(outputDir, 'logbook.js'), getClientScript());
23
+ await Promise.all([
24
+ fs.copyFile(new URL('../templates/favicon.svg', import.meta.url), join(outputDir, 'favicon.svg')),
25
+ fs.writeFile(join(outputDir, 'style.css'), getStyles(config.primaryColor)),
26
+ fs.writeFile(join(outputDir, 'logbook.js'), getClientScript()),
27
+ ]);
22
28
  }
23
29
  /**
24
30
  * Process README.md if it exists and return rendered HTML + image paths.
@@ -29,8 +35,7 @@ export async function processReadme(projectRoot) {
29
35
  let readmeImages = [];
30
36
  try {
31
37
  if (await fs.pathExists(readmePath)) {
32
- const readmeContent = await fs.readFile(readmePath, 'utf8');
33
- const { html, imagePaths } = await mdToHtmlWithImages(readmeContent);
38
+ const { html, imagePaths } = await mdToHtmlWithImages(await fs.readFile(readmePath, 'utf8'));
34
39
  readmeHtml = html;
35
40
  readmeImages = imagePaths;
36
41
  }
@@ -44,14 +49,103 @@ export async function processReadme(projectRoot) {
44
49
  /**
45
50
  * Copy README images to the output directory.
46
51
  */
47
- export async function copyReadmeImages(projectRoot, outputDir, imagePaths) {
48
- if (imagePaths.length > 0) {
49
- await copyImages(projectRoot, outputDir, imagePaths);
52
+ export const copyReadmeImages = (projectRoot, outputDir, imagePaths) => imagePaths.length > 0 ? copyImages(projectRoot, outputDir, imagePaths) : Promise.resolve();
53
+ /**
54
+ * Process the About content and return rendered HTML.
55
+ */
56
+ export const processAboutContent = (aboutContent) => mdToHtml(aboutContent);
57
+ /**
58
+ * Process the Welcome content and return rendered HTML.
59
+ */
60
+ export async function processWelcomeContent() {
61
+ try {
62
+ const welcomePath = fileURLToPath(new URL('../templates/WELCOME.md', import.meta.url));
63
+ if (await fs.pathExists(welcomePath)) {
64
+ return await mdToHtml(await fs.readFile(welcomePath, 'utf8'));
65
+ }
66
+ }
67
+ catch (error) {
68
+ console.warn(warning(`Warning: Failed to read WELCOME.md: ${error instanceof Error ? error.message : error}`));
50
69
  }
70
+ return '';
51
71
  }
52
72
  /**
53
- * Process the About content and return rendered HTML.
73
+ * Generate and write RSS feed to the output directory.
54
74
  */
55
- export async function processAboutContent(aboutContent) {
56
- return await mdToHtml(aboutContent);
75
+ export async function buildRssFeed(outputDir, timelineEntries, config, version) {
76
+ const rssConfig = {
77
+ title: `${config.projectName} - Recent Updates`,
78
+ description: `Latest logbook entries from ${config.projectName}`,
79
+ language: 'en',
80
+ feed_url: `${config.projectName.toLowerCase().replace(/\s+/g, '-')}/rss.xml`,
81
+ site_url: config.projectName,
82
+ generator: `Project Logbook CLI v${version}`,
83
+ };
84
+ const rssXml = generateRssFeed(timelineEntries, rssConfig);
85
+ // Basic validation
86
+ if (!validateRssXml(rssXml)) {
87
+ console.warn(error('Warning: Generated RSS feed failed basic validation. Skipping rss.xml generation.'));
88
+ }
89
+ else {
90
+ await fs.writeFile(join(outputDir, 'rss.xml'), rssXml);
91
+ console.log(neutral(` Generated RSS feed with ${Math.min(50, timelineEntries.length)} entries`));
92
+ }
93
+ }
94
+ /**
95
+ * Processes raw logbook entry metadata into chronological timeline entries.
96
+ */
97
+ export function processTimelineEntries(logbookEntries, activeEntry, availableWorkspaces) {
98
+ const timelineEntries = [];
99
+ for (const entry of logbookEntries) {
100
+ if (!entry.hasIndex)
101
+ continue;
102
+ const { data, content, slug } = entry;
103
+ let summary = data.summary;
104
+ if (!summary) {
105
+ const firstParagraph = content.split('\n\n').find((p) => p.trim() && !p.trim().startsWith('#'));
106
+ summary = firstParagraph
107
+ ? firstParagraph.trim().substring(0, 200).replace(/[*#`]/g, '') + '...'
108
+ : 'No summary available.';
109
+ }
110
+ const entryWorkspaces = asStringArray(data.workspaces).filter((ws) => availableWorkspaces.includes(ws));
111
+ const dateStartValue = data.dateStart;
112
+ const dateStart = typeof dateStartValue === 'string'
113
+ ? dateStartValue
114
+ : dateStartValue instanceof Date
115
+ ? dateStartValue.toISOString()
116
+ : '';
117
+ // Skip DRAFT entries (no valid dateStart) — they break the timeline
118
+ if (!dateStart || dateStart.includes('{{') || dateStart === '[DATE_START]') {
119
+ console.log(warning(`[DRAFT SKIPPED] Entry '${slug}' was excluded from the built site (missing valid dateStart).`));
120
+ if (activeEntry && activeEntry.slug === slug) {
121
+ console.log(warning(` → Your active session resolves to this entry. Run 'logbook start ${slug.split('-')[0]}' to initialize dateStart and make it visible.`));
122
+ }
123
+ continue;
124
+ }
125
+ const dateEndValue = data.dateEnd;
126
+ const dateEnd = typeof dateEndValue === 'string' && dateEndValue !== '[DATE_END]'
127
+ ? dateEndValue
128
+ : dateEndValue instanceof Date
129
+ ? dateEndValue.toISOString()
130
+ : undefined;
131
+ timelineEntries.push({
132
+ kind: 'entry',
133
+ slug,
134
+ dateStart,
135
+ dateEnd,
136
+ displayDate: formatAbsoluteDate(dateStart),
137
+ sortTime: getSortTime(dateStart, dateEnd),
138
+ summary: asString(summary, 'No summary available.') || '',
139
+ ticket: getEntryDisplayId(asString(data.ticket), slug),
140
+ monthGroup: getMonthYear(dateStart),
141
+ tags: asStringArray(data.tags),
142
+ workspaces: entryWorkspaces,
143
+ title: getEntryDisplayTitle(asString(data.title), slug),
144
+ harness: toDisplayString(data.harness),
145
+ llm: toDisplayString(data.llm),
146
+ prompter: toDisplayString(data.prompter),
147
+ });
148
+ }
149
+ return timelineEntries;
57
150
  }
151
+ //# sourceMappingURL=build-steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-steps.js","sourceRoot":"","sources":["../../src/lib/build-steps.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ export interface LogbookConfig {
10
10
  tags?: {
11
11
  allowed: string[];
12
12
  };
13
+ adrDir?: string;
13
14
  }
14
15
  export declare const DEFAULT_CONFIG: LogbookConfig;
15
16
  export declare function getConfig(cwd?: string): LogbookConfig;
@@ -29,3 +30,10 @@ export declare function getLogbookDirPath(config: LogbookConfig, cwd?: string):
29
30
  * @returns Absolute path to the output directory
30
31
  */
31
32
  export declare function getOutputDirPath(config: LogbookConfig, cwd?: string): string;
33
+ /**
34
+ * Get the absolute path to the ADR directory.
35
+ * @param config - The logbook config
36
+ * @param cwd - Optional working directory (defaults to process.cwd())
37
+ * @returns Absolute path to the ADR directory or null if not configured
38
+ */
39
+ export declare function getAdrDirPath(config: LogbookConfig, cwd?: string): string | null;
@@ -21,6 +21,7 @@ export const DEFAULT_CONFIG = {
21
21
  logbookDir: 'logbook',
22
22
  outputDir: 'dist/logbook',
23
23
  primaryColor: '#2563eb',
24
+ adrDir: 'docs/adr',
24
25
  tags: {
25
26
  allowed: ['#bugfix', '#feature', '#refactor'],
26
27
  },
@@ -31,7 +32,14 @@ export function getConfig(cwd = process.cwd()) {
31
32
  if (existsSync(configPath)) {
32
33
  try {
33
34
  const userConfig = JSON.parse(readFileSync(configPath, 'utf8'));
34
- config = { ...DEFAULT_CONFIG, ...userConfig };
35
+ config = {
36
+ ...DEFAULT_CONFIG,
37
+ ...userConfig,
38
+ tags: {
39
+ ...DEFAULT_CONFIG.tags,
40
+ ...(userConfig.tags || {}),
41
+ },
42
+ };
35
43
  }
36
44
  catch (err) {
37
45
  const errorMessage = err instanceof Error ? err.message : String(err);
@@ -63,3 +71,13 @@ export function getLogbookDirPath(config, cwd = process.cwd()) {
63
71
  export function getOutputDirPath(config, cwd = process.cwd()) {
64
72
  return join(cwd, config.outputDir);
65
73
  }
74
+ /**
75
+ * Get the absolute path to the ADR directory.
76
+ * @param config - The logbook config
77
+ * @param cwd - Optional working directory (defaults to process.cwd())
78
+ * @returns Absolute path to the ADR directory or null if not configured
79
+ */
80
+ export function getAdrDirPath(config, cwd = process.cwd()) {
81
+ return config.adrDir ? join(cwd, config.adrDir) : null;
82
+ }
83
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -24,3 +24,4 @@ export function getEntryDisplayId(ticket, slug) {
24
24
  export function getEntryDisplayTitle(title, slug) {
25
25
  return title || slug;
26
26
  }
27
+ //# sourceMappingURL=entry-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-id.js","sourceRoot":"","sources":["../../src/lib/entry-id.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAA0B,EAAE,IAAY;IACxE,OAAO,MAAM,IAAI,IAAI,CAAC;AACxB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAyB,EAAE,IAAY;IAC1E,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC"}
@@ -53,3 +53,4 @@ export function getEntryFilePaths(logbookDir, entrySlug) {
53
53
  log: getEntryLogPath(logbookDir, entrySlug),
54
54
  };
55
55
  }
56
+ //# sourceMappingURL=entry-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-paths.js","sourceRoot":"","sources":["../../src/lib/entry-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;GAGG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,UAAkB,EAAE,SAAiB;IAChE,OAAO,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AACrC,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,UAAkB,EAAE,SAAiB;IAC9D,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,UAAkB,EAAE,SAAiB;IAC/D,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;AAChE,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CAAC,UAAkB,EAAE,SAAiB;IAC5D,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAkB,EAAE,SAAiB;IACrE,OAAO;QACL,KAAK,EAAE,iBAAiB,CAAC,UAAU,EAAE,SAAS,CAAC;QAC/C,MAAM,EAAE,kBAAkB,CAAC,UAAU,EAAE,SAAS,CAAC;QACjD,GAAG,EAAE,eAAe,CAAC,UAAU,EAAE,SAAS,CAAC;KAC5C,CAAC;AACJ,CAAC"}
@@ -1,16 +1,5 @@
1
1
  import type { GitCommit } from './template-types.js';
2
- /**
3
- * Clean the repository URL by removing trailing slashes and .git extensions.
4
- */
5
- export declare function cleanRepositoryUrl(url: string): string;
6
- /**
7
- * Generate a URL to view a specific commit in a web interface (GitHub, GitLab, Bitbucket, etc.).
8
- */
9
- export declare function getCommitUrl(repositoryUrl: string | undefined, sha: string): string | undefined;
10
- /**
11
- * Generate a URL to view a specific tag in a web interface (GitHub, GitLab, Bitbucket, etc.).
12
- */
13
- export declare function getTagUrl(repositoryUrl: string | undefined, tag: string): string | undefined;
2
+ export { cleanRepositoryUrl, getCommitUrl, getTagUrl, parseRemoteUrlToWebUrl } from './git-url-helpers.js';
14
3
  /**
15
4
  * Parse the raw output of `git log --pretty=format:"%H|%s|%aI"` into GitCommit objects.
16
5
  * Pure function (no I/O) — unit-testable without spawning git.
@@ -39,15 +28,15 @@ export declare function getGitTags(): Promise<{
39
28
  * Synchronous execution — safe to use during synchronous config parsing.
40
29
  */
41
30
  export declare function getGitRemoteUrl(cwd?: string): string | undefined;
42
- /**
43
- * Parse a git remote URL (SSH or HTTPS) into a clean web/HTTP(S) repository homepage URL.
44
- */
45
- export declare function parseRemoteUrlToWebUrl(remoteUrl: string | undefined): string | undefined;
46
31
  /**
47
32
  * Synchronous branch detection — used in session resolution (not the build pipeline).
48
33
  * Kept synchronous intentionally; simple-git is used for the heavier async build operations.
49
34
  */
50
35
  export declare function getCurrentBranch(cwd?: string): string | undefined;
36
+ /**
37
+ * Dynamically detect the default branch (usually main or master).
38
+ */
39
+ export declare function getDefaultBranch(cwd?: string): string;
51
40
  /**
52
41
  * Calculate the changed LOC (insertions + deletions) for the active branch or main working tree.
53
42
  */