project-logbook 0.4.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/README.md +36 -1
  2. package/dist/commands/build.js +34 -76
  3. package/dist/commands/build.js.map +1 -0
  4. package/dist/commands/init.js +1 -0
  5. package/dist/commands/init.js.map +1 -0
  6. package/dist/commands/lint.js +7 -2
  7. package/dist/commands/lint.js.map +1 -0
  8. package/dist/commands/list.js +4 -16
  9. package/dist/commands/list.js.map +1 -0
  10. package/dist/commands/log.d.ts +1 -3
  11. package/dist/commands/log.js +4 -3
  12. package/dist/commands/log.js.map +1 -0
  13. package/dist/commands/new.js +1 -0
  14. package/dist/commands/new.js.map +1 -0
  15. package/dist/commands/preview.js +1 -0
  16. package/dist/commands/preview.js.map +1 -0
  17. package/dist/commands/release.js +1 -0
  18. package/dist/commands/release.js.map +1 -0
  19. package/dist/commands/start.d.ts +1 -1
  20. package/dist/commands/start.js +53 -12
  21. package/dist/commands/start.js.map +1 -0
  22. package/dist/commands/status.js +7 -18
  23. package/dist/commands/status.js.map +1 -0
  24. package/dist/commands/steer.js +1 -0
  25. package/dist/commands/steer.js.map +1 -0
  26. package/dist/commands/upgrade.js +1 -0
  27. package/dist/commands/upgrade.js.map +1 -0
  28. package/dist/index.js +3 -3
  29. package/dist/index.js.map +1 -0
  30. package/dist/lib/about-content.js +1 -0
  31. package/dist/lib/about-content.js.map +1 -0
  32. package/dist/lib/adr-renderer.d.ts +12 -0
  33. package/dist/lib/adr-renderer.js +53 -0
  34. package/dist/lib/adr-renderer.js.map +1 -0
  35. package/dist/lib/build-helpers.js +8 -3
  36. package/dist/lib/build-helpers.js.map +1 -0
  37. package/dist/lib/build-steps.d.ts +20 -2
  38. package/dist/lib/build-steps.js +107 -13
  39. package/dist/lib/build-steps.js.map +1 -0
  40. package/dist/lib/config.d.ts +8 -0
  41. package/dist/lib/config.js +19 -1
  42. package/dist/lib/config.js.map +1 -0
  43. package/dist/lib/entry-id.js +1 -0
  44. package/dist/lib/entry-id.js.map +1 -0
  45. package/dist/lib/entry-paths.js +1 -0
  46. package/dist/lib/entry-paths.js.map +1 -0
  47. package/dist/lib/git-helpers.d.ts +5 -16
  48. package/dist/lib/git-helpers.js +52 -78
  49. package/dist/lib/git-helpers.js.map +1 -0
  50. package/dist/lib/git-url-helpers.d.ts +16 -0
  51. package/dist/lib/git-url-helpers.js +76 -0
  52. package/dist/lib/git-url-helpers.js.map +1 -0
  53. package/dist/lib/hast-helpers.js +1 -0
  54. package/dist/lib/hast-helpers.js.map +1 -0
  55. package/dist/lib/html-attributes.js +1 -0
  56. package/dist/lib/html-attributes.js.map +1 -0
  57. package/dist/lib/html-escape.js +1 -0
  58. package/dist/lib/html-escape.js.map +1 -0
  59. package/dist/lib/image-helpers.js +20 -30
  60. package/dist/lib/image-helpers.js.map +1 -0
  61. package/dist/lib/jira-helpers.js +1 -0
  62. package/dist/lib/jira-helpers.js.map +1 -0
  63. package/dist/lib/lint-runner.js +1 -0
  64. package/dist/lib/lint-runner.js.map +1 -0
  65. package/dist/lib/lint-types.js +1 -0
  66. package/dist/lib/lint-types.js.map +1 -0
  67. package/dist/lib/lockfile.js +1 -0
  68. package/dist/lib/lockfile.js.map +1 -0
  69. package/dist/lib/logbook-client.js +1 -0
  70. package/dist/lib/logbook-client.js.map +1 -0
  71. package/dist/lib/markdown-processors.js +1 -0
  72. package/dist/lib/markdown-processors.js.map +1 -0
  73. package/dist/lib/migrations.js +1 -0
  74. package/dist/lib/migrations.js.map +1 -0
  75. package/dist/lib/package-version.js +1 -0
  76. package/dist/lib/package-version.js.map +1 -0
  77. package/dist/lib/rss.js +1 -0
  78. package/dist/lib/rss.js.map +1 -0
  79. package/dist/lib/session.js +47 -35
  80. package/dist/lib/session.js.map +1 -0
  81. package/dist/lib/styles.js +1 -0
  82. package/dist/lib/styles.js.map +1 -0
  83. package/dist/lib/template-helpers.d.ts +6 -1
  84. package/dist/lib/template-helpers.js +64 -0
  85. package/dist/lib/template-helpers.js.map +1 -0
  86. package/dist/lib/template-types.d.ts +22 -2
  87. package/dist/lib/template-types.js +1 -0
  88. package/dist/lib/template-types.js.map +1 -0
  89. package/dist/lib/templates.d.ts +7 -2
  90. package/dist/lib/templates.js +54 -34
  91. package/dist/lib/templates.js.map +1 -0
  92. package/dist/lib/theme.js +1 -0
  93. package/dist/lib/theme.js.map +1 -0
  94. package/dist/lib/url-helpers.js +1 -0
  95. package/dist/lib/url-helpers.js.map +1 -0
  96. package/dist/linters/diff-to-narrative.d.ts +2 -1
  97. package/dist/linters/diff-to-narrative.js +3 -10
  98. package/dist/linters/diff-to-narrative.js.map +1 -0
  99. package/dist/linters/frontmatter.js +1 -0
  100. package/dist/linters/frontmatter.js.map +1 -0
  101. package/dist/linters/index.js +1 -0
  102. package/dist/linters/index.js.map +1 -0
  103. package/dist/linters/jira-prefix.js +1 -0
  104. package/dist/linters/jira-prefix.js.map +1 -0
  105. package/dist/linters/links.js +26 -4
  106. package/dist/linters/links.js.map +1 -0
  107. package/dist/linters/lockfile.js +1 -0
  108. package/dist/linters/lockfile.js.map +1 -0
  109. package/dist/linters/placeholders.js +6 -4
  110. package/dist/linters/placeholders.js.map +1 -0
  111. package/dist/linters/project-integrity.js +1 -0
  112. package/dist/linters/project-integrity.js.map +1 -0
  113. package/dist/linters/readability.js +2 -3
  114. package/dist/linters/readability.js.map +1 -0
  115. package/dist/linters/technical-log.js +1 -0
  116. package/dist/linters/technical-log.js.map +1 -0
  117. package/dist/linters/workspaces.js +1 -0
  118. package/dist/linters/workspaces.js.map +1 -0
  119. package/dist/templates/WELCOME.md +12 -0
  120. package/dist/templates/index.md +2 -1
  121. package/dist/templates/logbook-client.js +29 -0
  122. package/dist/templates/styles.css +205 -32
  123. package/dist/utils/date.js +1 -0
  124. package/dist/utils/date.js.map +1 -0
  125. package/dist/utils/frontmatter.d.ts +9 -0
  126. package/dist/utils/frontmatter.js +16 -0
  127. package/dist/utils/frontmatter.js.map +1 -0
  128. package/dist/utils/fs.d.ts +10 -0
  129. package/dist/utils/fs.js +112 -0
  130. package/dist/utils/fs.js.map +1 -0
  131. package/dist/utils/id.js +1 -0
  132. package/dist/utils/id.js.map +1 -0
  133. package/dist/utils/log-timeline.d.ts +2 -1
  134. package/dist/utils/log-timeline.js +1 -0
  135. package/dist/utils/log-timeline.js.map +1 -0
  136. package/dist/utils/slug.js +1 -0
  137. package/dist/utils/slug.js.map +1 -0
  138. package/dist/utils/string.js +1 -0
  139. package/dist/utils/string.js.map +1 -0
  140. package/dist/utils/timeline-helpers.d.ts +2 -2
  141. package/dist/utils/timeline-helpers.js +5 -2
  142. package/dist/utils/timeline-helpers.js.map +1 -0
  143. package/dist/utils/validation.d.ts +5 -0
  144. package/dist/utils/validation.js +21 -0
  145. package/dist/utils/validation.js.map +1 -0
  146. package/package.json +10 -4
  147. package/src/templates/WELCOME.md +12 -0
  148. package/src/templates/index.md +2 -1
  149. package/src/templates/logbook-client.js +29 -0
  150. package/src/templates/styles.css +205 -32
@@ -1,55 +1,6 @@
1
1
  import { execSync } from 'node:child_process';
2
2
  import { simpleGit } from 'simple-git';
3
- /**
4
- * Clean the repository URL by removing trailing slashes and .git extensions.
5
- */
6
- export function cleanRepositoryUrl(url) {
7
- let cleaned = url.trim();
8
- if (cleaned.endsWith('/')) {
9
- cleaned = cleaned.slice(0, -1);
10
- }
11
- if (cleaned.endsWith('.git')) {
12
- cleaned = cleaned.slice(0, -4);
13
- }
14
- if (cleaned.endsWith('/')) {
15
- cleaned = cleaned.slice(0, -1);
16
- }
17
- return cleaned;
18
- }
19
- /**
20
- * Generate a URL to view a specific commit in a web interface (GitHub, GitLab, Bitbucket, etc.).
21
- */
22
- export function getCommitUrl(repositoryUrl, sha) {
23
- if (!repositoryUrl)
24
- return undefined;
25
- const baseUrl = cleanRepositoryUrl(repositoryUrl);
26
- const lowerUrl = baseUrl.toLowerCase();
27
- if (lowerUrl.includes('gitlab')) {
28
- return `${baseUrl}/-/commit/${sha}`;
29
- }
30
- if (lowerUrl.includes('bitbucket')) {
31
- return `${baseUrl}/commits/${sha}`;
32
- }
33
- // Default to GitHub style
34
- return `${baseUrl}/commit/${sha}`;
35
- }
36
- /**
37
- * Generate a URL to view a specific tag in a web interface (GitHub, GitLab, Bitbucket, etc.).
38
- */
39
- export function getTagUrl(repositoryUrl, tag) {
40
- if (!repositoryUrl)
41
- return undefined;
42
- const baseUrl = cleanRepositoryUrl(repositoryUrl);
43
- const lowerUrl = baseUrl.toLowerCase();
44
- if (lowerUrl.includes('gitlab')) {
45
- return `${baseUrl}/-/tags/${tag}`;
46
- }
47
- if (lowerUrl.includes('bitbucket')) {
48
- return `${baseUrl}/src/${tag}`;
49
- }
50
- // Default to GitHub style
51
- return `${baseUrl}/releases/tag/${tag}`;
52
- }
3
+ export { cleanRepositoryUrl, getCommitUrl, getTagUrl, parseRemoteUrlToWebUrl } from './git-url-helpers.js';
53
4
  function getGit() {
54
5
  return simpleGit(process.cwd());
55
6
  }
@@ -142,31 +93,6 @@ export function getGitRemoteUrl(cwd = process.cwd()) {
142
93
  return undefined;
143
94
  }
144
95
  }
145
- /**
146
- * Parse a git remote URL (SSH or HTTPS) into a clean web/HTTP(S) repository homepage URL.
147
- */
148
- export function parseRemoteUrlToWebUrl(remoteUrl) {
149
- if (!remoteUrl)
150
- return undefined;
151
- let url = remoteUrl.trim();
152
- // If it's already an HTTP/HTTPS URL, clean and return it
153
- if (url.startsWith('https://') || url.startsWith('http://')) {
154
- return cleanRepositoryUrl(url);
155
- }
156
- // Strip ssh:// scheme and git@ user if present
157
- if (url.startsWith('ssh://')) {
158
- url = url.slice(6);
159
- }
160
- if (url.startsWith('git@')) {
161
- url = url.slice(4);
162
- }
163
- // Replace first colon with slash to map SSH path to web path (e.g. host:owner/repo -> host/owner/repo)
164
- const firstColon = url.indexOf(':');
165
- if (firstColon !== -1) {
166
- url = url.slice(0, firstColon) + '/' + url.slice(firstColon + 1);
167
- }
168
- return `https://${cleanRepositoryUrl(url)}`;
169
- }
170
96
  /**
171
97
  * Synchronous branch detection — used in session resolution (not the build pipeline).
172
98
  * Kept synchronous intentionally; simple-git is used for the heavier async build operations.
@@ -183,19 +109,66 @@ export function getCurrentBranch(cwd = process.cwd()) {
183
109
  return undefined;
184
110
  }
185
111
  }
112
+ /**
113
+ * Dynamically detect the default branch (usually main or master).
114
+ */
115
+ export function getDefaultBranch(cwd = process.cwd()) {
116
+ try {
117
+ // 1. Try checking the remote HEAD reference
118
+ const remoteHead = execSync('git symbolic-ref refs/remotes/origin/HEAD', {
119
+ encoding: 'utf8',
120
+ cwd,
121
+ stdio: ['ignore', 'pipe', 'ignore'],
122
+ }).trim();
123
+ if (remoteHead) {
124
+ const parts = remoteHead.split('/');
125
+ const branch = parts[parts.length - 1];
126
+ if (branch)
127
+ return branch;
128
+ }
129
+ }
130
+ catch {
131
+ // Ignore and proceed
132
+ }
133
+ try {
134
+ // 2. Check if local main branch exists
135
+ execSync('git show-ref --verify refs/heads/main', {
136
+ cwd,
137
+ stdio: 'ignore',
138
+ });
139
+ return 'main';
140
+ }
141
+ catch {
142
+ // Ignore and proceed
143
+ }
144
+ try {
145
+ // 3. Check if local master branch exists
146
+ execSync('git show-ref --verify refs/heads/master', {
147
+ cwd,
148
+ stdio: 'ignore',
149
+ });
150
+ return 'master';
151
+ }
152
+ catch {
153
+ // Ignore and proceed
154
+ }
155
+ // 4. Ultimate fallback
156
+ return 'main';
157
+ }
186
158
  /**
187
159
  * Calculate the changed LOC (insertions + deletions) for the active branch or main working tree.
188
160
  */
189
161
  export async function getChangedLOC(logbookDir, cwd = process.cwd()) {
190
162
  try {
191
- const branchName = getCurrentBranch(cwd) || 'main';
163
+ const defaultBranch = getDefaultBranch(cwd);
164
+ const branchName = getCurrentBranch(cwd) || defaultBranch;
192
165
  const git = simpleGit(cwd);
193
166
  let summary;
194
- if (branchName === 'main') {
167
+ if (branchName === defaultBranch) {
195
168
  summary = await git.diffSummary(['HEAD', '--', '.', `:!${logbookDir}`]);
196
169
  }
197
170
  else {
198
- summary = await git.diffSummary(['main...HEAD', '--', '.', `:!${logbookDir}`]);
171
+ summary = await git.diffSummary([`${defaultBranch}...HEAD`, '--', '.', `:!${logbookDir}`]);
199
172
  }
200
173
  return {
201
174
  total: summary.insertions + summary.deletions,
@@ -207,3 +180,4 @@ export async function getChangedLOC(logbookDir, cwd = process.cwd()) {
207
180
  return { total: 0, insertions: 0, deletions: 0 };
208
181
  }
209
182
  }
183
+ //# sourceMappingURL=git-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-helpers.js","sourceRoot":"","sources":["../../src/lib/git-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Clean the repository URL by removing trailing slashes and .git extensions.
3
+ */
4
+ export declare function cleanRepositoryUrl(url: string): string;
5
+ /**
6
+ * Generate a URL to view a specific commit in a web interface (GitHub, GitLab, Bitbucket, etc.).
7
+ */
8
+ export declare function getCommitUrl(repositoryUrl: string | undefined, sha: string): string | undefined;
9
+ /**
10
+ * Generate a URL to view a specific tag in a web interface (GitHub, GitLab, Bitbucket, etc.).
11
+ */
12
+ export declare function getTagUrl(repositoryUrl: string | undefined, tag: string): string | undefined;
13
+ /**
14
+ * Parse a git remote URL (SSH or HTTPS) into a clean web/HTTP(S) repository homepage URL.
15
+ */
16
+ export declare function parseRemoteUrlToWebUrl(remoteUrl: string | undefined): string | undefined;
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Clean the repository URL by removing trailing slashes and .git extensions.
3
+ */
4
+ export function cleanRepositoryUrl(url) {
5
+ let cleaned = url.trim();
6
+ if (cleaned.endsWith('/')) {
7
+ cleaned = cleaned.slice(0, -1);
8
+ }
9
+ if (cleaned.endsWith('.git')) {
10
+ cleaned = cleaned.slice(0, -4);
11
+ }
12
+ if (cleaned.endsWith('/')) {
13
+ cleaned = cleaned.slice(0, -1);
14
+ }
15
+ return cleaned;
16
+ }
17
+ /**
18
+ * Generate a URL to view a specific commit in a web interface (GitHub, GitLab, Bitbucket, etc.).
19
+ */
20
+ export function getCommitUrl(repositoryUrl, sha) {
21
+ if (!repositoryUrl)
22
+ return undefined;
23
+ const baseUrl = cleanRepositoryUrl(repositoryUrl);
24
+ const lowerUrl = baseUrl.toLowerCase();
25
+ if (lowerUrl.includes('gitlab')) {
26
+ return `${baseUrl}/-/commit/${sha}`;
27
+ }
28
+ if (lowerUrl.includes('bitbucket')) {
29
+ return `${baseUrl}/commits/${sha}`;
30
+ }
31
+ // Default to GitHub style
32
+ return `${baseUrl}/commit/${sha}`;
33
+ }
34
+ /**
35
+ * Generate a URL to view a specific tag in a web interface (GitHub, GitLab, Bitbucket, etc.).
36
+ */
37
+ export function getTagUrl(repositoryUrl, tag) {
38
+ if (!repositoryUrl)
39
+ return undefined;
40
+ const baseUrl = cleanRepositoryUrl(repositoryUrl);
41
+ const lowerUrl = baseUrl.toLowerCase();
42
+ if (lowerUrl.includes('gitlab')) {
43
+ return `${baseUrl}/-/tags/${tag}`;
44
+ }
45
+ if (lowerUrl.includes('bitbucket')) {
46
+ return `${baseUrl}/src/${tag}`;
47
+ }
48
+ // Default to GitHub style
49
+ return `${baseUrl}/releases/tag/${tag}`;
50
+ }
51
+ /**
52
+ * Parse a git remote URL (SSH or HTTPS) into a clean web/HTTP(S) repository homepage URL.
53
+ */
54
+ export function parseRemoteUrlToWebUrl(remoteUrl) {
55
+ if (!remoteUrl)
56
+ return undefined;
57
+ let url = remoteUrl.trim();
58
+ // If it's already an HTTP/HTTPS URL, clean and return it
59
+ if (url.startsWith('https://') || url.startsWith('http://')) {
60
+ return cleanRepositoryUrl(url);
61
+ }
62
+ // Strip ssh:// scheme and git@ user if present
63
+ if (url.startsWith('ssh://')) {
64
+ url = url.slice(6);
65
+ }
66
+ if (url.startsWith('git@')) {
67
+ url = url.slice(4);
68
+ }
69
+ // Replace first colon with slash to map SSH path to web path (e.g. host:owner/repo -> host/owner/repo)
70
+ const firstColon = url.indexOf(':');
71
+ if (firstColon !== -1) {
72
+ url = url.slice(0, firstColon) + '/' + url.slice(firstColon + 1);
73
+ }
74
+ return `https://${cleanRepositoryUrl(url)}`;
75
+ }
76
+ //# sourceMappingURL=git-url-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-url-helpers.js","sourceRoot":"","sources":["../../src/lib/git-url-helpers.ts"],"names":[],"mappings":"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"}
@@ -20,3 +20,4 @@ export function visitHastElements(node, tagNames, visitor) {
20
20
  }
21
21
  traverse(node);
22
22
  }
23
+ //# sourceMappingURL=hast-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hast-helpers.js","sourceRoot":"","sources":["../../src/lib/hast-helpers.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAoB,EACpB,QAA2B,EAC3B,OAAgC;IAEhC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE7E,SAAS,QAAQ,CAAC,CAAiB;QACjC,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC7B,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;oBACnC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC;gBACD,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC"}
@@ -15,3 +15,4 @@ export const CLASS_COMMIT_SHA = 'commit-sha';
15
15
  export const CLASS_COMMIT_TIME = 'commit-time';
16
16
  /** Class name for commit message display */
17
17
  export const CLASS_COMMIT_MESSAGE = 'commit-message';
18
+ //# sourceMappingURL=html-attributes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-attributes.js","sourceRoot":"","sources":["../../src/lib/html-attributes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,kFAAkF;AAClF,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAE/C,0DAA0D;AAC1D,MAAM,CAAC,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAEjD,oEAAoE;AACpE,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC;AAE1C,wCAAwC;AACxC,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAE7C,8CAA8C;AAC9C,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAE/C,4CAA4C;AAC5C,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC"}
@@ -36,3 +36,4 @@ export function validateUrlScheme(url) {
36
36
  return undefined;
37
37
  }
38
38
  }
39
+ //# sourceMappingURL=html-escape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-escape.js","sourceRoot":"","sources":["../../src/lib/html-escape.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,yDAAyD,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC/E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChE,OAAO,GAAG,CAAC;QACb,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -18,6 +18,11 @@ export function extractImagePathsFromMarkdown(content) {
18
18
  }
19
19
  return paths;
20
20
  }
21
+ function isCandidateLocalSrc(src) {
22
+ if (typeof src !== 'string')
23
+ return false;
24
+ return !isExternalUrl(src) && !src.startsWith('data:');
25
+ }
21
26
  /** ImageProcessor: tracks images encountered during markdown-to-html conversion */
22
27
  class ImageProcessor {
23
28
  images = [];
@@ -32,14 +37,9 @@ class ImageProcessor {
32
37
  return (tree) => {
33
38
  visitHastElements(tree, 'img', (node) => {
34
39
  const src = node.properties?.src;
35
- if (typeof src !== 'string')
36
- return;
37
- // Skip external URLs and data URIs
38
- if (isExternalUrl(src))
39
- return;
40
- if (src.startsWith('data:'))
41
- return;
42
- this.images.push(src);
40
+ if (isCandidateLocalSrc(src)) {
41
+ this.images.push(src);
42
+ }
43
43
  });
44
44
  };
45
45
  };
@@ -50,12 +50,7 @@ export const rehypeRewriteImagePaths = () => {
50
50
  return (tree) => {
51
51
  visitHastElements(tree, 'img', (node) => {
52
52
  const src = node.properties?.src;
53
- if (typeof src !== 'string')
54
- return;
55
- // Skip external URLs and data URIs
56
- if (isExternalUrl(src))
57
- return;
58
- if (src.startsWith('data:'))
53
+ if (!isCandidateLocalSrc(src))
59
54
  return;
60
55
  // Skip already rewritten paths
61
56
  if (src.startsWith('./images/') || src.startsWith('../images/'))
@@ -95,17 +90,11 @@ export async function copyImages(sourceDir, outputDir, imagePaths) {
95
90
  processedPaths.add(imagePath);
96
91
  let sourcePath = '';
97
92
  let destRelPath = '';
98
- // Handle absolute paths starting with /
93
+ // 1. Resolve paths
99
94
  if (imagePath.startsWith('/')) {
100
95
  // Absolute path like /static/screenshot.jpg -> copy from project root to public/static/
101
96
  const relativeToProjectRoot = imagePath.substring(1); // Remove leading /
102
97
  sourcePath = join(projectRoot, relativeToProjectRoot);
103
- // Path traversal protection: ensure resolved path stays within project root
104
- const resolvedSource = resolve(sourcePath);
105
- if (!resolvedSource.startsWith(projectRoot + '/') && resolvedSource !== projectRoot) {
106
- console.warn(warning(` Path traversal blocked: ${imagePath}`));
107
- continue;
108
- }
109
98
  destRelPath = relativeToProjectRoot;
110
99
  }
111
100
  else {
@@ -116,21 +105,21 @@ export async function copyImages(sourceDir, outputDir, imagePaths) {
116
105
  }
117
106
  const fullPath = join(sourceDir, resolvedPath);
118
107
  sourcePath = fullPath;
119
- // Path traversal protection: ensure resolved path stays within source directory
120
- const resolvedSource = resolve(sourcePath);
121
- const resolvedSourceDir = resolve(sourceDir);
122
- if (!resolvedSource.startsWith(resolvedSourceDir + '/') && resolvedSource !== resolvedSourceDir) {
123
- console.warn(warning(` Path traversal blocked: ${imagePath}`));
124
- continue;
125
- }
126
- // Get the relative path from source dir to maintain folder structure
127
108
  destRelPath = relative(sourceDir, fullPath);
128
109
  }
129
- // Check if image exists
110
+ // 2. Check if image exists
130
111
  if (!(await fs.pathExists(sourcePath))) {
131
112
  console.warn(warning(` Image not found: ${sourcePath}`));
132
113
  continue;
133
114
  }
115
+ // 3. Path traversal protection: ensure resolved path stays within allowed root boundaries
116
+ const allowedRoot = imagePath.startsWith('/') ? projectRoot : sourceDir;
117
+ const resolvedSource = fs.realpathSync(sourcePath);
118
+ const resolvedRoot = fs.realpathSync(allowedRoot);
119
+ if (!resolvedSource.startsWith(resolvedRoot + '/') && resolvedSource !== resolvedRoot) {
120
+ console.warn(warning(` Path traversal blocked: ${imagePath}`));
121
+ continue;
122
+ }
134
123
  const destPath = join(outputDir, destRelPath);
135
124
  // Create destination directory if needed
136
125
  await fs.mkdirp(dirname(destPath));
@@ -138,3 +127,4 @@ export async function copyImages(sourceDir, outputDir, imagePaths) {
138
127
  await fs.copyFile(sourcePath, destPath);
139
128
  }
140
129
  }
130
+ //# sourceMappingURL=image-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-helpers.js","sourceRoot":"","sources":["../../src/lib/image-helpers.ts"],"names":[],"mappings":"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"}
@@ -3,3 +3,4 @@
3
3
  * Only applied when both jiraBaseUrl and jiraPrefix are provided.
4
4
  */
5
5
  export const linkJiraIds = (msg, base, prefix) => msg.replace(new RegExp(`(${prefix.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}-\\d+)`, 'g'), (m) => `<a href="${base}${m}" target="_blank" rel="noopener noreferrer" class="commit-jira-link">${m}</a>`);
6
+ //# sourceMappingURL=jira-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-helpers.js","sourceRoot":"","sources":["../../src/lib/jira-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,IAAY,EAAE,MAAc,EAAU,EAAE,CAC/E,GAAG,CAAC,OAAO,CACT,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,EAC1E,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,IAAI,GAAG,CAAC,wEAAwE,CAAC,MAAM,CAC3G,CAAC"}
@@ -29,3 +29,4 @@ export async function runLinters(context) {
29
29
  }
30
30
  return !hasErrors;
31
31
  }
32
+ //# sourceMappingURL=lint-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint-runner.js","sourceRoot":"","sources":["../../src/lib/lint-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAsB;IACrD,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC7E,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,OAAO,CAAC,SAAS,CAAC;AACpB,CAAC"}
@@ -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"}
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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"}
@@ -13,18 +13,7 @@ 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);
@@ -32,39 +21,61 @@ export async function getActiveEntry(options = {}, cwd = process.cwd()) {
32
21
  catch {
33
22
  entries = [];
34
23
  }
35
- const availableSlugs = entries.map((e) => e.slug);
36
- // 1. Explicit ID flag
24
+ // 2. Explicit ID flag (takes absolute precedence)
37
25
  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();
26
+ const resolvedId = /^\d+(?:-.*)?$/.test(options.id) && config.jiraPrefix ? `${config.jiraPrefix}-${options.id}` : options.id;
27
+ // First Pass: Exact Ticket ID Match in Frontmatter
28
+ const exactMatch = entries.find((e) => {
29
+ const ticket = typeof e.data?.ticket === 'string' ? e.data.ticket.trim().toLowerCase() : '';
30
+ return ticket === resolvedId.toLowerCase();
31
+ });
32
+ if (exactMatch) {
33
+ return {
34
+ slug: exactMatch.slug,
35
+ source: 'flag',
36
+ };
37
+ }
38
+ // Second Pass: Fallback Prefix Match on Folder Names
39
+ const prefixMatch = entries.find((e) => {
40
+ const prefix = e.slug.split('-').slice(0, resolvedId.split('-').length).join('-');
41
+ return prefix.toLowerCase() === resolvedId.toLowerCase();
45
42
  });
46
- if (matchingDir) {
43
+ if (prefixMatch) {
47
44
  return {
48
- slug: matchingDir,
45
+ slug: prefixMatch.slug,
49
46
  source: 'flag',
50
47
  };
51
48
  }
52
49
  }
53
- // 2. Git Branch Resolution
50
+ // 3. Lockfile check
51
+ const lockfilePath = join(cwd, LOCKFILE_NAME);
52
+ if (await fs.pathExists(lockfilePath)) {
53
+ try {
54
+ const lock = await fs.readJson(lockfilePath);
55
+ return { slug: lock.slug, source: 'lockfile', startedAt: lock.startedAt, prompter: lock.prompter };
56
+ }
57
+ catch {
58
+ // ignore corrupt lockfile
59
+ }
60
+ }
61
+ // 4. Git Branch Resolution
54
62
  const branchName = getCurrentBranch(cwd);
55
63
  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) {
64
+ // Map entries to their respective ticket IDs (using frontmatter with fallback to first 2 parts of slug)
65
+ const candidates = entries.map((e) => {
66
+ const ticketId = typeof e.data?.ticket === 'string' && e.data.ticket.trim()
67
+ ? e.data.ticket.trim()
68
+ : e.slug.split('-').slice(0, 2).join('-');
69
+ return { entry: e, ticketId };
70
+ });
71
+ // Sort by ticketId length descending to match the longest/most-specific ID first
72
+ candidates.sort((a, b) => b.ticketId.length - a.ticketId.length);
73
+ for (const { entry, ticketId } of candidates) {
74
+ const escapedId = ticketId.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
75
+ const boundaryRegex = new RegExp(`(?:^|[/\\-_])${escapedId}(?:$|[/\\-_])`, 'i');
76
+ if (boundaryRegex.test(branchName)) {
66
77
  return {
67
- slug: matchingDir,
78
+ slug: entry.slug,
68
79
  source: 'branch',
69
80
  };
70
81
  }
@@ -72,3 +83,4 @@ export async function getActiveEntry(options = {}, cwd = process.cwd()) {
72
83
  }
73
84
  return undefined;
74
85
  }
86
+ //# 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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"}