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,13 +1,14 @@
1
1
  import fs from 'fs-extra';
2
2
  import { join } from 'node:path';
3
3
  import { createInterface } from 'node:readline';
4
- import { getConfig, getLogbookDirPath } from '../lib/config.js';
4
+ import { getConfig, getLogbookDirPath, getResearchDirPath } from '../lib/config.js';
5
5
  import { getEntryPath } from '../lib/entry-paths.js';
6
6
  import { getTemplatesDir } from '../lib/migrations.js';
7
7
  import { header, warning as warningStyle, highlight, errorMessage, successMessage, warningMessage, } from '../lib/theme.js';
8
8
  import { getPackageVersion } from '../lib/package-version.js';
9
9
  import { parseTicketId, getNextId } from '../utils/id.js';
10
10
  import { sanitiseSlug } from '../utils/slug.js';
11
+ import { getCurrentBranch } from '../lib/git-helpers.js';
11
12
  const rl = createInterface({
12
13
  input: process.stdin,
13
14
  output: process.stdout,
@@ -19,67 +20,72 @@ const question = (prompt) => {
19
20
  });
20
21
  });
21
22
  };
22
- export async function createNewEntry(id, slug) {
23
+ export async function createNewEntry(id, slug, options) {
23
24
  const config = getConfig();
24
- const logbookDir = getLogbookDirPath(config);
25
- if (!(await fs.pathExists(logbookDir))) {
26
- await fs.mkdirp(logbookDir);
25
+ const isResearch = !!options?.research;
26
+ const customTypeName = options?.type;
27
+ const customType = customTypeName && config.customTypes?.[customTypeName];
28
+ if (customTypeName && !customType) {
29
+ console.error(errorMessage('Error', `Custom type "${customTypeName}" is not defined in .project-logbook config.`));
30
+ process.exit(1);
31
+ }
32
+ const targetDir = customType
33
+ ? join(process.cwd(), customType.dir)
34
+ : isResearch
35
+ ? getResearchDirPath(config) || join(process.cwd(), 'docs/research')
36
+ : getLogbookDirPath(config);
37
+ if (!(await fs.pathExists(targetDir))) {
38
+ await fs.mkdirp(targetDir);
27
39
  }
28
40
  let entryId = id;
29
41
  let entrySlug = slug;
42
+ // Autodetect ID from the current Git branch if not provided
43
+ if (!entryId) {
44
+ const branchName = getCurrentBranch();
45
+ if (branchName) {
46
+ const prefix = customType ? customType.prefix : isResearch ? 'RES' : config.jiraPrefix || 'LB';
47
+ const branchRegex = new RegExp(`(?:^|[/\\-_])(${prefix})-(\\d+)(?:-|$)`, 'i');
48
+ const match = branchName.match(branchRegex);
49
+ if (match) {
50
+ entryId = `${match[1].toUpperCase()}-${match[2]}`;
51
+ console.log(highlight(`Autodetected ID ${entryId} from Git branch '${branchName}'.`));
52
+ }
53
+ }
54
+ }
55
+ let originalTitle = '';
56
+ const typeDisplayName = customType ? customTypeName : isResearch ? 'research' : 'logbook';
30
57
  // Interactive mode if no parameters provided
31
58
  if (!entryId || !entrySlug) {
32
- console.log(header('\n📝 Creating a new logbook entry (interactive mode)\n'));
33
- // Determine if we have a jiraPrefix configured
34
- const hasJiraPrefix = !!config.jiraPrefix;
59
+ console.log(header(`\n📝 Creating a new ${typeDisplayName} entry (interactive mode)\n`));
35
60
  if (!entryId) {
36
- if (hasJiraPrefix) {
37
- // Auto-generate ID based on jiraPrefix
38
- const nextId = getNextId(logbookDir, config.jiraPrefix);
39
- const input = await question(highlight(`Enter entry ID (e.g. ${nextId}, press Enter for auto-generated): `));
40
- if (input) {
41
- const parsed = parseTicketId(input);
42
- const bareNumber = /^\d+$/.test(input) ? parseInt(input, 10) : null;
43
- if (parsed && parsed.prefix.toUpperCase() !== config.jiraPrefix?.toUpperCase()) {
44
- console.warn(warningStyle(`Warning: Prefix '${parsed.prefix}' doesn't match configured '${config.jiraPrefix}'. Using configured prefix.`));
45
- entryId = `${config.jiraPrefix}-${parsed.number}`;
46
- }
47
- else if (parsed) {
48
- entryId = input.toUpperCase();
49
- }
50
- else if (bareNumber !== null) {
51
- entryId = `${config.jiraPrefix}-${bareNumber}`;
52
- }
53
- else {
54
- console.warn(warningStyle('Invalid ID format. Using auto-generated ID.'));
55
- entryId = nextId;
56
- }
61
+ const prefix = customType ? customType.prefix : isResearch ? 'RES' : config.jiraPrefix || 'LB';
62
+ const nextId = getNextId(targetDir, prefix);
63
+ const input = await question(highlight(`Enter entry ID (e.g. ${nextId}, press Enter for auto-generated): `));
64
+ if (input) {
65
+ const parsed = parseTicketId(input);
66
+ const bareNumber = /^\d+$/.test(input) ? parseInt(input, 10) : null;
67
+ if (parsed &&
68
+ !isResearch &&
69
+ !customType &&
70
+ config.jiraPrefix &&
71
+ parsed.prefix.toUpperCase() !== config.jiraPrefix.toUpperCase()) {
72
+ console.warn(warningStyle(`Warning: Prefix '${parsed.prefix}' doesn't match configured '${config.jiraPrefix}'. Using configured prefix.`));
73
+ entryId = `${config.jiraPrefix}-${parsed.number}`;
57
74
  }
58
- else {
59
- entryId = nextId;
75
+ else if (parsed) {
76
+ entryId = input.toUpperCase();
60
77
  }
61
- }
62
- else {
63
- const nextId = getNextId(logbookDir, 'LB');
64
- const input = await question(highlight(`Enter entry ID (e.g. ${nextId}, press Enter for auto-generated): `));
65
- if (input) {
66
- const parsed = parseTicketId(input);
67
- const bareNumber = /^\d+$/.test(input) ? parseInt(input, 10) : null;
68
- if (parsed) {
69
- entryId = input.toUpperCase();
70
- }
71
- else if (bareNumber !== null) {
72
- entryId = `LB-${bareNumber}`;
73
- }
74
- else {
75
- console.warn(warningStyle('Invalid ID format. Using auto-generated ID.'));
76
- entryId = nextId;
77
- }
78
+ else if (bareNumber !== null) {
79
+ entryId = `${prefix}-${bareNumber}`;
78
80
  }
79
81
  else {
82
+ console.warn(warningStyle('Invalid ID format. Using auto-generated ID.'));
80
83
  entryId = nextId;
81
84
  }
82
85
  }
86
+ else {
87
+ entryId = nextId;
88
+ }
83
89
  }
84
90
  if (!entrySlug) {
85
91
  const input = await question(highlight('Enter a short title (will be converted to slug): '));
@@ -87,11 +93,16 @@ export async function createNewEntry(id, slug) {
87
93
  console.error(errorMessage('Error', 'Title is required.'));
88
94
  process.exit(1);
89
95
  }
96
+ originalTitle = input;
90
97
  entrySlug = sanitiseSlug(input);
91
98
  }
99
+ else {
100
+ originalTitle = entrySlug;
101
+ }
92
102
  rl.close();
93
103
  }
94
104
  else {
105
+ originalTitle = entrySlug;
95
106
  rl.close();
96
107
  }
97
108
  // Sanitise slug
@@ -100,7 +111,7 @@ export async function createNewEntry(id, slug) {
100
111
  console.warn(warningMessage('Notice', `Slug normalised from '${entrySlug}' to '${sanitised}'.`));
101
112
  entrySlug = sanitised;
102
113
  }
103
- const entryDir = getEntryPath(getLogbookDirPath(config), `${entryId}-${entrySlug}`);
114
+ const entryDir = getEntryPath(targetDir, `${entryId}-${entrySlug}`);
104
115
  if (await fs.pathExists(entryDir)) {
105
116
  console.error(errorMessage('Error', `Entry ${entryId}-${entrySlug} already exists.`));
106
117
  process.exit(1);
@@ -111,7 +122,7 @@ export async function createNewEntry(id, slug) {
111
122
  const replacements = {
112
123
  id: entryId,
113
124
  slug: entrySlug,
114
- title: entrySlug.replace(/-/g, ' '),
125
+ title: originalTitle,
115
126
  date: now.toISOString().split('T')[0],
116
127
  time: now.toLocaleTimeString('en-GB', { hour: '2-digit', minute: '2-digit', second: '2-digit' }),
117
128
  fullIso: now.toISOString(),
@@ -127,8 +138,18 @@ export async function createNewEntry(id, slug) {
127
138
  const fillTemplate = (template) => {
128
139
  return template.replace(/{{(\w+)}}/g, (_, key) => replacements[key] || `{{${key}}}`);
129
140
  };
130
- await fs.writeFile(join(entryDir, 'index.md'), fillTemplate(getTemplate('index.md')));
141
+ let indexTemplate = getTemplate('index.md');
142
+ if (isResearch || customType) {
143
+ indexTemplate = indexTemplate.replace('dateEnd: "[DATE_END]"', 'dateEnd: "[DATE_END]"\nstatus: active\nupdated: {{fullIso}}');
144
+ }
145
+ await fs.writeFile(join(entryDir, 'index.md'), fillTemplate(indexTemplate));
131
146
  await fs.writeFile(join(entryDir, 'ticket.md'), fillTemplate(getTemplate('ticket.md')));
132
147
  await fs.writeFile(join(entryDir, 'log.md'), fillTemplate(getTemplate('log.md')));
133
- console.log(successMessage('Created', `logbook entry in ${config.logbookDir}/${entryId}-${entrySlug}/`));
148
+ const relativeDestDir = customType
149
+ ? customType.dir
150
+ : isResearch
151
+ ? config.researchDir || 'docs/research'
152
+ : config.logbookDir;
153
+ console.log(successMessage('Created', `${typeDisplayName} entry in ${relativeDestDir}/${entryId}-${entrySlug}/`));
134
154
  }
155
+ //# sourceMappingURL=new.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"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"}
@@ -18,3 +18,4 @@ export async function preview() {
18
18
  }
19
19
  });
20
20
  }
21
+ //# sourceMappingURL=preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAEhD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC,CAAC;IAC1D,MAAM,KAAK,EAAE,CAAC;IAEd,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,oBAAoB,SAAS,EAAE,CAAC,CAAC,CAAC;IAErD,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;IAE3G,qEAAqE;IACrE,QAAQ,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE;QACnC,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,2BAA2B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -16,7 +16,7 @@ export async function release(options = {}) {
16
16
  const releasedAt = new Date().toISOString();
17
17
  // Inject dateEnd into index.md frontmatter
18
18
  const config = getConfig();
19
- const entryDir = join(cwd, config.logbookDir, active.slug);
19
+ const entryDir = active.path || join(cwd, config.logbookDir, active.slug);
20
20
  const indexPath = join(entryDir, 'index.md');
21
21
  if (await fs.pathExists(indexPath)) {
22
22
  let raw = await fs.readFile(indexPath, 'utf8');
@@ -64,3 +64,4 @@ function formatElapsed(from, to) {
64
64
  return `${m}m ${s}s`;
65
65
  return `${s}s`;
66
66
  }
67
+ //# sourceMappingURL=release.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release.js","sourceRoot":"","sources":["../../src/commands/release.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- export declare function start(id: string): Promise<void>;
1
+ export declare function start(id: string, cwd?: string): Promise<void>;
@@ -5,7 +5,7 @@ import { error as errorStyle, warning as warningStyle, neutral, header, successM
5
5
  import matter from 'gray-matter';
6
6
  import { getConfig, getLogbookDirPath } from '../lib/config.js';
7
7
  import { getActiveEntry } from '../lib/session.js';
8
- import { getEntryPath } from '../lib/entry-paths.js';
8
+ import { getLogbookEntries } from '../utils/fs.js';
9
9
  import { LOCKFILE_NAME } from '../lib/lockfile.js';
10
10
  function getGitUsername() {
11
11
  try {
@@ -17,8 +17,7 @@ function getGitUsername() {
17
17
  return undefined;
18
18
  }
19
19
  }
20
- export async function start(id) {
21
- const cwd = process.cwd();
20
+ export async function start(id, cwd = process.cwd()) {
22
21
  const lockfilePath = join(cwd, LOCKFILE_NAME);
23
22
  // 1. Enforce single active entry
24
23
  if (await fs.pathExists(lockfilePath)) {
@@ -27,23 +26,83 @@ export async function start(id) {
27
26
  console.error(errorStyle(`Run 'logbook release' before starting a new entry.`));
28
27
  process.exit(1);
29
28
  }
30
- // 2. Resolve folder by ID prefix (e.g. "LB-5" → "LB-5-jira-support")
29
+ // 2. Resolve folder by ID prefix or exact match
31
30
  const config = getConfig();
32
- // If a bare number is given (e.g. "19"), auto-prepend the configured jiraPrefix
33
- const resolvedId = /^\d+$/.test(id) && config.jiraPrefix ? `${config.jiraPrefix}-${id}` : id;
31
+ // If a bare or suffixed number is given (e.g. "20-fix"), auto-prepend the configured jiraPrefix
32
+ const resolvedId = /^\d+(?:-.*)?$/.test(id) && config.jiraPrefix ? `${config.jiraPrefix}-${id}` : id;
34
33
  const logbookDir = getLogbookDirPath(config, cwd);
35
- const allDirs = await fs.readdir(logbookDir);
36
- const matchingDir = allDirs.find((d) => {
37
- const prefix = d.split('-').slice(0, resolvedId.split('-').length).join('-');
38
- return prefix.toLowerCase() === resolvedId.toLowerCase();
39
- });
40
- if (!matchingDir) {
41
- console.error(errorStyle(`Error: No entry found matching ID '${resolvedId}' in ${config.logbookDir}/.`));
34
+ const logbookEntries = await getLogbookEntries(logbookDir);
35
+ if (config.researchDir) {
36
+ const researchDir = join(cwd, config.researchDir);
37
+ if (await fs.pathExists(researchDir)) {
38
+ const resEntries = await getLogbookEntries(researchDir);
39
+ logbookEntries.push(...resEntries);
40
+ }
41
+ }
42
+ if (config.customTypes) {
43
+ for (const typeConfig of Object.values(config.customTypes)) {
44
+ if (typeConfig.dir) {
45
+ const typeDir = join(cwd, typeConfig.dir);
46
+ if (await fs.pathExists(typeDir)) {
47
+ const customEntries = await getLogbookEntries(typeDir);
48
+ logbookEntries.push(...customEntries);
49
+ }
50
+ }
51
+ }
52
+ }
53
+ let slug;
54
+ let entryDir;
55
+ // 2a. Direct folder name match bypasses all other logic
56
+ const exactSlugMatch = logbookEntries.find((e) => e.slug.toLowerCase() === id.toLowerCase());
57
+ if (exactSlugMatch) {
58
+ slug = exactSlugMatch.slug;
59
+ entryDir = exactSlugMatch.path;
60
+ }
61
+ else {
62
+ // 2b. Query all logbook entries for frontmatter and folder structure
63
+ // First Pass: Exact Ticket ID Match in Frontmatter
64
+ const exactTicketMatches = logbookEntries.filter((e) => {
65
+ const ticket = typeof e.data?.ticket === 'string' ? e.data.ticket.trim().toLowerCase() : '';
66
+ return ticket === resolvedId.toLowerCase();
67
+ });
68
+ if (exactTicketMatches.length === 1) {
69
+ slug = exactTicketMatches[0].slug;
70
+ entryDir = exactTicketMatches[0].path;
71
+ }
72
+ else if (exactTicketMatches.length > 1) {
73
+ console.error(errorStyle(`Error: Multiple entries found with the exact same ticket ID '${resolvedId}'.`));
74
+ console.error(errorStyle(`Please specify the unique folder name/slug directly instead:`));
75
+ for (const match of exactTicketMatches) {
76
+ console.error(errorStyle(` logbook start ${match.slug}`));
77
+ }
78
+ process.exit(1);
79
+ }
80
+ else {
81
+ // Second Pass: Fallback Prefix Match on Folder Names
82
+ const prefixMatches = logbookEntries.filter((e) => {
83
+ const prefix = e.slug.split('-').slice(0, resolvedId.split('-').length).join('-');
84
+ return prefix.toLowerCase() === resolvedId.toLowerCase();
85
+ });
86
+ if (prefixMatches.length === 1) {
87
+ slug = prefixMatches[0].slug;
88
+ entryDir = prefixMatches[0].path;
89
+ }
90
+ else if (prefixMatches.length > 1) {
91
+ console.error(errorStyle(`Error: Multiple entries found matching prefix '${resolvedId}'.`));
92
+ console.error(errorStyle(`Please be more specific. Run one of:`));
93
+ for (const match of prefixMatches) {
94
+ const ticketId = typeof match.data?.ticket === 'string' ? match.data.ticket : match.slug;
95
+ console.error(errorStyle(` logbook start ${ticketId}`));
96
+ }
97
+ process.exit(1);
98
+ }
99
+ }
100
+ }
101
+ if (!slug || !entryDir) {
102
+ console.error(errorStyle(`Error: No entry found matching ID '${resolvedId}' in logbook or research directories.`));
42
103
  console.error(errorStyle(`Run 'logbook new <id> <slug>' to create it first.`));
43
104
  process.exit(1);
44
105
  }
45
- const slug = matchingDir;
46
- const entryDir = getEntryPath(logbookDir, slug);
47
106
  // Warn if branch-resolved entry is different
48
107
  const activeFromBranch = await getActiveEntry({}, cwd);
49
108
  if (activeFromBranch && activeFromBranch.source === 'branch' && activeFromBranch.slug !== slug) {
@@ -75,7 +134,7 @@ export async function start(id) {
75
134
  raw = raw.replace('prompter: "[PROMPTER]"', `prompter: '${prompter.replace(/'/g, "''")}'`);
76
135
  }
77
136
  else if (!parsed.data.prompter) {
78
- raw = raw.replace(/^(---\n[\s\S]*?)(^---$)/m, (_, frontmatter, closing) => {
137
+ raw = raw.replace(/^(---\r?\n[\s\S]*?)(^---\r?$)/m, (_, frontmatter, closing) => {
79
138
  if (frontmatter.includes('prompter:'))
80
139
  return _;
81
140
  return `${frontmatter}prompter: '${prompter.replace(/'/g, "''")}'\n${closing}`;
@@ -90,3 +149,4 @@ export async function start(id) {
90
149
  }
91
150
  console.log(neutral(`Lockfile written to ${LOCKFILE_NAME}. Run 'logbook release' when done.`));
92
151
  }
152
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
@@ -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,12 @@ 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
+ }
105
+ if (config.researchDir) {
106
+ console.log(` ${bold('Research Directory:')}${config.researchDir}`);
107
+ }
117
108
  console.log(` ${bold('Primary Color:')} ${config.primaryColor}`);
118
109
  if (config.jiraBaseUrl) {
119
110
  console.log(` ${bold('Jira Base URL:')} ${config.jiraBaseUrl}`);
@@ -122,7 +113,7 @@ export async function status() {
122
113
  console.log(` ${bold('Jira Prefix:')} ${config.jiraPrefix}`);
123
114
  }
124
115
  if (config.repositoryUrl) {
125
- console.log(` ${bold('Repository URL:')} ${config.repositoryUrl}`);
116
+ console.log(` ${bold('Repository URL:')} ${config.repositoryUrl}`);
126
117
  }
127
118
  if (config.tags?.allowed) {
128
119
  console.log(` ${bold('Allowed Tags:')} ${config.tags.allowed.join(', ')}`);
@@ -136,3 +127,4 @@ export async function status() {
136
127
  console.log(` ${bold('Latest Entry:')} ${latestText}`);
137
128
  console.log('');
138
129
  }
130
+ //# 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
@@ -13,9 +13,11 @@ program
13
13
  program
14
14
  .command('new [id] [slug]')
15
15
  .description('Create a new logbook entry (with optional id and slug, or use interactive mode)')
16
- .action(async (id, slug) => {
16
+ .option('-r, --research', 'Create a research log entry instead of a standard logbook entry')
17
+ .option('-t, --type <type>', 'Create a custom configured entry type (e.g. --type analyses)')
18
+ .action(async (id, slug, options) => {
17
19
  const { createNewEntry } = await import('./commands/new.js');
18
- await createNewEntry(id, slug);
20
+ await createNewEntry(id, slug, options);
19
21
  });
20
22
  program
21
23
  .command('lint')
@@ -78,10 +80,9 @@ program
78
80
  program
79
81
  .command('log <message>')
80
82
  .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) => {
83
+ .action(async (message) => {
83
84
  const { log } = await import('./commands/log.js');
84
- await log([message], options);
85
+ await log([message]);
85
86
  });
86
87
  program
87
88
  .command('steer')
@@ -91,3 +92,4 @@ program
91
92
  await steer();
92
93
  });
93
94
  program.parse();
95
+ //# 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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"}