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
@@ -1 +1,2 @@
1
1
  export {};
2
+ //# sourceMappingURL=lint-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint-types.js","sourceRoot":"","sources":["../../src/lib/lint-types.ts"],"names":[],"mappings":""}
@@ -1 +1,2 @@
1
1
  export const LOCKFILE_NAME = '.logbook-active';
2
+ //# sourceMappingURL=lockfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../src/lib/lockfile.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAiB,CAAC"}
@@ -9,3 +9,4 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
9
9
  export function getClientScript() {
10
10
  return readFileSync(join(__dirname, '../templates/logbook-client.js'), 'utf8');
11
11
  }
12
+ //# sourceMappingURL=logbook-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logbook-client.js","sourceRoot":"","sources":["../../src/lib/logbook-client.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;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,gCAAgC,CAAC,EAAE,MAAM,CAAC,CAAC;AACjF,CAAC"}
@@ -66,3 +66,4 @@ export function createImageCollectionProcessor(imageCollectionPlugin, rehypeRewr
66
66
  }
67
67
  return createMarkdownProcessor(plugins);
68
68
  }
69
+ //# sourceMappingURL=markdown-processors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-processors.js","sourceRoot":"","sources":["../../src/lib/markdown-processors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,OAAO,eAAe,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAqB,GAAG,EAAE;IACzD,OAAO,CAAC,IAAU,EAAE,EAAE;QACpB,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAa,EAAE,EAAE;YAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC;YACnC,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,OAAO;YACrC,IAAI,qBAAqB,CAAC,IAAI,CAAC;gBAAE,OAAO;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACjD,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAClC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,IAAI,cAAc,QAAQ,EAAE,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;GAKG;AACH,SAAS,uBAAuB,CAC9B,UAA0C,EAAE;IAE5C,MAAM,SAAS,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAE9E,yCAAyC;IACzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAC1E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAC5C,oBAAsC;IAEtC,OAAO,uBAAuB,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAC1C,oBAAsC,EACtC,uBAAyC;IAEzC,OAAO,uBAAuB,CAAC,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,CAAC,CAAC;AAClF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAC5C,qBAAuC,EACvC,uBAAyC,EACzC,oBAAuC;IAEvC,MAAM,OAAO,GAAmC,CAAC,qBAAqB,EAAE,uBAAuB,CAAC,CAAC;IACjG,IAAI,oBAAoB,EAAE,CAAC;QACzB,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,uBAAuB,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC"}
@@ -32,3 +32,4 @@ export async function getProjectStatus() {
32
32
  }
33
33
  return results;
34
34
  }
35
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/lib/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,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,GAAG,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;AAE1E,MAAM,UAAU,eAAe;IAC7B,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAEhG,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;AACpD,CAAC;AAYD,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,OAAO,GAAwB,EAAE,CAAC;IAExC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAEnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,SAAS;QAE3C,MAAM,eAAe,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAE9D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;QACnF,CAAC;aAAM,CAAC;YACN,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,cAAc,KAAK,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC;YAC9E,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -14,3 +14,4 @@ export function getPackageVersion() {
14
14
  const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
15
15
  return pkg.version || '0.0.0';
16
16
  }
17
+ //# sourceMappingURL=package-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-version.js","sourceRoot":"","sources":["../../src/lib/package-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,4CAA4C;IAC5C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,qEAAqE;IACrE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;AAChC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { PostTemplateProps } from './template-types.js';
2
+ export declare const postTemplate: (props: PostTemplateProps) => {
3
+ header: string;
4
+ content: string;
5
+ };
@@ -0,0 +1,48 @@
1
+ import { escapeHtml, validateUrlScheme } from './html-escape.js';
2
+ import { html, renderTagsAndWorkspaces, renderCommits, navLink } from './template-helpers.js';
3
+ import { ATTR_DATA_DATE } from './html-attributes.js';
4
+ export const postTemplate = (props) => {
5
+ const { title, displayDate, dateStart, harness, llm, prompter, content, ticketHtml, logHtml, commits, version, jiraUrl, repositoryUrl, prevEntry, nextEntry, tags, workspaces, backLink } = props; // prettier-ignore
6
+ // Validate jiraUrl scheme to prevent javascript: URLs
7
+ const validatedJiraUrl = jiraUrl ? validateUrlScheme(jiraUrl) : undefined;
8
+ const jiraBtn = validatedJiraUrl
9
+ ? `<a href="${escapeHtml(validatedJiraUrl)}" class="jira-link-btn" target="_blank" rel="noopener noreferrer">View in Jira ↗</a>`
10
+ : '';
11
+ 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>`;
12
+ const header = html `<header>
13
+ <div class="header-inner">
14
+ <h1>${escapeHtml(title)}</h1>
15
+ <div class="tagline">
16
+ <span ${ATTR_DATA_DATE}="${dateStart}">${displayDate}</span> •
17
+ ${llm ? `${escapeHtml(llm)} via ` : ''}${escapeHtml(harness)}${prompter ? ` / ${escapeHtml(prompter)}` : ''} •
18
+ v${version}
19
+ </div>
20
+ <div class="header-nav">
21
+ <div class="header-nav-left">
22
+ <a href="${escapeHtml(backLink ?? '../index.html')}" class="back-link">← Back to Timeline</a>
23
+ </div>
24
+ <div class="tabs" role="tablist" aria-label="Entry sections">
25
+ ${tabBtn('story', 'Story', true)}${tabBtn('spec', 'Original Spec')}${tabBtn('log', 'Technical Log')}
26
+ </div>
27
+ <div class="header-nav-right">${jiraBtn ? `${jiraBtn}` : '<span></span>'}</div>
28
+ </div>
29
+ </div>
30
+ </header>`;
31
+ const mainContent = html `<article>
32
+ <div class="content-sections">
33
+ <div id="story" class="content-section" role="tabpanel">
34
+ ${renderTagsAndWorkspaces(tags, workspaces)}${content}
35
+ </div>
36
+ <div id="spec" class="content-section" role="tabpanel" style="display:none;">${ticketHtml}</div>
37
+ <div id="log" class="content-section" role="tabpanel" style="display:none;">
38
+ ${logHtml}${renderCommits(commits, repositoryUrl)}
39
+ </div>
40
+ </div>
41
+ <nav class="post-nav">
42
+ <div class="post-nav-prev">${prevEntry ? navLink(prevEntry, 'prev') : '<span></span>'}</div>
43
+ <div class="post-nav-next">${nextEntry ? navLink(nextEntry, 'next') : '<span></span>'}</div>
44
+ </nav>
45
+ </article>`;
46
+ return { header, content: mainContent };
47
+ };
48
+ //# sourceMappingURL=post-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-template.js","sourceRoot":"","sources":["../../src/lib/post-template.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAwB,EAAuC,EAAE;IAC5F,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,kBAAkB;IACrN,sDAAsD;IACtD,MAAM,gBAAgB,GAAG,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,MAAM,OAAO,GAAG,gBAAgB;QAC9B,CAAC,CAAC,YAAY,UAAU,CAAC,gBAAgB,CAAC,sFAAsF;QAChI,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,KAAa,EAAE,MAAM,GAAG,KAAK,EAAE,EAAE,CAC3D,kBAAkB,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,+BAA+B,MAAM,oBAAoB,UAAU,CAAC,EAAE,CAAC,eAAe,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,8BAA8B,UAAU,CAAC,EAAE,CAAC,OAAO,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC;IACjO,MAAM,MAAM,GAAG,IAAI,CAAA;;YAET,UAAU,CAAC,KAAK,CAAC;;gBAEb,cAAc,KAAK,SAAS,KAAK,WAAW;UAClD,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;WACxG,OAAO;;;;qBAIG,UAAU,CAAC,QAAQ,IAAI,eAAe,CAAC;;;YAGhD,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,eAAe,CAAC;;wCAErE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,eAAe;;;YAGpE,CAAC;IACX,MAAM,WAAW,GAAG,IAAI,CAAA;;;UAGhB,uBAAuB,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,OAAO;;qFAEwB,UAAU;;UAErF,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC;;;;mCAItB,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe;mCACxD,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe;;aAE9E,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAC1C,CAAC,CAAC"}
package/dist/lib/rss.js CHANGED
@@ -75,3 +75,4 @@ export function validateRssXml(xml) {
75
75
  return false;
76
76
  }
77
77
  }
78
+ //# sourceMappingURL=rss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rss.js","sourceRoot":"","sources":["../../src/lib/rss.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
- interface ActiveEntryResult {
1
+ export interface ActiveEntryResult {
2
2
  slug: string;
3
3
  source: 'branch' | 'lockfile' | 'flag';
4
4
  startedAt?: string;
5
5
  prompter?: string;
6
+ path?: string;
6
7
  }
7
8
  /**
8
9
  * Resolves the currently active logbook entry using the following strategy:
@@ -13,4 +14,3 @@ interface ActiveEntryResult {
13
14
  export declare function getActiveEntry(options?: {
14
15
  id?: string;
15
16
  }, cwd?: string): Promise<ActiveEntryResult | undefined>;
16
- export {};
@@ -13,62 +13,102 @@ import { getLogbookEntries } from '../utils/fs.js';
13
13
  export async function getActiveEntry(options = {}, cwd = process.cwd()) {
14
14
  const config = getConfig(cwd);
15
15
  const logbookDir = join(cwd, config.logbookDir);
16
- // 1. Early lockfile check
17
- const lockfilePath = join(cwd, LOCKFILE_NAME);
18
- if (await fs.pathExists(lockfilePath)) {
19
- try {
20
- const lock = await fs.readJson(lockfilePath);
21
- return { slug: lock.slug, source: 'lockfile', startedAt: lock.startedAt, prompter: lock.prompter };
22
- }
23
- catch {
24
- // ignore corrupt lockfile
25
- }
26
- }
27
- // 2. Load logbook entries
16
+ // 1. Load logbook entries
28
17
  let entries = [];
29
18
  try {
30
19
  entries = await getLogbookEntries(logbookDir);
20
+ if (config.researchDir) {
21
+ const researchDir = join(cwd, config.researchDir);
22
+ if (await fs.pathExists(researchDir)) {
23
+ const resEntries = await getLogbookEntries(researchDir);
24
+ entries.push(...resEntries);
25
+ }
26
+ }
27
+ if (config.customTypes) {
28
+ for (const typeConfig of Object.values(config.customTypes)) {
29
+ if (typeConfig.dir) {
30
+ const typeDir = join(cwd, typeConfig.dir);
31
+ if (await fs.pathExists(typeDir)) {
32
+ const customEntries = await getLogbookEntries(typeDir);
33
+ entries.push(...customEntries);
34
+ }
35
+ }
36
+ }
37
+ }
31
38
  }
32
39
  catch {
33
40
  entries = [];
34
41
  }
35
- const availableSlugs = entries.map((e) => e.slug);
36
- // 1. Explicit ID flag
42
+ // 2. Explicit ID flag (takes absolute precedence)
37
43
  if (options.id) {
38
- const resolvedId = options.id;
39
- // Find entry matching ID prefix (e.g. "LB-35" or "19")
40
- // Resolve short number to full prefix-number if possible
41
- const fullId = /^\d+$/.test(resolvedId) && config.jiraPrefix ? `${config.jiraPrefix}-${resolvedId}` : resolvedId;
42
- const matchingDir = availableSlugs.find((slug) => {
43
- const prefix = slug.split('-').slice(0, fullId.split('-').length).join('-');
44
- return prefix.toLowerCase() === fullId.toLowerCase();
44
+ const resolvedId = /^\d+(?:-.*)?$/.test(options.id) && config.jiraPrefix ? `${config.jiraPrefix}-${options.id}` : options.id;
45
+ // First Pass: Exact Ticket ID Match in Frontmatter
46
+ const exactMatch = entries.find((e) => {
47
+ const ticket = typeof e.data?.ticket === 'string' ? e.data.ticket.trim().toLowerCase() : '';
48
+ return ticket === resolvedId.toLowerCase();
49
+ });
50
+ if (exactMatch) {
51
+ return {
52
+ slug: exactMatch.slug,
53
+ source: 'flag',
54
+ path: exactMatch.path,
55
+ };
56
+ }
57
+ // Second Pass: Fallback Prefix Match on Folder Names
58
+ const prefixMatch = entries.find((e) => {
59
+ const prefix = e.slug.split('-').slice(0, resolvedId.split('-').length).join('-');
60
+ return prefix.toLowerCase() === resolvedId.toLowerCase();
45
61
  });
46
- if (matchingDir) {
62
+ if (prefixMatch) {
47
63
  return {
48
- slug: matchingDir,
64
+ slug: prefixMatch.slug,
49
65
  source: 'flag',
66
+ path: prefixMatch.path,
50
67
  };
51
68
  }
52
69
  }
53
- // 2. Git Branch Resolution
70
+ // 3. Lockfile check
71
+ const lockfilePath = join(cwd, LOCKFILE_NAME);
72
+ if (await fs.pathExists(lockfilePath)) {
73
+ try {
74
+ const lock = await fs.readJson(lockfilePath);
75
+ const entry = entries.find((e) => e.slug.toLowerCase() === lock.slug.toLowerCase());
76
+ return {
77
+ slug: lock.slug,
78
+ source: 'lockfile',
79
+ startedAt: lock.startedAt,
80
+ prompter: lock.prompter,
81
+ path: entry?.path,
82
+ };
83
+ }
84
+ catch {
85
+ // ignore corrupt lockfile
86
+ }
87
+ }
88
+ // 4. Git Branch Resolution
54
89
  const branchName = getCurrentBranch(cwd);
55
90
  if (branchName) {
56
- const jiraPrefix = config.jiraPrefix || 'LB';
57
- const regex = new RegExp(`(?:^|\\/)(${jiraPrefix}-\\d+)(?:-|$)`, 'i');
58
- const match = branchName.match(regex);
59
- if (match) {
60
- const id = match[1].toUpperCase();
61
- const matchingDir = availableSlugs.find((slug) => {
62
- const prefix = slug.split('-').slice(0, id.split('-').length).join('-');
63
- return prefix.toLowerCase() === id.toLowerCase();
64
- });
65
- if (matchingDir) {
91
+ // Map entries to their respective ticket IDs (using frontmatter with fallback to first 2 parts of slug)
92
+ const candidates = entries.map((e) => {
93
+ const ticketId = typeof e.data?.ticket === 'string' && e.data.ticket.trim()
94
+ ? e.data.ticket.trim()
95
+ : e.slug.split('-').slice(0, 2).join('-');
96
+ return { entry: e, ticketId };
97
+ });
98
+ // Sort by ticketId length descending to match the longest/most-specific ID first
99
+ candidates.sort((a, b) => b.ticketId.length - a.ticketId.length);
100
+ for (const { entry, ticketId } of candidates) {
101
+ const escapedId = ticketId.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
102
+ const boundaryRegex = new RegExp(`(?:^|[/\\-_])${escapedId}(?:$|[/\\-_])`, 'i');
103
+ if (boundaryRegex.test(branchName)) {
66
104
  return {
67
- slug: matchingDir,
105
+ slug: entry.slug,
68
106
  source: 'branch',
107
+ path: entry.path,
69
108
  };
70
109
  }
71
110
  }
72
111
  }
73
112
  return undefined;
74
113
  }
114
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/lib/session.ts"],"names":[],"mappings":"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"}
@@ -22,3 +22,4 @@ export function getStyles(primaryColor) {
22
22
  `;
23
23
  return root + staticCss;
24
24
  }
25
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/lib/styles.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;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,MAAM,UAAU,SAAS,CAAC,YAAoB;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAChD,sDAAsD;IACtD,MAAM,cAAc,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IAChF,MAAM,IAAI,GAAG;iBACE,cAAc;sBACT,cAAc;;;;;;;;;CASnC,CAAC;IACA,OAAO,IAAI,GAAG,SAAS,CAAC;AAC1B,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { TimelineEntry, TimelineCommitItem, TimelineTagItem, EntryLink, GitCommit } from './template-types.js';
1
+ import type { TimelineEntry, TimelineCommitItem, TimelineTagItem, TimelineAdrItem, EntryLink, GitCommit } from './template-types.js';
2
2
  export declare const html: (strings: TemplateStringsArray, ...values: unknown[]) => string;
3
3
  export declare const navLink: (entry: EntryLink, dir: "prev" | "next") => string;
4
4
  export declare const renderTagsAndWorkspaces: (tags: string[] | undefined, workspaces: string[] | undefined) => string;
@@ -6,4 +6,9 @@ export declare const renderCommits: (commits: GitCommit[] | undefined, repositor
6
6
  export declare const renderTimelineEntryItem: (e: TimelineEntry) => string;
7
7
  export declare const renderTimelineCommitItem: (c: TimelineCommitItem, jiraBaseUrl?: string, jiraPrefix?: string, repositoryUrl?: string) => string;
8
8
  export declare const renderTimelineTagItem: (t: TimelineTagItem, repositoryUrl?: string) => string;
9
+ export declare function getAdrStatusInfo(status: string): {
10
+ badgeClass: string;
11
+ icon: string;
12
+ };
13
+ export declare const renderTimelineAdrItem: (item: TimelineAdrItem) => string;
9
14
  export declare const paginationLinks: (currentPage: number, totalPages: number) => string;
@@ -52,6 +52,21 @@ export const renderTimelineEntryItem = (e) => {
52
52
  const harness = e.harness ? escapeHtml(e.harness) : '';
53
53
  const prompter = e.prompter ? escapeHtml(e.prompter) : '';
54
54
  const summary = e.summary ? escapeHtml(e.summary) : '';
55
+ let rightImageHtml = '';
56
+ let bottomImageHtml = '';
57
+ if (e.teaserImage) {
58
+ const src = escapeHtml(e.teaserImage.src);
59
+ if (e.teaserImage.ratio > 4.0) {
60
+ bottomImageHtml = html `<div class="teaser-image-bottom">
61
+ <img src="${src}" alt="" />
62
+ </div>`;
63
+ }
64
+ else {
65
+ rightImageHtml = html `<div class="teaser-image-right">
66
+ <img src="${src}" alt="" />
67
+ </div>`;
68
+ }
69
+ }
55
70
  return html `<div class="timeline-item" ${ATTR_ENTRY_SLUG}="${e.slug}">
56
71
  <a class="timeline-card" href="./${e.slug}/index.html"
57
72
  ><div class="item-content">
@@ -63,8 +78,9 @@ export const renderTimelineEntryItem = (e) => {
63
78
  <span class="new-badge" style="display:none;">NEW</span>${ticket ? `${ticket}: ` : ''}${title}
64
79
  </h3>
65
80
  <div class="item-summary">${summary}</div>
66
- ${renderTagsAndWorkspaces(e.tags, e.workspaces)}
81
+ ${renderTagsAndWorkspaces(e.tags, e.workspaces)} ${bottomImageHtml}
67
82
  </div>
83
+ ${rightImageHtml}
68
84
  <span class="item-arrow">›</span></a
69
85
  >
70
86
  </div>`;
@@ -88,6 +104,69 @@ export const renderTimelineTagItem = (t, repositoryUrl) => {
88
104
  : `<span class="tag-chip-name">${name}</span>`;
89
105
  return `<div class="timeline-item timeline-item--tag"><div class="tag-chip"><span class="tag-chip-icon">🏷</span>${tagHtml}<span class="tag-chip-date" title="${t.timestamp}" ${ATTR_DATA_DATE}="${t.timestamp}">${formatted}</span></div></div>`;
90
106
  };
107
+ export function getAdrStatusInfo(status) {
108
+ let badgeClass = 'tag-badge';
109
+ let icon = '📋';
110
+ const norm = status.toLowerCase();
111
+ if (norm === 'accepted') {
112
+ badgeClass += ' tag-feature';
113
+ icon = '✅';
114
+ }
115
+ else if (norm === 'proposed') {
116
+ badgeClass += ' tag-refactor';
117
+ icon = '💡';
118
+ }
119
+ else if (norm === 'superseded') {
120
+ badgeClass += ' tag-superseded';
121
+ icon = '🔄';
122
+ }
123
+ else if (norm === 'rejected') {
124
+ badgeClass += ' tag-bugfix';
125
+ icon = '❌';
126
+ }
127
+ else {
128
+ badgeClass += ' tag-workspace';
129
+ }
130
+ return { badgeClass, icon };
131
+ }
132
+ export const renderTimelineAdrItem = (item) => {
133
+ const adrId = `ADR-${String(item.id).padStart(4, '0')}`;
134
+ const title = escapeHtml(item.title);
135
+ const status = escapeHtml(item.status.toLowerCase());
136
+ const author = escapeHtml(item.author);
137
+ const decisionHtml = item.decisionHtml || escapeHtml(item.decision);
138
+ const displayDate = escapeHtml(item.displayDate);
139
+ // Parse filename/slug for local static site linking
140
+ const stem = item.filepath.split('/').pop()?.replace(/\.md$/i, '') || '';
141
+ const adrUrl = `./adr/${stem}/index.html`;
142
+ const { badgeClass: statusBadgeClass, icon: statusIcon } = getAdrStatusInfo(status);
143
+ const tagsHtml = item.tags && item.tags.length > 0
144
+ ? item.tags.map((tag) => `<span class="tag-badge tag-workspace">${escapeHtml(tag)}</span>`).join('')
145
+ : '';
146
+ const headerMeta = html `<span ${ATTR_DATA_DATE}="${item.date}">${displayDate}</span> • Decision Record by ${author}`;
147
+ const cardContent = html `
148
+ <div class="item-content">
149
+ <div class="item-meta">${headerMeta}</div>
150
+ <h3 class="item-title">
151
+ <span class="${statusBadgeClass} adr-status-badge">${statusIcon} ${status}</span>
152
+ ${adrId}: ${title}
153
+ </h3>
154
+ <div class="item-summary">${decisionHtml}</div>
155
+ <div class="tags-wrapper">
156
+ <span class="tag-badge adr-indicator-badge">ADR</span>
157
+ ${tagsHtml}
158
+ </div>
159
+ </div>
160
+ `;
161
+ return html `
162
+ <div class="timeline-item">
163
+ <a class="timeline-card timeline-card--adr" href="${escapeHtml(adrUrl)}">
164
+ ${cardContent}
165
+ <span class="item-arrow">›</span>
166
+ </a>
167
+ </div>
168
+ `;
169
+ };
91
170
  export const paginationLinks = (currentPage, totalPages) => {
92
171
  let links = '';
93
172
  if (currentPage > 1) {
@@ -100,3 +179,4 @@ export const paginationLinks = (currentPage, totalPages) => {
100
179
  }
101
180
  return links ? `<nav class="pagination-nav">${links}</nav>` : '';
102
181
  };
182
+ //# sourceMappingURL=template-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-helpers.js","sourceRoot":"","sources":["../../src/lib/template-helpers.ts"],"names":[],"mappings":"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"}
@@ -22,18 +22,45 @@ export interface TimelineTemplateProps {
22
22
  repositoryUrl?: string;
23
23
  currentPage?: number;
24
24
  totalPages?: number;
25
+ researchEntries?: TimelineResearchItem[];
26
+ adrItems?: TimelineAdrItem[];
27
+ customTabs?: {
28
+ id: string;
29
+ title: string;
30
+ items: TimelineResearchItem[];
31
+ }[];
32
+ }
33
+ export interface TimelineResearchItem extends TimelineEntry {
34
+ status: string;
35
+ updated: string;
25
36
  }
26
- /**
27
- * Configuration for a month group in the timeline
28
- */
29
37
  export interface TimelineGroup {
30
38
  month: string;
31
39
  items: TimelineItem[];
32
40
  }
33
41
  /**
34
- * A timeline item is either a logbook entry card, a git commit, or a git tag.
42
+ * A timeline item is either a logbook entry card, a git commit, a git tag, or an ADR.
35
43
  */
36
- export type TimelineItem = TimelineEntry | TimelineCommitItem | TimelineTagItem;
44
+ export type TimelineItem = TimelineEntry | TimelineCommitItem | TimelineTagItem | TimelineAdrItem;
45
+ /**
46
+ * An ADR decision record shown on the timeline.
47
+ */
48
+ export interface TimelineAdrItem {
49
+ kind: 'adr';
50
+ id: number;
51
+ filepath: string;
52
+ title: string;
53
+ status: string;
54
+ date: string;
55
+ displayDate: string;
56
+ author: string;
57
+ superseded_by?: number | null;
58
+ tags?: string[];
59
+ decision: string;
60
+ decisionHtml?: string;
61
+ monthGroup: string;
62
+ sortTime: string;
63
+ }
37
64
  /**
38
65
  * Configuration for a timeline entry
39
66
  */
@@ -53,6 +80,10 @@ export interface TimelineEntry {
53
80
  summary: string;
54
81
  tags?: string[];
55
82
  workspaces?: string[];
83
+ teaserImage?: {
84
+ src: string;
85
+ ratio: number;
86
+ };
56
87
  }
57
88
  /**
58
89
  * A standalone git commit shown as a non-clickable info item in the timeline.
@@ -109,6 +140,7 @@ export interface PostTemplateProps {
109
140
  slug?: string;
110
141
  tags?: string[];
111
142
  workspaces?: string[];
143
+ backLink?: string;
112
144
  }
113
145
  /**
114
146
  * Configuration for navigation between entries
@@ -1 +1,2 @@
1
1
  export {};
2
+ //# sourceMappingURL=template-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-types.js","sourceRoot":"","sources":["../../src/lib/template-types.ts"],"names":[],"mappings":""}
@@ -1,6 +1,10 @@
1
- import type { TabConfig, TimelineTemplateProps, PostTemplateProps } from './template-types.js';
2
- export declare const tabsComponent: (tabs: TabConfig[], defaultActive?: number) => string;
3
- export declare const layout: ({ title, header, content, projectName, basePath, description, bodySlug, buildMeta, includeRssLink, }: {
1
+ import type { TabConfig, TimelineTemplateProps } from './template-types.js';
2
+ export { postTemplate } from './post-template.js';
3
+ export declare const tabsComponent: (tabs: TabConfig[], defaultActive?: number) => {
4
+ tabsHtml: string;
5
+ sectionsHtml: string;
6
+ };
7
+ interface LayoutProps {
4
8
  title: string;
5
9
  header: string;
6
10
  content: string;
@@ -10,14 +14,13 @@ export declare const layout: ({ title, header, content, projectName, basePath, d
10
14
  bodySlug?: string;
11
15
  buildMeta?: string;
12
16
  includeRssLink?: boolean;
13
- }) => string;
17
+ prevUrl?: string;
18
+ nextUrl?: string;
19
+ }
20
+ export declare const layout: ({ title, header, content, projectName, basePath, description, bodySlug, buildMeta, includeRssLink, prevUrl, nextUrl, }: LayoutProps) => string;
14
21
  export declare const timelineTemplate: (props: TimelineTemplateProps & {
15
22
  includeRssLink?: boolean;
16
23
  }) => {
17
24
  header: string;
18
25
  content: string;
19
26
  };
20
- export declare const postTemplate: (props: PostTemplateProps) => {
21
- header: string;
22
- content: string;
23
- };