project-logbook 0.4.1 → 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 (146) hide show
  1. package/README.md +36 -1
  2. package/dist/commands/build.js +32 -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 +16 -2
  38. package/dist/lib/build-steps.js +95 -18
  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 +21 -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 +39 -26
  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/index.md +2 -1
  120. package/dist/templates/styles.css +139 -32
  121. package/dist/utils/date.js +1 -0
  122. package/dist/utils/date.js.map +1 -0
  123. package/dist/utils/frontmatter.d.ts +9 -0
  124. package/dist/utils/frontmatter.js +16 -0
  125. package/dist/utils/frontmatter.js.map +1 -0
  126. package/dist/utils/fs.d.ts +10 -0
  127. package/dist/utils/fs.js +112 -0
  128. package/dist/utils/fs.js.map +1 -0
  129. package/dist/utils/id.js +1 -0
  130. package/dist/utils/id.js.map +1 -0
  131. package/dist/utils/log-timeline.d.ts +2 -1
  132. package/dist/utils/log-timeline.js +1 -0
  133. package/dist/utils/log-timeline.js.map +1 -0
  134. package/dist/utils/slug.js +1 -0
  135. package/dist/utils/slug.js.map +1 -0
  136. package/dist/utils/string.js +1 -0
  137. package/dist/utils/string.js.map +1 -0
  138. package/dist/utils/timeline-helpers.d.ts +2 -2
  139. package/dist/utils/timeline-helpers.js +5 -2
  140. package/dist/utils/timeline-helpers.js.map +1 -0
  141. package/dist/utils/validation.d.ts +5 -0
  142. package/dist/utils/validation.js +21 -0
  143. package/dist/utils/validation.js.map +1 -0
  144. package/package.json +10 -4
  145. package/src/templates/index.md +2 -1
  146. package/src/templates/styles.css +139 -32
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  ![Screenshot of generated website](/static/screenshot.jpg "Generated website")
8
8
 
9
- See [CONTRIBUTING.md](CONTRIBUTING.md) for the mandatory working protocol.
9
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for the mandatory working protocol. (Or read this [unauthorized, cynical review](review-article-project-logbook.md) — also available in [German](review-article-project-logbook-de.md) — about how this project got dragged and saved.)
10
10
 
11
11
 
12
12
  ## The Three-File Standard
@@ -20,6 +20,8 @@ Each entry in `logbook/` consists of:
20
20
  npm i project-logbook -g
21
21
  ```
22
22
 
23
+ You can run the CLI using either `logbook` or the shortcut alias `lb`. For example, `lb status` works as a drop-in replacement for `logbook status`.
24
+
23
25
  ## Commands
24
26
 
25
27
  | Command | Description |
@@ -30,8 +32,41 @@ npm i project-logbook -g
30
32
  | `logbook release` | Release the active logbook entry (removes `.logbook-active` lockfile). |
31
33
  | `logbook log <message>` | Append a timestamped log entry to the active `log.md`. |
32
34
  | `logbook list` | List all logbook entries with their status. |
35
+ | `logbook status` | Show current active logbook task, configuration settings, and statistics. |
33
36
  | `logbook lint` | Validate structure, frontmatter, and internal links. |
34
37
  | `logbook build` | Compile logbook entries into a static HTML site (default: `public/`). |
35
38
  | `logbook preview` | Build and open the logbook in your default browser. |
36
39
  | `logbook upgrade` | Synchronize core project files (like `CONTRIBUTING.md`) with latest templates. |
37
40
  | `logbook steer` | Output agentic protocol for AI assistants. |
41
+
42
+
43
+ ## Configuration
44
+
45
+ Running `logbook init` creates a `.project-logbook` configuration file in your project root. You can customize the following properties:
46
+
47
+ | Key | Type | Default | Description |
48
+ |---|---|---|---|
49
+ | `projectName` | `string` | `"My Project"` | Title shown on the generated static website. |
50
+ | `logbookDir` | `string` | `"logbook"` | The directory where logbook entries are located. |
51
+ | `outputDir` | `string` | `"dist/logbook"` | The output directory where the compiled website is built. |
52
+ | `adrDir` | `string` | `"docs/adr"` | The directory where Architecture Decision Records (ADRs) are located. Set to `null` or omit to disable ADR integration. |
53
+ | `primaryColor` | `string` | `"#2563eb"` | The theme's accent color (CSS variable `--primary`). Must be a hex code. |
54
+ | `jiraBaseUrl` | `string` | `undefined` | Optional base URL of your Jira workspace (e.g. `https://myorg.atlassian.net/browse/`). Enables clickable Jira link buttons. |
55
+ | `jiraPrefix` | `string` | `undefined` | Optional Jira project prefix (e.g. `PROJ`) used to validate IDs and auto-link issues. |
56
+ | `repositoryUrl` | `string` | *Auto-detected* | Optional base web URL of your Git repository (e.g. `https://github.com/org/repo`). Automatically falls back to parsing your git remote URL if not specified. |
57
+ | `tags` | `object` | See below | Optional configuration for categorization tags. |
58
+
59
+ ### Tags Configuration Example
60
+
61
+ ```json
62
+ {
63
+ "projectName": "My API Gateway",
64
+ "primaryColor": "#0f766e",
65
+ "jiraBaseUrl": "https://mycompany.atlassian.net/browse/",
66
+ "jiraPrefix": "GW",
67
+ "tags": {
68
+ "allowed": ["#bugfix", "#feature", "#refactor", "#security", "#performance"]
69
+ }
70
+ }
71
+ ```
72
+
@@ -1,19 +1,18 @@
1
1
  import fs from 'fs-extra';
2
2
  import { join } from 'node:path';
3
3
  import { error, neutral, success } from '../lib/theme.js';
4
- import { getConfig, getWorkspaces, getLogbookDirPath, getOutputDirPath } from '../lib/config.js';
4
+ import { getConfig, getWorkspaces, getLogbookDirPath, getOutputDirPath, getAdrDirPath } from '../lib/config.js';
5
+ import { getActiveEntry } from '../lib/session.js';
5
6
  import { layout, timelineTemplate } from '../lib/templates.js';
6
- import { buildProjectMdFiles, renderPost, generateBuildMeta } from '../lib/build-helpers.js';
7
+ import { buildProjectMdFiles, renderPost, generateBuildMeta, mdToHtml } from '../lib/build-helpers.js';
7
8
  import { getGitCommits, getGitTags } from '../lib/git-helpers.js';
8
- import { setupOutputDirectory, processReadme, copyReadmeImages, processAboutContent, processWelcomeContent, } from '../lib/build-steps.js';
9
+ import { setupOutputDirectory, processReadme, copyReadmeImages, processAboutContent, processWelcomeContent, buildRssFeed, processTimelineEntries, } from '../lib/build-steps.js';
10
+ import { renderAdr } from '../lib/adr-renderer.js';
9
11
  import { formatAbsoluteDate, getMonthYear, getSortTime, formatDateTimeForDisplay } from '../utils/date.js';
10
- import { getLogbookEntries } from '../utils/fs.js';
11
- import { toDisplayString, asString, asStringArray } from '../utils/frontmatter.js';
12
+ import { getLogbookEntries, getAdrEntries } from '../utils/fs.js';
12
13
  import { getAboutContent } from '../lib/about-content.js';
13
14
  import { getPackageVersion } from '../lib/package-version.js';
14
15
  import { groupTimelineItems } from '../utils/timeline-helpers.js';
15
- import { getEntryDisplayId, getEntryDisplayTitle } from '../lib/entry-id.js';
16
- import { generateRssFeed, validateRssXml } from '../lib/rss.js';
17
16
  const version = getPackageVersion();
18
17
  export async function build() {
19
18
  const config = getConfig();
@@ -22,7 +21,7 @@ export async function build() {
22
21
  const buildTime = formatDateTimeForDisplay(new Date());
23
22
  if (!(await fs.pathExists(logbookDir))) {
24
23
  console.error(error(`Error: Logbook directory '${config.logbookDir}' not found.`));
25
- return;
24
+ process.exit(1);
26
25
  }
27
26
  await setupOutputDirectory(outputDir, config);
28
27
  const projectRoot = process.cwd();
@@ -31,55 +30,17 @@ export async function build() {
31
30
  const aboutHtml = await processAboutContent(getAboutContent());
32
31
  const welcomeHtml = await processWelcomeContent();
33
32
  const logbookEntries = await getLogbookEntries(logbookDir);
34
- const timelineEntries = [];
33
+ const activeEntry = await getActiveEntry();
35
34
  const availableWorkspaces = getWorkspaces();
36
- for (const entry of logbookEntries) {
37
- if (!entry.hasIndex)
38
- continue;
39
- const { data, content, slug } = entry;
40
- let summary = data.summary;
41
- if (!summary) {
42
- const firstParagraph = content.split('\n\n').find((p) => p.trim() && !p.trim().startsWith('#'));
43
- summary = firstParagraph
44
- ? firstParagraph.trim().substring(0, 200).replace(/[*#`]/g, '') + '...'
45
- : 'No summary available.';
46
- }
47
- const entryWorkspaces = asStringArray(data.workspaces).filter((ws) => availableWorkspaces.includes(ws));
48
- const dateStartValue = data.dateStart;
49
- const dateStart = typeof dateStartValue === 'string'
50
- ? dateStartValue
51
- : dateStartValue instanceof Date
52
- ? dateStartValue.toISOString()
53
- : '';
54
- // Skip DRAFT entries (no valid dateStart) — they break the timeline
55
- if (!dateStart || dateStart.includes('{{') || dateStart === '[DATE_START]')
56
- continue;
57
- const dateEndValue = data.dateEnd;
58
- const dateEnd = typeof dateEndValue === 'string' && dateEndValue !== '[DATE_END]'
59
- ? dateEndValue
60
- : dateEndValue instanceof Date
61
- ? dateEndValue.toISOString()
62
- : undefined;
63
- timelineEntries.push({
64
- kind: 'entry',
65
- slug,
66
- dateStart,
67
- dateEnd,
68
- displayDate: formatAbsoluteDate(dateStart),
69
- sortTime: getSortTime(dateStart, dateEnd),
70
- summary: asString(summary, 'No summary available.') || '',
71
- ticket: getEntryDisplayId(asString(data.ticket), slug),
72
- monthGroup: getMonthYear(dateStart),
73
- tags: asStringArray(data.tags),
74
- workspaces: entryWorkspaces,
75
- title: getEntryDisplayTitle(asString(data.title), slug),
76
- harness: toDisplayString(data.harness),
77
- llm: toDisplayString(data.llm),
78
- prompter: toDisplayString(data.prompter),
79
- });
80
- }
81
- // Fetch global git commits and tags concurrently.
82
- const [globalCommits, rawTags] = await Promise.all([getGitCommits(process.cwd()), getGitTags()]);
35
+ const timelineEntries = processTimelineEntries(logbookEntries, activeEntry, availableWorkspaces);
36
+ // Fetch global git commits, tags, and ADRs concurrently.
37
+ const adrDir = getAdrDirPath(config);
38
+ const relativeAdrDir = config.adrDir || 'docs/adr';
39
+ const [globalCommits, rawTags, adrItems] = await Promise.all([
40
+ getGitCommits(process.cwd()),
41
+ getGitTags(),
42
+ adrDir ? getAdrEntries(adrDir, relativeAdrDir) : Promise.resolve([]),
43
+ ]);
83
44
  const commitItems = globalCommits.map((c) => ({
84
45
  kind: 'commit',
85
46
  sha: c.sha,
@@ -97,15 +58,20 @@ export async function build() {
97
58
  monthGroup: getMonthYear(t.timestamp),
98
59
  sortTime: getSortTime(t.timestamp),
99
60
  }));
100
- console.log(neutral(`Found ${timelineEntries.length} entr${timelineEntries.length === 1 ? 'y' : 'ies'}, ${commitItems.length} commit${commitItems.length === 1 ? '' : 's'} (max 100), and ${tagItems.length} tag${tagItems.length === 1 ? '' : 's'}.`));
61
+ console.log(neutral(`Found ${timelineEntries.length} entr${timelineEntries.length === 1 ? 'y' : 'ies'}, ${commitItems.length} commit${commitItems.length === 1 ? '' : 's'} (max 100), ${tagItems.length} tag${tagItems.length === 1 ? '' : 's'}, and ${adrItems.length} ADR${adrItems.length === 1 ? '' : 's'}.`));
101
62
  timelineEntries.sort((a, b) => {
102
63
  const aEnd = a.dateEnd ? new Date(a.dateEnd).getTime() : new Date(a.dateStart).getTime();
103
64
  const bEnd = b.dateEnd ? new Date(b.dateEnd).getTime() : new Date(b.dateStart).getTime();
104
65
  return bEnd - aEnd;
105
66
  });
106
- await Promise.all(timelineEntries.map((entry, i) => renderPost(entry, i, timelineEntries, { logbookDir, outputDir, config, version, buildTime })));
107
- // Build the full merged, chronologically sorted groups once, then paginate the flat item list.
108
- const allGroups = groupTimelineItems(timelineEntries, commitItems, tagItems);
67
+ await Promise.all([
68
+ ...timelineEntries.map((entry, i) => renderPost(entry, i, timelineEntries, { logbookDir, outputDir, config, version, buildTime })),
69
+ ...adrItems.map(async (adr) => {
70
+ adr.decisionHtml = await mdToHtml(adr.decision);
71
+ await renderAdr(adr, { adrDir: adrDir, outputDir, config, version, buildTime });
72
+ }),
73
+ ]);
74
+ const allGroups = groupTimelineItems(timelineEntries, commitItems, tagItems, adrItems);
109
75
  const flatItems = allGroups.flatMap((g) => g.items);
110
76
  const pageSize = 50;
111
77
  const totalPages = Math.max(1, Math.ceil(flatItems.length / pageSize));
@@ -139,6 +105,8 @@ export async function build() {
139
105
  includeRssLink: currentPage === 1, // Only show RSS link on first page
140
106
  }); // prettier-ignore
141
107
  const buildMeta = generateBuildMeta(version, buildTime);
108
+ const prevPageUrl = currentPage > 1 ? (currentPage === 2 ? './index.html' : `./index-${currentPage - 1}.html`) : undefined;
109
+ const nextPageUrl = currentPage < totalPages ? `./index-${currentPage + 1}.html` : undefined;
142
110
  const timelineHtml = layout({
143
111
  title: 'Timeline',
144
112
  projectName: config.projectName,
@@ -147,6 +115,8 @@ export async function build() {
147
115
  header: timelineHeader,
148
116
  content: timelineMainContent,
149
117
  includeRssLink: currentPage === 1, // Only show RSS link on first page
118
+ prevUrl: prevPageUrl,
119
+ nextUrl: nextPageUrl,
150
120
  });
151
121
  const fileName = currentPage === 1 ? 'index.html' : `index-${currentPage}.html`;
152
122
  await fs.writeFile(join(outputDir, fileName), timelineHtml);
@@ -157,21 +127,7 @@ export async function build() {
157
127
  buildTime,
158
128
  });
159
129
  // Generate RSS feed
160
- const rssConfig = {
161
- title: `${config.projectName} - Recent Updates`,
162
- description: `Latest logbook entries from ${config.projectName}`,
163
- language: 'en',
164
- feed_url: `${config.projectName.toLowerCase().replace(/\s+/g, '-')}/rss.xml`,
165
- site_url: config.projectName,
166
- generator: `Project Logbook CLI v${version}`,
167
- };
168
- const rssXml = generateRssFeed(timelineEntries, rssConfig);
169
- // Basic validation
170
- if (!validateRssXml(rssXml)) {
171
- console.error(error('Error: Generated RSS feed failed basic validation.'));
172
- return;
173
- }
174
- await fs.writeFile(join(outputDir, 'rss.xml'), rssXml);
175
- console.log(neutral(` Generated RSS feed with ${Math.min(50, timelineEntries.length)} entries`));
130
+ await buildRssFeed(outputDir, timelineEntries, config, version);
176
131
  console.log(success(`\nSuccessfully built logbook to ${config.outputDir}/`));
177
132
  }
133
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
@@ -81,3 +81,4 @@ export async function init() {
81
81
  console.log(info('\n💡 Tip: Edit .project-logbook to customize primaryColor, add more tags, or configure Jira settings.'));
82
82
  console.log(info(' Run `logbook new` to create your first entry.\n'));
83
83
  }
84
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import fs from 'fs-extra';
2
2
  import { join } from 'node:path';
3
- import { error as errorStyle, header, success as successStyle, neutral as neutralStyle } from '../lib/theme.js';
3
+ import { error as errorStyle, header, success as successStyle, neutral as neutralStyle, warning as warningStyle, } from '../lib/theme.js';
4
4
  import { getConfig, getLogbookDirPath } from '../lib/config.js';
5
5
  import { runLinters } from '../lib/lint-runner.js';
6
6
  import { getLogbookEntries } from '../utils/fs.js';
@@ -11,7 +11,7 @@ export async function lint() {
11
11
  const logbookDir = getLogbookDirPath(config);
12
12
  if (!(await fs.pathExists(logbookDir))) {
13
13
  console.error(errorStyle(`Error: Logbook directory '${config.logbookDir}' not found.`));
14
- return;
14
+ process.exit(1);
15
15
  }
16
16
  let overallSuccess = true;
17
17
  // Show last log entry nudge if an entry is active
@@ -46,6 +46,10 @@ export async function lint() {
46
46
  }
47
47
  if (isDraft(entry)) {
48
48
  skippedCount++;
49
+ if (active && active.slug === entry.slug) {
50
+ console.log(warningStyle(`\n [SKIPPED] Active entry '${entry.slug}' is a draft (missing valid dateStart).`));
51
+ console.log(warningStyle(` → Run 'logbook start ${entry.slug.split('-')[0]}' to activate it, which sets dateStart and enables linting.\n`));
52
+ }
49
53
  continue;
50
54
  }
51
55
  const entrySuccess = await runLinters({
@@ -85,3 +89,4 @@ function isDraft(entry) {
85
89
  // 2. OR the string representation of 'dateStart' is '[DATE_START]'.
86
90
  return !frontmatter?.dateStart || String(frontmatter.dateStart) === '[DATE_START]';
87
91
  }
92
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import fs from 'fs-extra';
2
2
  import { getConfig, getLogbookDirPath } from '../lib/config.js';
3
3
  import { getLogbookEntries } from '../utils/fs.js';
4
+ import { hasUnfilledPlaceholders } from '../utils/validation.js';
4
5
  import { stripAnsi } from '../utils/string.js';
5
6
  import { parseTicketId } from '../utils/id.js';
6
7
  import { getActiveEntry } from '../lib/session.js';
@@ -41,23 +42,9 @@ export async function list(options = {}) {
41
42
  });
42
43
  continue;
43
44
  }
44
- const { data, content } = entry;
45
+ const { data } = entry;
45
46
  const isActive = activeSlug === entry.slug;
46
- // Check frontmatter field values for bracket-style unfilled placeholders
47
- const dataValues = Object.values(data)
48
- .filter((v) => typeof v === 'string')
49
- .join('\n');
50
- const frontmatterHasPlaceholders = dataValues.includes('[DATE_END]') ||
51
- dataValues.includes('[DATE_START]') ||
52
- dataValues.includes('[WRITE_SUMMARY_HERE]') ||
53
- dataValues.includes('[PROMPTER]') ||
54
- dataValues.includes('[HARNESS]') ||
55
- dataValues.includes('[LLM]');
56
- // Check body content for unfilled template hints (strip inline code spans to avoid false positives)
57
- const contentWithoutCode = content.replace(/`[^`]*`/g, '');
58
- const bodyHasPlaceholders = contentWithoutCode.includes('TODO:') ||
59
- content.includes('Write a polished, highly readable "short story" of the change here.');
60
- const hasPlaceholders = frontmatterHasPlaceholders || bodyHasPlaceholders;
47
+ const hasPlaceholders = hasUnfilledPlaceholders(entry);
61
48
  const status = isActive ? highlight('● ACTIVE') : hasPlaceholders ? warning('DRAFT') : success('DONE');
62
49
  rows.push({
63
50
  ticketId: asString(data.ticket) || neutral('-'),
@@ -125,3 +112,4 @@ export async function list(options = {}) {
125
112
  : `Showing latest ${displayedRows.length} of ${totalEntries} entries (use --all to show all)`;
126
113
  console.log(neutral(`${countText} in ${config.logbookDir}/`));
127
114
  }
115
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1 @@
1
- export declare function log(messages: string[], options?: {
2
- id?: string;
3
- }): Promise<void>;
1
+ export declare function log(messages: string[]): Promise<void>;
@@ -3,13 +3,13 @@ import { join } from 'node:path';
3
3
  import { error as errorStyle, successMessage } from '../lib/theme.js';
4
4
  import { getConfig } from '../lib/config.js';
5
5
  import { getActiveEntry } from '../lib/session.js';
6
- export async function log(messages, options = {}) {
6
+ export async function log(messages) {
7
7
  const cwd = process.cwd();
8
8
  // 1. Require an active entry
9
- const active = await getActiveEntry(options, cwd);
9
+ const active = await getActiveEntry({}, cwd);
10
10
  if (!active) {
11
11
  console.error(errorStyle(`Error: No active logbook entry resolved.`));
12
- console.error(errorStyle(`Activate an entry via 'logbook start <id>', checkout a feature branch, or pass --id.`));
12
+ console.error(errorStyle(`Activate an entry via 'logbook start <id>' or checkout a feature branch.`));
13
13
  process.exit(1);
14
14
  }
15
15
  const config = getConfig();
@@ -29,3 +29,4 @@ export async function log(messages, options = {}) {
29
29
  console.log(successMessage('Logged', `${active.slug} (via ${active.source}): ${timestamp}: ${msg}`));
30
30
  }
31
31
  }
32
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/commands/log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,QAAkB;IAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,6BAA6B;IAC7B,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,0EAA0E,CAAC,CAAC,CAAC;QACtG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAEpE,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qDAAqD;IACrD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,SAAS,KAAK,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5E,sBAAsB;IACtB,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC;IAEpE,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,MAAM,SAAS,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;IACvG,CAAC;AACH,CAAC"}
@@ -132,3 +132,4 @@ export async function createNewEntry(id, slug) {
132
132
  await fs.writeFile(join(entryDir, 'log.md'), fillTemplate(getTemplate('log.md')));
133
133
  console.log(successMessage('Created', `logbook entry in ${config.logbookDir}/${entryId}-${entrySlug}/`));
134
134
  }
135
+ //# sourceMappingURL=new.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EACL,MAAM,EACN,OAAO,IAAI,YAAY,EACvB,SAAS,EACT,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,EAAE,GAAG,eAAe,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC,KAAK;IACpB,MAAM,EAAE,OAAO,CAAC,MAAM;CACvB,CAAC,CAAC;AAEH,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAmB,EAAE;IACnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;YAC7B,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EAAW,EAAE,IAAa;IAC7D,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACvC,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,SAAS,GAAG,IAAI,CAAC;IAErB,6CAA6C;IAC7C,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,wDAAwD,CAAC,CAAC,CAAC;QAE9E,+CAA+C;QAC/C,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;QAE1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,aAAa,EAAE,CAAC;gBAClB,uCAAuC;gBACvC,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,UAAW,CAAC,CAAC;gBACzD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,wBAAwB,MAAM,qCAAqC,CAAC,CAAC,CAAC;gBAC7G,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;oBACpC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;oBACpE,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE,CAAC;wBAC/E,OAAO,CAAC,IAAI,CACV,YAAY,CACV,oBAAoB,MAAM,CAAC,MAAM,+BAA+B,MAAM,CAAC,UAAU,6BAA6B,CAC/G,CACF,CAAC;wBACF,OAAO,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBACpD,CAAC;yBAAM,IAAI,MAAM,EAAE,CAAC;wBAClB,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;oBAChC,CAAC;yBAAM,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;wBAC/B,OAAO,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,UAAU,EAAE,CAAC;oBACjD,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,6CAA6C,CAAC,CAAC,CAAC;wBAC1E,OAAO,GAAG,MAAM,CAAC;oBACnB,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,OAAO,GAAG,MAAM,CAAC;gBACnB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBAC3C,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,wBAAwB,MAAM,qCAAqC,CAAC,CAAC,CAAC;gBAC7G,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;oBACpC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;oBACpE,IAAI,MAAM,EAAE,CAAC;wBACX,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;oBAChC,CAAC;yBAAM,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;wBAC/B,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;oBAC/B,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,6CAA6C,CAAC,CAAC,CAAC;wBAC1E,OAAO,GAAG,MAAM,CAAC;oBACnB,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,OAAO,GAAG,MAAM,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,mDAAmD,CAAC,CAAC,CAAC;YAC7F,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC;gBAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QAED,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;IAED,gBAAgB;IAChB,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,yBAAyB,SAAS,SAAS,SAAS,IAAI,CAAC,CAAC,CAAC;QACjG,SAAS,GAAG,SAAS,CAAC;IACxB,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC;IAEpF,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,OAAO,IAAI,SAAS,kBAAkB,CAAC,CAAC,CAAC;QACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE1B,MAAM,OAAO,GAAW,iBAAiB,EAAE,CAAC;IAE5C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,YAAY,GAA2B;QAC3C,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;QACnC,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,EAAE,GAAG,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAChG,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE;QAC1B,OAAO,EAAE,IAAI,OAAO,EAAE;KACvB,CAAC;IAEF,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAU,EAAE;QAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,aAAa,CAAC,CAAC;IACjD,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAE,EAAE;QACxC,OAAO,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,CAAC;IACvF,CAAC,CAAC;IAEF,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACtF,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAElF,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,SAAS,EAAE,oBAAoB,MAAM,CAAC,UAAU,IAAI,OAAO,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;AAC3G,CAAC"}
@@ -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"}
@@ -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>;
@@ -6,6 +6,7 @@ import matter from 'gray-matter';
6
6
  import { getConfig, getLogbookDirPath } from '../lib/config.js';
7
7
  import { getActiveEntry } from '../lib/session.js';
8
8
  import { getEntryPath } from '../lib/entry-paths.js';
9
+ import { getLogbookEntries } from '../utils/fs.js';
9
10
  import { LOCKFILE_NAME } from '../lib/lockfile.js';
10
11
  function getGitUsername() {
11
12
  try {
@@ -17,8 +18,7 @@ function getGitUsername() {
17
18
  return undefined;
18
19
  }
19
20
  }
20
- export async function start(id) {
21
- const cwd = process.cwd();
21
+ export async function start(id, cwd = process.cwd()) {
22
22
  const lockfilePath = join(cwd, LOCKFILE_NAME);
23
23
  // 1. Enforce single active entry
24
24
  if (await fs.pathExists(lockfilePath)) {
@@ -27,22 +27,62 @@ export async function start(id) {
27
27
  console.error(errorStyle(`Run 'logbook release' before starting a new entry.`));
28
28
  process.exit(1);
29
29
  }
30
- // 2. Resolve folder by ID prefix (e.g. "LB-5" → "LB-5-jira-support")
30
+ // 2. Resolve folder by ID prefix or exact match
31
31
  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;
32
+ // If a bare or suffixed number is given (e.g. "20-fix"), auto-prepend the configured jiraPrefix
33
+ const resolvedId = /^\d+(?:-.*)?$/.test(id) && config.jiraPrefix ? `${config.jiraPrefix}-${id}` : id;
34
34
  const logbookDir = getLogbookDirPath(config, cwd);
35
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) {
36
+ let slug;
37
+ // 2a. Direct folder name match bypasses all other logic
38
+ const exactSlugMatch = allDirs.find((d) => d.toLowerCase() === id.toLowerCase());
39
+ if (exactSlugMatch) {
40
+ slug = exactSlugMatch;
41
+ }
42
+ else {
43
+ // 2b. Query all logbook entries for frontmatter and folder structure
44
+ const logbookEntries = await getLogbookEntries(logbookDir);
45
+ // First Pass: Exact Ticket ID Match in Frontmatter
46
+ const exactTicketMatches = logbookEntries.filter((e) => {
47
+ const ticket = typeof e.data?.ticket === 'string' ? e.data.ticket.trim().toLowerCase() : '';
48
+ return ticket === resolvedId.toLowerCase();
49
+ });
50
+ if (exactTicketMatches.length === 1) {
51
+ slug = exactTicketMatches[0].slug;
52
+ }
53
+ else if (exactTicketMatches.length > 1) {
54
+ console.error(errorStyle(`Error: Multiple entries found with the exact same ticket ID '${resolvedId}'.`));
55
+ console.error(errorStyle(`Please specify the unique folder name/slug directly instead:`));
56
+ for (const match of exactTicketMatches) {
57
+ console.error(errorStyle(` logbook start ${match.slug}`));
58
+ }
59
+ process.exit(1);
60
+ }
61
+ else {
62
+ // Second Pass: Fallback Prefix Match on Folder Names
63
+ const prefixMatches = logbookEntries.filter((e) => {
64
+ const prefix = e.slug.split('-').slice(0, resolvedId.split('-').length).join('-');
65
+ return prefix.toLowerCase() === resolvedId.toLowerCase();
66
+ });
67
+ if (prefixMatches.length === 1) {
68
+ slug = prefixMatches[0].slug;
69
+ }
70
+ else if (prefixMatches.length > 1) {
71
+ console.error(errorStyle(`Error: Multiple entries found matching prefix '${resolvedId}'.`));
72
+ console.error(errorStyle(`Please be more specific. Run one of:`));
73
+ for (const match of prefixMatches) {
74
+ const ticketId = typeof match.data?.ticket === 'string' ? match.data.ticket : match.slug;
75
+ console.error(errorStyle(` logbook start ${ticketId}`));
76
+ }
77
+ process.exit(1);
78
+ }
79
+ }
80
+ }
81
+ if (!slug) {
41
82
  console.error(errorStyle(`Error: No entry found matching ID '${resolvedId}' in ${config.logbookDir}/.`));
42
83
  console.error(errorStyle(`Run 'logbook new <id> <slug>' to create it first.`));
43
84
  process.exit(1);
44
85
  }
45
- const slug = matchingDir;
46
86
  const entryDir = getEntryPath(logbookDir, slug);
47
87
  // Warn if branch-resolved entry is different
48
88
  const activeFromBranch = await getActiveEntry({}, cwd);
@@ -75,7 +115,7 @@ export async function start(id) {
75
115
  raw = raw.replace('prompter: "[PROMPTER]"', `prompter: '${prompter.replace(/'/g, "''")}'`);
76
116
  }
77
117
  else if (!parsed.data.prompter) {
78
- raw = raw.replace(/^(---\n[\s\S]*?)(^---$)/m, (_, frontmatter, closing) => {
118
+ raw = raw.replace(/^(---\r?\n[\s\S]*?)(^---\r?$)/m, (_, frontmatter, closing) => {
79
119
  if (frontmatter.includes('prompter:'))
80
120
  return _;
81
121
  return `${frontmatter}prompter: '${prompter.replace(/'/g, "''")}'\n${closing}`;
@@ -90,3 +130,4 @@ export async function start(id) {
90
130
  }
91
131
  console.log(neutral(`Lockfile written to ${LOCKFILE_NAME}. Run 'logbook release' when done.`));
92
132
  }
133
+ //# 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,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