project-logbook 1.0.0 → 1.2.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.
- package/README.md +5 -1
- package/dist/commands/build.js +49 -15
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/lint.js +2 -1
- package/dist/commands/lint.js.map +1 -1
- package/dist/commands/list.js +10 -10
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/log.js +24 -1
- package/dist/commands/log.js.map +1 -1
- package/dist/commands/new-helpers.d.ts +26 -0
- package/dist/commands/new-helpers.js +103 -0
- package/dist/commands/new-helpers.js.map +1 -0
- package/dist/commands/new.d.ts +4 -1
- package/dist/commands/new.js +115 -96
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/release.js +1 -1
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/start.d.ts +1 -1
- package/dist/commands/start.js +105 -43
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.js +3 -0
- package/dist/commands/status.js.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/autolink.d.ts +15 -0
- package/dist/lib/autolink.js +39 -0
- package/dist/lib/autolink.js.map +1 -0
- package/dist/lib/build-helpers.d.ts +3 -3
- package/dist/lib/build-helpers.js +54 -60
- package/dist/lib/build-helpers.js.map +1 -1
- package/dist/lib/build-steps.d.ts +2 -2
- package/dist/lib/build-steps.js +30 -3
- package/dist/lib/build-steps.js.map +1 -1
- package/dist/lib/config.d.ts +14 -0
- package/dist/lib/config.js +10 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/custom-card-renderer.d.ts +2 -0
- package/dist/lib/custom-card-renderer.js +58 -0
- package/dist/lib/custom-card-renderer.js.map +1 -0
- package/dist/lib/custom-types-builder.d.ts +4 -0
- package/dist/lib/custom-types-builder.js +37 -0
- package/dist/lib/custom-types-builder.js.map +1 -0
- package/dist/lib/git-helpers.js +10 -1
- package/dist/lib/git-helpers.js.map +1 -1
- package/dist/lib/image-dimension-parser.d.ts +11 -0
- package/dist/lib/image-dimension-parser.js +127 -0
- package/dist/lib/image-dimension-parser.js.map +1 -0
- package/dist/lib/image-helpers.d.ts +2 -0
- package/dist/lib/image-helpers.js +2 -0
- package/dist/lib/image-helpers.js.map +1 -1
- package/dist/lib/markdown-processors.d.ts +5 -2
- package/dist/lib/markdown-processors.js +9 -7
- package/dist/lib/markdown-processors.js.map +1 -1
- package/dist/lib/post-template.d.ts +5 -0
- package/dist/lib/post-template.js +48 -0
- package/dist/lib/post-template.js.map +1 -0
- package/dist/lib/session.d.ts +2 -2
- package/dist/lib/session.js +29 -1
- package/dist/lib/session.js.map +1 -1
- package/dist/lib/template-helpers.js +17 -1
- package/dist/lib/template-helpers.js.map +1 -1
- package/dist/lib/template-types.d.ts +16 -3
- package/dist/lib/templates.d.ts +5 -7
- package/dist/lib/templates.js +39 -53
- package/dist/lib/templates.js.map +1 -1
- package/dist/templates/CONTRIBUTING.md +43 -2
- package/dist/templates/adr.md +34 -0
- package/dist/templates/index.md +5 -4
- package/dist/templates/log.md +1 -1
- package/dist/templates/steer.txt +14 -1
- package/dist/templates/styles.css +32 -0
- package/dist/utils/prompt.d.ts +6 -0
- package/dist/utils/prompt.js +59 -0
- package/dist/utils/prompt.js.map +1 -0
- package/package.json +4 -4
- package/src/templates/CONTRIBUTING.md +43 -2
- package/src/templates/adr.md +34 -0
- package/src/templates/index.md +5 -4
- package/src/templates/log.md +1 -1
- package/src/templates/steer.txt +14 -1
- package/src/templates/styles.css +32 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,2CAA2C,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAE9G,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wDAAwD,CAAC;KACrE,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACpD,MAAM,IAAI,EAAE,CAAC;AACf,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,iFAAiF,CAAC;KAC9F,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare function registerResearchEntries(entries: {
|
|
2
|
+
ticket?: string;
|
|
3
|
+
slug: string;
|
|
4
|
+
customTypeName?: string;
|
|
5
|
+
}[]): void;
|
|
6
|
+
export declare function getRegisteredResearchEntries(): {
|
|
7
|
+
ticket?: string;
|
|
8
|
+
slug: string;
|
|
9
|
+
customTypeName?: string;
|
|
10
|
+
}[];
|
|
11
|
+
export declare function autolinkReferences(html: string, researchEntries: {
|
|
12
|
+
ticket?: string;
|
|
13
|
+
slug: string;
|
|
14
|
+
customTypeName?: string;
|
|
15
|
+
}[], basePath: string): string;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// ponytail: global registry of research/custom entries to avoid passing it down deep callstacks
|
|
2
|
+
let registeredResearchEntries = [];
|
|
3
|
+
export function registerResearchEntries(entries) {
|
|
4
|
+
registeredResearchEntries = entries;
|
|
5
|
+
}
|
|
6
|
+
export function getRegisteredResearchEntries() {
|
|
7
|
+
return registeredResearchEntries;
|
|
8
|
+
}
|
|
9
|
+
export function autolinkReferences(html, researchEntries, basePath) {
|
|
10
|
+
if (!researchEntries || researchEntries.length === 0)
|
|
11
|
+
return html;
|
|
12
|
+
const map = new Map(researchEntries.filter((e) => typeof e.ticket === 'string').map((e) => [e.ticket.toUpperCase(), e]));
|
|
13
|
+
const parts = html.split(/(<[^>]+>)/g);
|
|
14
|
+
let inAnchor = 0;
|
|
15
|
+
for (let i = 0; i < parts.length; i++) {
|
|
16
|
+
const part = parts[i];
|
|
17
|
+
if (part.startsWith('<')) {
|
|
18
|
+
if (/^<a\b/i.test(part)) {
|
|
19
|
+
inAnchor++;
|
|
20
|
+
}
|
|
21
|
+
else if (/^<\/a>/i.test(part)) {
|
|
22
|
+
inAnchor = Math.max(0, inAnchor - 1);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else if (inAnchor === 0) {
|
|
26
|
+
parts[i] = part.replace(/\b([A-Z]+-\d+)\b/gi, (match) => {
|
|
27
|
+
const key = match.toUpperCase();
|
|
28
|
+
const entry = map.get(key);
|
|
29
|
+
if (entry) {
|
|
30
|
+
const folder = entry.customTypeName ? `${entry.customTypeName}/` : 'research/';
|
|
31
|
+
return `<a href="${basePath}${folder}${entry.slug}/index.html" class="research-link">${match}</a>`;
|
|
32
|
+
}
|
|
33
|
+
return match;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return parts.join('');
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=autolink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autolink.js","sourceRoot":"","sources":["../../src/lib/autolink.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,IAAI,yBAAyB,GAAiE,EAAE,CAAC;AAEjG,MAAM,UAAU,uBAAuB,CAAC,OAAqE;IAC3G,yBAAyB,GAAG,OAAO,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC1C,OAAO,yBAAyB,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,IAAY,EACZ,eAA6E,EAC7E,QAAgB;IAEhB,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClE,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CACrG,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACvC,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,QAAQ,EAAE,CAAC;YACb,CAAC;iBAAM,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;aAAM,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC,KAAK,EAAE,EAAE;gBACtD,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;gBAChC,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC3B,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;oBAC/E,OAAO,YAAY,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC,IAAI,sCAAsC,KAAK,MAAM,CAAC;gBACrG,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { LogbookConfig } from './config.js';
|
|
2
2
|
import type { TimelineEntry } from './template-types.js';
|
|
3
|
-
export declare function mdToHtml(md: string): Promise<string>;
|
|
3
|
+
export declare function mdToHtml(md: string, prefix?: string): Promise<string>;
|
|
4
4
|
/** Process entry markdown with image path rewriting */
|
|
5
5
|
export declare function mdToHtmlWithImagePathRewrite(md: string): Promise<string>;
|
|
6
6
|
export declare function buildProjectMdFiles(projectRoot: string, outputDir: string, excludeDirs: string[], ctx: {
|
|
@@ -14,9 +14,9 @@ export declare function renderPost(data: TimelineEntry, i: number, allEntries: T
|
|
|
14
14
|
config: LogbookConfig;
|
|
15
15
|
version: string;
|
|
16
16
|
buildTime: string;
|
|
17
|
-
}): Promise<void>;
|
|
17
|
+
}, isResearch?: boolean, customTypeName?: string): Promise<void>;
|
|
18
18
|
/**
|
|
19
19
|
* Generate the standard footer metadata string.
|
|
20
20
|
* Always hardcoded to 'Project Logbook CLI' with link to npm.
|
|
21
21
|
*/
|
|
22
|
-
export declare
|
|
22
|
+
export declare const generateBuildMeta: (version: string, buildTime: string) => string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import fs from 'fs-extra';
|
|
2
|
-
import { join } from 'node:path';
|
|
2
|
+
import { join, relative } from 'node:path';
|
|
3
3
|
import matter from 'gray-matter';
|
|
4
4
|
import { layout, postTemplate } from './templates.js';
|
|
5
5
|
import { getGitCommits } from './git-helpers.js';
|
|
@@ -11,43 +11,43 @@ import { mdToHtmlWithImages, extractImagePathsFromMarkdown, copyImages, rehypeRe
|
|
|
11
11
|
import { transformLogToTimeline } from '../utils/log-timeline.js';
|
|
12
12
|
const processor = createGeneralMarkdownProcessor(rehypeRewriteMdLinks);
|
|
13
13
|
const entryProcessor = createEntryMarkdownProcessor(rehypeRewriteMdLinks, rehypeRewriteImagePaths);
|
|
14
|
-
export async function mdToHtml(md) {
|
|
15
|
-
const
|
|
16
|
-
return
|
|
14
|
+
export async function mdToHtml(md, prefix) {
|
|
15
|
+
const proc = prefix ? createGeneralMarkdownProcessor(rehypeRewriteMdLinks, { prefix }) : processor;
|
|
16
|
+
return (await proc.process(md)).toString();
|
|
17
17
|
}
|
|
18
18
|
/** Process entry markdown with image path rewriting */
|
|
19
19
|
export async function mdToHtmlWithImagePathRewrite(md) {
|
|
20
|
-
|
|
21
|
-
return result.toString();
|
|
20
|
+
return (await entryProcessor.process(md)).toString();
|
|
22
21
|
}
|
|
23
22
|
export async function buildProjectMdFiles(projectRoot, outputDir, excludeDirs, ctx) {
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
const
|
|
35
|
-
const
|
|
23
|
+
const scan = (dir) => {
|
|
24
|
+
return fs.readdirSync(dir, { withFileTypes: true }).flatMap((e) => {
|
|
25
|
+
if (e.name.startsWith('.') || excludeDirs.includes(e.name))
|
|
26
|
+
return [];
|
|
27
|
+
const p = join(dir, e.name);
|
|
28
|
+
return e.isDirectory() ? scan(p) : e.name.endsWith('.md') ? [relative(projectRoot, p)] : [];
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
for (const relPath of scan(projectRoot)) {
|
|
32
|
+
const relStem = relPath.replace(/\.md$/i, '');
|
|
33
|
+
const mdContent = await fs.readFile(join(projectRoot, relPath), 'utf8');
|
|
34
|
+
const title = relPath.split('/').pop()?.replace(/\.md$/i, '') || '';
|
|
36
35
|
const pageHtml = layout({
|
|
37
|
-
title
|
|
36
|
+
title,
|
|
38
37
|
projectName: ctx.config.projectName,
|
|
39
|
-
basePath: '../',
|
|
40
|
-
buildMeta,
|
|
41
|
-
header: `<header><h1>${
|
|
42
|
-
content:
|
|
38
|
+
basePath: '../'.repeat(relStem.split('/').length),
|
|
39
|
+
buildMeta: generateBuildMeta(ctx.version, ctx.buildTime),
|
|
40
|
+
header: `<header><h1>${title}</h1></header>`,
|
|
41
|
+
content: await mdToHtml(mdContent, '../'),
|
|
43
42
|
});
|
|
44
|
-
await fs.mkdirp(
|
|
45
|
-
await fs.writeFile(join(
|
|
43
|
+
await fs.mkdirp(join(outputDir, relStem));
|
|
44
|
+
await fs.writeFile(join(outputDir, relStem, 'index.html'), pageHtml);
|
|
46
45
|
}
|
|
47
46
|
}
|
|
48
47
|
async function renderLinkedMdFiles(markdownSources, entryPath, entryOutputDir, ctx) {
|
|
49
48
|
const linkRegex = /\[.*?\]\(([^)]+\.md(?:#[^)]*)?)?\)/gi;
|
|
50
49
|
const seen = new Set();
|
|
50
|
+
const projectRoot = fs.realpathSync(process.cwd());
|
|
51
51
|
for (const source of markdownSources) {
|
|
52
52
|
let match;
|
|
53
53
|
linkRegex.lastIndex = 0;
|
|
@@ -56,63 +56,62 @@ async function renderLinkedMdFiles(markdownSources, entryPath, entryOutputDir, c
|
|
|
56
56
|
if (!raw)
|
|
57
57
|
continue;
|
|
58
58
|
const href = raw.split('#')[0];
|
|
59
|
-
if (!href)
|
|
60
|
-
continue;
|
|
61
|
-
if (isExternalUrl(href))
|
|
59
|
+
if (!href || isExternalUrl(href))
|
|
62
60
|
continue;
|
|
63
61
|
if (seen.has(href))
|
|
64
62
|
continue;
|
|
65
63
|
seen.add(href);
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
if (!sourcePath || !(await pathExistsOrNull(sourcePath))) {
|
|
64
|
+
const sourcePath = (await pathExistsOrNull(join(entryPath, href))) ?? (await pathExistsOrNull(join(projectRoot, href)));
|
|
65
|
+
if (!sourcePath) {
|
|
69
66
|
console.warn(` Linked file not found, skipping: ${href}`);
|
|
70
67
|
continue;
|
|
71
68
|
}
|
|
72
|
-
// Path traversal protection: ensure resolved path stays within project boundaries
|
|
73
69
|
const resolvedPath = fs.realpathSync(sourcePath);
|
|
74
|
-
const projectRoot = fs.realpathSync(process.cwd());
|
|
75
70
|
if (!resolvedPath.startsWith(projectRoot + '/') && resolvedPath !== projectRoot) {
|
|
76
71
|
console.warn(` Path traversal blocked: ${href}`);
|
|
77
72
|
continue;
|
|
78
73
|
}
|
|
79
74
|
const mdContent = await fs.readFile(sourcePath, 'utf8');
|
|
80
|
-
const bodyHtml = await mdToHtml(mdContent);
|
|
81
75
|
const title = href.replace(/\.md$/i, '');
|
|
82
|
-
const
|
|
76
|
+
const stem = href.replace(/\.md$/i, '').replace(/^\.\//, '');
|
|
83
77
|
const pageHtml = layout({
|
|
84
78
|
title,
|
|
85
79
|
projectName: ctx.config.projectName,
|
|
86
80
|
basePath: '../',
|
|
87
|
-
buildMeta,
|
|
81
|
+
buildMeta: generateBuildMeta(ctx.version, ctx.buildTime),
|
|
88
82
|
header: `<header><h1>${title}</h1></header>`,
|
|
89
|
-
content:
|
|
83
|
+
content: await mdToHtml(mdContent, '../'),
|
|
90
84
|
});
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
await fs.mkdirp(outDir);
|
|
94
|
-
await fs.writeFile(join(outDir, 'index.html'), pageHtml);
|
|
85
|
+
await fs.mkdirp(join(entryOutputDir, stem));
|
|
86
|
+
await fs.writeFile(join(entryOutputDir, stem, 'index.html'), pageHtml);
|
|
95
87
|
}
|
|
96
88
|
}
|
|
97
89
|
}
|
|
98
|
-
export async function renderPost(data, i, allEntries, ctx) {
|
|
99
|
-
const
|
|
90
|
+
export async function renderPost(data, i, allEntries, ctx, isResearch = false, customTypeName) {
|
|
91
|
+
const currentLogbookDir = customTypeName
|
|
92
|
+
? ctx.config.customTypes?.[customTypeName]?.dir || ''
|
|
93
|
+
: isResearch
|
|
94
|
+
? ctx.config.researchDir || 'docs/research'
|
|
95
|
+
: ctx.logbookDir;
|
|
96
|
+
const entryFilePaths = getEntryFilePaths(currentLogbookDir, data.slug);
|
|
100
97
|
const entryPath = entryFilePaths.index.replace(/\/index\.md$/, '');
|
|
101
98
|
const { content, content: summaryContent } = matter(await fs.readFile(entryFilePaths.index, 'utf8'));
|
|
102
99
|
const ticketRaw = await readFileIfExists(entryFilePaths.ticket);
|
|
103
100
|
const logRaw = await readFileIfExists(entryFilePaths.log);
|
|
104
101
|
// Process with image collection for index.md content
|
|
105
102
|
const { html: storyHtml, imagePaths: storyImages } = await mdToHtmlWithImages(content.replace(/^#\s+.+$/m, '').trim());
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
103
|
+
const allImagePaths = [
|
|
104
|
+
...storyImages,
|
|
105
|
+
...extractImagePathsFromMarkdown(ticketRaw),
|
|
106
|
+
...extractImagePathsFromMarkdown(logRaw),
|
|
107
|
+
];
|
|
110
108
|
const commits = await getGitCommits(entryPath);
|
|
111
109
|
const jiraUrl = ctx.config.jiraBaseUrl && data.ticket ? `${ctx.config.jiraBaseUrl}${data.ticket}` : undefined;
|
|
112
110
|
const prev = i > 0 ? allEntries[i - 1] : null;
|
|
113
111
|
const next = i < allEntries.length - 1 ? allEntries[i + 1] : null;
|
|
114
|
-
// Transform log to timeline if possible, otherwise fall back to plain markdown
|
|
115
112
|
const logHtml = logRaw ? await transformLogToTimeline(logRaw) : '';
|
|
113
|
+
const backLink = isResearch || customTypeName ? '../../index.html' : '../index.html';
|
|
114
|
+
const basePath = isResearch || customTypeName ? '../../' : '../';
|
|
116
115
|
const { header: postHeader, content: postMainContent } = postTemplate({
|
|
117
116
|
...data,
|
|
118
117
|
title: data.title ?? data.slug,
|
|
@@ -126,30 +125,27 @@ export async function renderPost(data, i, allEntries, ctx) {
|
|
|
126
125
|
repositoryUrl: ctx.config.repositoryUrl,
|
|
127
126
|
prevEntry: prev ? { slug: prev.slug, title: prev.title ?? '', ticket: prev.ticket } : null,
|
|
128
127
|
nextEntry: next ? { slug: next.slug, title: next.title ?? '', ticket: next.ticket } : null,
|
|
128
|
+
backLink,
|
|
129
129
|
});
|
|
130
|
-
const descriptionRaw = typeof data.summary === 'string' ? data.summary.replace(/[*#`]/g, '').trim() : '';
|
|
131
|
-
const buildMeta = generateBuildMeta(ctx.version, ctx.buildTime);
|
|
132
130
|
const prevUrl = prev ? `../${prev.slug}/index.html` : undefined;
|
|
133
131
|
const nextUrl = next ? `../${next.slug}/index.html` : undefined;
|
|
134
132
|
const postHtml = layout({
|
|
135
133
|
title: data.title ?? data.slug,
|
|
136
134
|
projectName: ctx.config.projectName,
|
|
137
|
-
basePath
|
|
138
|
-
description:
|
|
135
|
+
basePath,
|
|
136
|
+
description: (typeof data.summary === 'string' ? data.summary.replace(/[*#`]/g, '').trim() : '').substring(0, 160),
|
|
139
137
|
bodySlug: data.slug,
|
|
140
|
-
buildMeta,
|
|
138
|
+
buildMeta: generateBuildMeta(ctx.version, ctx.buildTime),
|
|
141
139
|
header: postHeader,
|
|
142
140
|
content: postMainContent,
|
|
143
141
|
prevUrl,
|
|
144
142
|
nextUrl,
|
|
145
143
|
});
|
|
146
|
-
const entryOutputDir = join(ctx.outputDir, data.slug);
|
|
144
|
+
const entryOutputDir = join(ctx.outputDir, customTypeName || (isResearch ? 'research' : ''), data.slug);
|
|
147
145
|
await fs.mkdirp(entryOutputDir);
|
|
148
146
|
await fs.writeFile(join(entryOutputDir, 'index.html'), postHtml);
|
|
149
|
-
// Copy images to output directory
|
|
150
147
|
if (allImagePaths.length > 0) {
|
|
151
|
-
|
|
152
|
-
await copyImages(entryPath, imagesOutputDir, allImagePaths);
|
|
148
|
+
await copyImages(entryPath, join(entryOutputDir, 'images'), allImagePaths);
|
|
153
149
|
}
|
|
154
150
|
await renderLinkedMdFiles([summaryContent, ticketRaw, logRaw], entryPath, entryOutputDir, ctx);
|
|
155
151
|
}
|
|
@@ -157,7 +153,5 @@ export async function renderPost(data, i, allEntries, ctx) {
|
|
|
157
153
|
* Generate the standard footer metadata string.
|
|
158
154
|
* Always hardcoded to 'Project Logbook CLI' with link to npm.
|
|
159
155
|
*/
|
|
160
|
-
export
|
|
161
|
-
return `Generated by <a href="https://www.npmjs.com/package/project-logbook" target="_blank" rel="noopener noreferrer">Project Logbook CLI</a> v${version} • ${buildTime}`;
|
|
162
|
-
}
|
|
156
|
+
export const generateBuildMeta = (version, buildTime) => `Generated by <a href="https://www.npmjs.com/package/project-logbook" target="_blank" rel="noopener noreferrer">Project Logbook CLI</a> v${version} • ${buildTime}`;
|
|
163
157
|
//# sourceMappingURL=build-helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-helpers.js","sourceRoot":"","sources":["../../src/lib/build-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"build-helpers.js","sourceRoot":"","sources":["../../src/lib/build-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,6 +33,6 @@ export declare function buildRssFeed(outputDir: string, timelineEntries: Timelin
|
|
|
33
33
|
*/
|
|
34
34
|
export declare function processTimelineEntries(logbookEntries: EntryMeta[], activeEntry: {
|
|
35
35
|
slug: string;
|
|
36
|
-
} | null | undefined, availableWorkspaces: string[]): (TimelineEntry & {
|
|
36
|
+
} | null | undefined, availableWorkspaces: string[]): Promise<(TimelineEntry & {
|
|
37
37
|
monthGroup: string;
|
|
38
|
-
})[]
|
|
38
|
+
})[]>;
|
package/dist/lib/build-steps.js
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
* Breaks down the monolithic build() function into testable, reusable steps.
|
|
4
4
|
*/
|
|
5
5
|
import fs from 'fs-extra';
|
|
6
|
-
import { join } from 'node:path';
|
|
6
|
+
import { join, relative } from 'node:path';
|
|
7
7
|
import { warning, error, neutral } from './theme.js';
|
|
8
8
|
import { URL, fileURLToPath } from 'node:url';
|
|
9
|
-
import { mdToHtmlWithImages, copyImages } from './image-helpers.js';
|
|
9
|
+
import { mdToHtmlWithImages, copyImages, extractImagePathsFromMarkdown, getImageDimensions } from './image-helpers.js';
|
|
10
10
|
import { getStyles } from './styles.js';
|
|
11
11
|
import { getClientScript } from './logbook-client.js';
|
|
12
12
|
import { mdToHtml } from './build-helpers.js';
|
|
@@ -94,7 +94,7 @@ export async function buildRssFeed(outputDir, timelineEntries, config, version)
|
|
|
94
94
|
/**
|
|
95
95
|
* Processes raw logbook entry metadata into chronological timeline entries.
|
|
96
96
|
*/
|
|
97
|
-
export function processTimelineEntries(logbookEntries, activeEntry, availableWorkspaces) {
|
|
97
|
+
export async function processTimelineEntries(logbookEntries, activeEntry, availableWorkspaces) {
|
|
98
98
|
const timelineEntries = [];
|
|
99
99
|
for (const entry of logbookEntries) {
|
|
100
100
|
if (!entry.hasIndex)
|
|
@@ -128,6 +128,32 @@ export function processTimelineEntries(logbookEntries, activeEntry, availableWor
|
|
|
128
128
|
: dateEndValue instanceof Date
|
|
129
129
|
? dateEndValue.toISOString()
|
|
130
130
|
: undefined;
|
|
131
|
+
// Extract first image from index.md to use as a teaser image
|
|
132
|
+
let teaserImage;
|
|
133
|
+
const imagePaths = extractImagePathsFromMarkdown(content);
|
|
134
|
+
if (imagePaths.length > 0) {
|
|
135
|
+
const firstImage = imagePaths[0];
|
|
136
|
+
if (!firstImage.startsWith('http://') &&
|
|
137
|
+
!firstImage.startsWith('https://') &&
|
|
138
|
+
!firstImage.startsWith('/') &&
|
|
139
|
+
!firstImage.startsWith('data:')) {
|
|
140
|
+
try {
|
|
141
|
+
const absoluteImagePath = join(entry.path, firstImage);
|
|
142
|
+
const dims = await getImageDimensions(absoluteImagePath);
|
|
143
|
+
if (dims) {
|
|
144
|
+
const ratio = dims.width / dims.height;
|
|
145
|
+
const imageName = relative(entry.path, absoluteImagePath).replace(/\\/g, '/');
|
|
146
|
+
teaserImage = {
|
|
147
|
+
src: `./${slug}/images/${imageName}`,
|
|
148
|
+
ratio,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// On error, skip image
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
131
157
|
timelineEntries.push({
|
|
132
158
|
kind: 'entry',
|
|
133
159
|
slug,
|
|
@@ -144,6 +170,7 @@ export function processTimelineEntries(logbookEntries, activeEntry, availableWor
|
|
|
144
170
|
harness: toDisplayString(data.harness),
|
|
145
171
|
llm: toDisplayString(data.llm),
|
|
146
172
|
prompter: toDisplayString(data.prompter),
|
|
173
|
+
teaserImage,
|
|
147
174
|
});
|
|
148
175
|
}
|
|
149
176
|
return timelineEntries;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-steps.js","sourceRoot":"","sources":["../../src/lib/build-steps.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"build-steps.js","sourceRoot":"","sources":["../../src/lib/build-steps.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -11,6 +11,13 @@ export interface LogbookConfig {
|
|
|
11
11
|
allowed: string[];
|
|
12
12
|
};
|
|
13
13
|
adrDir?: string;
|
|
14
|
+
researchDir?: string;
|
|
15
|
+
customTypes?: Record<string, {
|
|
16
|
+
prefix: string;
|
|
17
|
+
dir: string;
|
|
18
|
+
tabTitle: string;
|
|
19
|
+
sortBy?: 'dateStart' | 'updated';
|
|
20
|
+
}>;
|
|
14
21
|
}
|
|
15
22
|
export declare const DEFAULT_CONFIG: LogbookConfig;
|
|
16
23
|
export declare function getConfig(cwd?: string): LogbookConfig;
|
|
@@ -37,3 +44,10 @@ export declare function getOutputDirPath(config: LogbookConfig, cwd?: string): s
|
|
|
37
44
|
* @returns Absolute path to the ADR directory or null if not configured
|
|
38
45
|
*/
|
|
39
46
|
export declare function getAdrDirPath(config: LogbookConfig, cwd?: string): string | null;
|
|
47
|
+
/**
|
|
48
|
+
* Get the absolute path to the Research directory.
|
|
49
|
+
* @param config - The logbook config
|
|
50
|
+
* @param cwd - Optional working directory (defaults to process.cwd())
|
|
51
|
+
* @returns Absolute path to the Research directory or null if not configured
|
|
52
|
+
*/
|
|
53
|
+
export declare function getResearchDirPath(config: LogbookConfig, cwd?: string): string | null;
|
package/dist/lib/config.js
CHANGED
|
@@ -22,6 +22,7 @@ export const DEFAULT_CONFIG = {
|
|
|
22
22
|
outputDir: 'dist/logbook',
|
|
23
23
|
primaryColor: '#2563eb',
|
|
24
24
|
adrDir: 'docs/adr',
|
|
25
|
+
researchDir: 'docs/research',
|
|
25
26
|
tags: {
|
|
26
27
|
allowed: ['#bugfix', '#feature', '#refactor'],
|
|
27
28
|
},
|
|
@@ -80,4 +81,13 @@ export function getOutputDirPath(config, cwd = process.cwd()) {
|
|
|
80
81
|
export function getAdrDirPath(config, cwd = process.cwd()) {
|
|
81
82
|
return config.adrDir ? join(cwd, config.adrDir) : null;
|
|
82
83
|
}
|
|
84
|
+
/**
|
|
85
|
+
* Get the absolute path to the Research directory.
|
|
86
|
+
* @param config - The logbook config
|
|
87
|
+
* @param cwd - Optional working directory (defaults to process.cwd())
|
|
88
|
+
* @returns Absolute path to the Research directory or null if not configured
|
|
89
|
+
*/
|
|
90
|
+
export function getResearchDirPath(config, cwd = process.cwd()) {
|
|
91
|
+
return config.researchDir ? join(cwd, config.researchDir) : null;
|
|
92
|
+
}
|
|
83
93
|
//# sourceMappingURL=config.js.map
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE3E,MAAM,UAAU,aAAa,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QACtD,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC;QAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAAE,OAAO,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7C,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { escapeHtml } from './html-escape.js';
|
|
2
|
+
import { html, renderTagsAndWorkspaces } from './template-helpers.js';
|
|
3
|
+
import { formatAbsoluteDate } from '../utils/date.js';
|
|
4
|
+
function getCustomStatusInfo(status) {
|
|
5
|
+
let badgeClass = 'tag-badge';
|
|
6
|
+
let icon = '💡';
|
|
7
|
+
const norm = status.toLowerCase();
|
|
8
|
+
if (norm === 'completed') {
|
|
9
|
+
badgeClass += ' tag-feature';
|
|
10
|
+
icon = '✅';
|
|
11
|
+
}
|
|
12
|
+
else if (norm === 'active') {
|
|
13
|
+
badgeClass += ' tag-refactor';
|
|
14
|
+
icon = '⚡';
|
|
15
|
+
}
|
|
16
|
+
else if (norm === 'paused') {
|
|
17
|
+
badgeClass += ' tag-superseded';
|
|
18
|
+
icon = '⏸';
|
|
19
|
+
}
|
|
20
|
+
else if (norm === 'postponed') {
|
|
21
|
+
badgeClass += ' tag-bugfix';
|
|
22
|
+
icon = '⏳';
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
badgeClass += ' tag-workspace';
|
|
26
|
+
}
|
|
27
|
+
return { badgeClass, icon };
|
|
28
|
+
}
|
|
29
|
+
export const renderCustomCard = (e, folderName = 'research', indicatorLabel = 'RESEARCH') => {
|
|
30
|
+
const ticket = e.ticket ? escapeHtml(e.ticket) : '';
|
|
31
|
+
const title = e.title ? escapeHtml(e.title) : '';
|
|
32
|
+
const prompter = e.prompter ? escapeHtml(e.prompter) : '';
|
|
33
|
+
const summary = e.summary ? escapeHtml(e.summary) : '';
|
|
34
|
+
const status = e.status || 'active';
|
|
35
|
+
const displayDate = escapeHtml(e.displayDate);
|
|
36
|
+
const { badgeClass: statusBadgeClass, icon: statusIcon } = getCustomStatusInfo(status);
|
|
37
|
+
return html `<div class="timeline-item">
|
|
38
|
+
<a class="timeline-card timeline-card--adr" href="./${escapeHtml(folderName)}/${e.slug}/index.html"
|
|
39
|
+
><div class="item-content">
|
|
40
|
+
<div class="item-meta">
|
|
41
|
+
<span>Last Updated: ${escapeHtml(formatAbsoluteDate(e.updated || e.dateStart))}</span> • Created on
|
|
42
|
+
${displayDate} ${prompter ? `by ${prompter}` : ''}
|
|
43
|
+
</div>
|
|
44
|
+
<h3 class="item-title">
|
|
45
|
+
<span class="${statusBadgeClass} adr-status-badge">${statusIcon} ${status}</span>
|
|
46
|
+
${ticket ? `${ticket}: ` : ''}${title}
|
|
47
|
+
</h3>
|
|
48
|
+
<div class="item-summary">${summary}</div>
|
|
49
|
+
<div class="tags-wrapper">
|
|
50
|
+
<span class="tag-badge adr-indicator-badge">${escapeHtml(indicatorLabel)}</span>
|
|
51
|
+
${renderTagsAndWorkspaces(e.tags, e.workspaces)}
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
<span class="item-arrow">›</span></a
|
|
55
|
+
>
|
|
56
|
+
</div>`;
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=custom-card-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-card-renderer.js","sourceRoot":"","sources":["../../src/lib/custom-card-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGtD,SAAS,mBAAmB,CAAC,MAAc;IACzC,IAAI,UAAU,GAAG,WAAW,CAAC;IAC7B,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,UAAU,IAAI,cAAc,CAAC;QAC7B,IAAI,GAAG,GAAG,CAAC;IACb,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,UAAU,IAAI,eAAe,CAAC;QAC9B,IAAI,GAAG,GAAG,CAAC;IACb,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,UAAU,IAAI,iBAAiB,CAAC;QAChC,IAAI,GAAG,GAAG,CAAC;IACb,CAAC;SAAM,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,UAAU,IAAI,aAAa,CAAC;QAC5B,IAAI,GAAG,GAAG,CAAC;IACb,CAAC;SAAM,CAAC;QACN,UAAU,IAAI,gBAAgB,CAAC;IACjC,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,CAAuB,EACvB,UAAU,GAAG,UAAU,EACvB,cAAc,GAAG,UAAU,EACnB,EAAE;IACV,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1D,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,QAAQ,CAAC;IACpC,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAE9C,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAEvF,OAAO,IAAI,CAAA;0DAC6C,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI;;;gCAG1D,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;YAC5E,WAAW,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;;;yBAGlC,gBAAgB,sBAAsB,UAAU,IAAI,MAAM;YACvE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK;;oCAEX,OAAO;;wDAEa,UAAU,CAAC,cAAc,CAAC;YACtE,uBAAuB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC;;;;;SAKhD,CAAC;AACV,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { LogbookConfig } from './config.js';
|
|
2
|
+
import type { TimelineResearchItem } from './template-types.js';
|
|
3
|
+
import type { ActiveEntryResult } from './session.js';
|
|
4
|
+
export declare function loadCustomTypesData(config: LogbookConfig, projectRoot: string, activeEntry: ActiveEntryResult | undefined, availableWorkspaces: string[]): Promise<Record<string, TimelineResearchItem[]>>;
|