project-logbook 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -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.d.ts +4 -1
- package/dist/commands/new.js +72 -52
- 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.js +27 -8
- 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 +4 -2
- 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 +1 -1
- package/dist/lib/build-helpers.js +16 -4
- 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/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 +10 -1
- package/dist/templates/log.md +1 -1
- package/dist/templates/styles.css +32 -0
- package/package.json +4 -4
- package/src/templates/CONTRIBUTING.md +10 -1
- package/src/templates/log.md +1 -1
- package/src/templates/styles.css +32 -0
package/dist/lib/templates.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import { ATTR_PAGE_SLUG
|
|
2
|
-
import { escapeHtml
|
|
3
|
-
import { html,
|
|
1
|
+
import { ATTR_PAGE_SLUG } from './html-attributes.js';
|
|
2
|
+
import { escapeHtml } from './html-escape.js';
|
|
3
|
+
import { html, renderTimelineEntryItem, renderTimelineCommitItem, renderTimelineTagItem, renderTimelineAdrItem, paginationLinks, } from './template-helpers.js';
|
|
4
|
+
import { renderCustomCard } from './custom-card-renderer.js';
|
|
5
|
+
import { autolinkReferences, getRegisteredResearchEntries } from './autolink.js';
|
|
6
|
+
export { postTemplate } from './post-template.js';
|
|
4
7
|
export const tabsComponent = (tabs, defaultActive = 0) => {
|
|
5
8
|
const tabsHtml = tabs
|
|
6
9
|
.map((tab, index) => `<div class="tab ${index === defaultActive ? 'active' : ''}" role="tab" aria-selected="${index === defaultActive}" aria-controls="${escapeHtml(tab.id)}" tabindex="${index === defaultActive ? '0' : '-1'}" onclick="showTab(event, '${escapeHtml(tab.id)}')">${escapeHtml(tab.title)}</div>`)
|
|
@@ -13,6 +16,9 @@ export const tabsComponent = (tabs, defaultActive = 0) => {
|
|
|
13
16
|
export const layout = ({ title, header, content, projectName, basePath = './', description, bodySlug, buildMeta, includeRssLink = false, prevUrl, nextUrl, }) => {
|
|
14
17
|
const metaDescription = description ||
|
|
15
18
|
`A chronological timeline of recent development changes, narrative updates, and commits for ${projectName}.`;
|
|
19
|
+
const registeredResearchEntries = getRegisteredResearchEntries();
|
|
20
|
+
const processedHeader = registeredResearchEntries.length > 0 ? autolinkReferences(header, registeredResearchEntries, basePath) : header;
|
|
21
|
+
const processedContent = registeredResearchEntries.length > 0 ? autolinkReferences(content, registeredResearchEntries, basePath) : content;
|
|
16
22
|
return html `<!DOCTYPE html>
|
|
17
23
|
<html lang="en">
|
|
18
24
|
<head>
|
|
@@ -26,7 +32,7 @@ export const layout = ({ title, header, content, projectName, basePath = './', d
|
|
|
26
32
|
<link rel="stylesheet" href="${basePath}style.css">
|
|
27
33
|
</head>
|
|
28
34
|
<body${bodySlug ? ` ${ATTR_PAGE_SLUG}="${bodySlug}"` : ''} class="tabs-wrapper">
|
|
29
|
-
${
|
|
35
|
+
${processedHeader}<main>${processedContent}</main>
|
|
30
36
|
<footer>
|
|
31
37
|
${buildMeta ? `<p class="build-time">${buildMeta}${includeRssLink ? ` • <a href="${basePath}rss.xml">RSS Feed</a>` : ''}</p>` : ''}
|
|
32
38
|
</footer>
|
|
@@ -61,11 +67,35 @@ export const timelineTemplate = (props) => {
|
|
|
61
67
|
.join('')}
|
|
62
68
|
${paginationLinks(currentPage, totalPages)}
|
|
63
69
|
</div>`;
|
|
64
|
-
const {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
70
|
+
const tabs = [{ id: 'timeline', title: 'Timeline', content: timelineTab }];
|
|
71
|
+
if (props.adrItems && props.adrItems.length > 0) {
|
|
72
|
+
const adrTabHtml = html `
|
|
73
|
+
<div class="timeline">${props.adrItems.map((item) => renderTimelineAdrItem(item)).join('')}</div>
|
|
74
|
+
`;
|
|
75
|
+
tabs.push({ id: 'adrs', title: 'ADRs', content: adrTabHtml });
|
|
76
|
+
}
|
|
77
|
+
if (props.researchEntries && props.researchEntries.length > 0) {
|
|
78
|
+
const researchHtml = html `
|
|
79
|
+
<div class="timeline">
|
|
80
|
+
${props.researchEntries.map((e) => renderCustomCard(e, 'research', 'RESEARCH')).join('')}
|
|
81
|
+
</div>
|
|
82
|
+
`;
|
|
83
|
+
tabs.push({ id: 'research', title: 'Research', content: researchHtml });
|
|
84
|
+
}
|
|
85
|
+
if (props.customTabs) {
|
|
86
|
+
for (const tab of props.customTabs) {
|
|
87
|
+
if (tab.items && tab.items.length > 0) {
|
|
88
|
+
const tabHtml = html `
|
|
89
|
+
<div class="timeline">
|
|
90
|
+
${tab.items.map((e) => renderCustomCard(e, tab.id, tab.title.toUpperCase())).join('')}
|
|
91
|
+
</div>
|
|
92
|
+
`;
|
|
93
|
+
tabs.push({ id: tab.id, title: tab.title, content: tabHtml });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
tabs.push({ id: 'readme', title: 'Project Readme', content: readmeHtml || '<p>No README available.</p>' }, { id: 'about', title: 'About this Logbook', content: aboutHtml || '<p>No information available.</p>' });
|
|
98
|
+
const { tabsHtml, sectionsHtml } = tabsComponent(tabs, 0);
|
|
69
99
|
const header = html `<header>
|
|
70
100
|
<div class="header-inner">
|
|
71
101
|
<h1><a href="./index.html">${escapeHtml(projectName)}</a></h1>
|
|
@@ -77,48 +107,4 @@ export const timelineTemplate = (props) => {
|
|
|
77
107
|
</header>`;
|
|
78
108
|
return { header, content: sectionsHtml };
|
|
79
109
|
};
|
|
80
|
-
export const postTemplate = (props) => {
|
|
81
|
-
const { title, displayDate, dateStart, harness, llm, prompter, content, ticketHtml, logHtml, commits, version, jiraUrl, repositoryUrl, prevEntry, nextEntry, tags, workspaces } = props; // prettier-ignore
|
|
82
|
-
// Validate jiraUrl scheme to prevent javascript: URLs
|
|
83
|
-
const validatedJiraUrl = jiraUrl ? validateUrlScheme(jiraUrl) : undefined;
|
|
84
|
-
const jiraBtn = validatedJiraUrl
|
|
85
|
-
? `<a href="${escapeHtml(validatedJiraUrl)}" class="jira-link-btn" target="_blank" rel="noopener noreferrer">View in Jira ↗</a>`
|
|
86
|
-
: '';
|
|
87
|
-
const tabBtn = (id, label, active = false) => `<div class="tab${active ? ' active' : ''}" role="tab" aria-selected="${active}" aria-controls="${escapeHtml(id)}" tabindex="${active ? '0' : '-1'}" onclick="showTab(event, '${escapeHtml(id)}')">${escapeHtml(label)}</div>`;
|
|
88
|
-
const header = html `<header>
|
|
89
|
-
<div class="header-inner">
|
|
90
|
-
<h1>${escapeHtml(title)}</h1>
|
|
91
|
-
<div class="tagline">
|
|
92
|
-
<span ${ATTR_DATA_DATE}="${dateStart}">${displayDate}</span> •
|
|
93
|
-
${llm ? `${escapeHtml(llm)} via ` : ''}${escapeHtml(harness)}${prompter ? ` / ${escapeHtml(prompter)}` : ''} •
|
|
94
|
-
v${version}
|
|
95
|
-
</div>
|
|
96
|
-
<div class="header-nav">
|
|
97
|
-
<div class="header-nav-left">
|
|
98
|
-
<a href="../index.html" class="back-link">← Back to Timeline</a>
|
|
99
|
-
</div>
|
|
100
|
-
<div class="tabs" role="tablist" aria-label="Entry sections">
|
|
101
|
-
${tabBtn('story', 'Story', true)}${tabBtn('spec', 'Original Spec')}${tabBtn('log', 'Technical Log')}
|
|
102
|
-
</div>
|
|
103
|
-
<div class="header-nav-right">${jiraBtn ? `${jiraBtn}` : '<span></span>'}</div>
|
|
104
|
-
</div>
|
|
105
|
-
</div>
|
|
106
|
-
</header>`;
|
|
107
|
-
const mainContent = html `<article>
|
|
108
|
-
<div class="content-sections">
|
|
109
|
-
<div id="story" class="content-section" role="tabpanel">
|
|
110
|
-
${renderTagsAndWorkspaces(tags, workspaces)}${content}
|
|
111
|
-
</div>
|
|
112
|
-
<div id="spec" class="content-section" role="tabpanel" style="display:none;">${ticketHtml}</div>
|
|
113
|
-
<div id="log" class="content-section" role="tabpanel" style="display:none;">
|
|
114
|
-
${logHtml}${renderCommits(commits, repositoryUrl)}
|
|
115
|
-
</div>
|
|
116
|
-
</div>
|
|
117
|
-
<nav class="post-nav">
|
|
118
|
-
<div class="post-nav-prev">${prevEntry ? navLink(prevEntry, 'prev') : '<span></span>'}</div>
|
|
119
|
-
<div class="post-nav-next">${nextEntry ? navLink(nextEntry, 'next') : '<span></span>'}</div>
|
|
120
|
-
</nav>
|
|
121
|
-
</article>`;
|
|
122
|
-
return { header, content: mainContent };
|
|
123
|
-
};
|
|
124
110
|
//# sourceMappingURL=templates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,IAAI,EACJ,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAEjF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAiB,EAAE,gBAAwB,CAAC,EAAE,EAAE;IAC5E,MAAM,QAAQ,GAAG,IAAI;SAClB,GAAG,CACF,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CACb,mBAAmB,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,+BAA+B,KAAK,KAAK,aAAa,oBAAoB,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,8BAA8B,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAChS;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,YAAY,GAAG,IAAI;SACtB,GAAG,CACF,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CACb,YAAY,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,oDAAoD,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,GAAG,CAAC,OAAO,QAAQ,CAC3J;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AACpC,CAAC,CAAC;AAeF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,EACrB,KAAK,EACL,MAAM,EACN,OAAO,EACP,WAAW,EACX,QAAQ,GAAG,IAAI,EACf,WAAW,EACX,QAAQ,EACR,SAAS,EACT,cAAc,GAAG,KAAK,EACtB,OAAO,EACP,OAAO,GACK,EAAE,EAAE;IAChB,MAAM,eAAe,GACnB,WAAW;QACX,8FAA8F,WAAW,GAAG,CAAC;IAE/G,MAAM,yBAAyB,GAAG,4BAA4B,EAAE,CAAC;IACjE,MAAM,eAAe,GACnB,yBAAyB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,yBAAyB,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAClH,MAAM,gBAAgB,GACpB,yBAAyB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAEpH,OAAO,IAAI,CAAA;;;;aAIA,UAAU,CAAC,KAAK,CAAC,MAAM,UAAU,CAAC,WAAW,CAAC;wCACnB,UAAU,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;MACvG,cAAc,CAAC,CAAC,CAAC,gGAAgG,QAAQ,WAAW,CAAC,CAAC,CAAC,EAAE;MACzI,OAAO,CAAC,CAAC,CAAC,0BAA0B,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;MAChE,OAAO,CAAC,CAAC,CAAC,0BAA0B,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;kDACpB,QAAQ;mCACvB,QAAQ;;OAEpC,QAAQ,CAAC,CAAC,CAAC,IAAI,cAAc,KAAK,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE;MACnD,eAAe,SAAS,gBAAgB;;QAEtC,SAAS,CAAC,CAAC,CAAC,yBAAyB,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,eAAe,QAAQ,uBAAuB,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE;;mBAErH,QAAQ;eACZ,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,KAA2D,EACtB,EAAE;IACvC,MAAM,EACJ,WAAW,EACX,MAAM,EACN,UAAU,EACV,SAAS,EACT,WAAW,EACX,WAAW,EACX,UAAU,EACV,aAAa,EACb,WAAW,EACX,UAAU,GACX,GAAG,KAAK,CAAC;IACV,MAAM,iBAAiB,GAAG,WAAW;QACnC,CAAC,CAAC;;+CAEyC,WAAW;cAC5C;QACV,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,WAAW,GAAG,IAAI,CAAA,GAAG,iBAAiB;;QAEtC,MAAM;SACL,GAAG,CACF,CAAC,CAAgB,EAAE,EAAE,CACnB,IAAI,CAAA;oBACI,CAAC,CAAC,KAAK;gBACX,CAAC,CAAC,KAAK;SACN,GAAG,CAAC,CAAC,IAAkB,EAAE,EAAE;QAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAChE,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,qBAAqB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC3E,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC5D,OAAO,wBAAwB,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IAChF,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC;uBACF,CACd;SACA,IAAI,CAAC,EAAE,CAAC;QACT,eAAe,CAAC,WAAY,EAAE,UAAW,CAAC;WACvC,CAAC;IACV,MAAM,IAAI,GAAG,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IAE3E,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,UAAU,GAAG,IAAI,CAAA;8BACG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;KAC3F,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,MAAM,YAAY,GAAG,IAAI,CAAA;;UAEnB,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;KAE3F,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACnC,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,MAAM,OAAO,GAAG,IAAI,CAAA;;cAEd,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;SAExF,CAAC;gBACF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,CACP,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,IAAI,6BAA6B,EAAE,EAC/F,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,SAAS,IAAI,kCAAkC,EAAE,CACvG,CAAC;IAEF,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,CAAA;;mCAEc,UAAU,CAAC,WAAW,CAAC;;;kFAGwB,QAAQ;;;YAG9E,CAAC;IACX,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AAC3C,CAAC,CAAC"}
|
|
@@ -84,4 +84,13 @@ If `jiraPrefix` is configured, entry folder names and ticket references must mat
|
|
|
84
84
|
## Tone & Style
|
|
85
85
|
- **Narrative over Lists**: In `index.md`, tell a story. Why did we make this change? What were the challenges?
|
|
86
86
|
- **Technical Precision**: In `log.md`, be specific. Mention file paths, error messages, and specific design patterns. Log in real time — do not reconstruct after the fact.
|
|
87
|
-
- **No Boilerplate in Commits**: All template placeholders must be replaced or removed before `logbook release`.
|
|
87
|
+
- **No Boilerplate in Commits**: All template placeholders must be replaced or removed before `logbook release`.
|
|
88
|
+
|
|
89
|
+
## Research Logs
|
|
90
|
+
For exploratory research, technical spike investigations, and architectural decision groundwork, we use **Research Logs**.
|
|
91
|
+
- **Location**: Stored in `docs/research/` (configurable via `researchDir`).
|
|
92
|
+
- **Scaffolding**: Run `logbook new [ID] [Slug] --research` or `logbook new -r` to scaffold. This automatically generates a numeric ID prefixed with `RES-` (e.g. `RES-1`).
|
|
93
|
+
- **Commands**: Commands like `logbook start RES-1`, `logbook log`, and `logbook release` work transparently.
|
|
94
|
+
- **Auto-Activity Tracking**: Writing a log message via `logbook log` automatically updates the `updated` frontmatter field inside the research log's `index.md`.
|
|
95
|
+
- **Status Lifecycle**: The frontmatter `status` field tracks progress: `active`, `paused`, `postponed`, or `completed`.
|
|
96
|
+
- **Visuals**: Research logs are compiled and displayed under a dedicated "Research" tab on the built logbook homepage, sorted by their latest `updated` date.
|
package/dist/templates/log.md
CHANGED
|
@@ -169,6 +169,38 @@ main {
|
|
|
169
169
|
transform: translateX(4px);
|
|
170
170
|
}
|
|
171
171
|
|
|
172
|
+
.teaser-image-right {
|
|
173
|
+
flex-shrink: 0;
|
|
174
|
+
max-width: 200px;
|
|
175
|
+
max-height: 120px;
|
|
176
|
+
display: flex;
|
|
177
|
+
align-items: center;
|
|
178
|
+
justify-content: center;
|
|
179
|
+
overflow: hidden;
|
|
180
|
+
border-radius: 4px;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.teaser-image-right img {
|
|
184
|
+
max-width: 100%;
|
|
185
|
+
max-height: 100%;
|
|
186
|
+
object-fit: contain;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.teaser-image-bottom {
|
|
190
|
+
margin-top: 0.75rem;
|
|
191
|
+
display: flex;
|
|
192
|
+
justify-content: center;
|
|
193
|
+
align-items: center;
|
|
194
|
+
width: 100%;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.teaser-image-bottom img {
|
|
198
|
+
max-width: 100%;
|
|
199
|
+
max-height: 200px;
|
|
200
|
+
object-fit: contain;
|
|
201
|
+
border-radius: 4px;
|
|
202
|
+
}
|
|
203
|
+
|
|
172
204
|
/* Post Page */
|
|
173
205
|
.back-link {
|
|
174
206
|
display: inline-flex;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "project-logbook",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "A command-line tool for project logbooks.",
|
|
5
5
|
"workspaces": [
|
|
6
6
|
"demo-app"
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"madge": "madge --circular --extensions ts --ts-config ./tsconfig.json src/index.ts",
|
|
28
28
|
"jscpd": "jscpd src",
|
|
29
29
|
"test": "vitest run",
|
|
30
|
-
"pre": "npm run format && npm run lint && npm
|
|
30
|
+
"pre": "npm run format && npm run lint && npm run test && npm run build && npm run knip && npm run madge && npm run jscpd && npm run dev build && npm run dev lint && npm audit",
|
|
31
31
|
"next": "node scripts/create-ticket-from-backlog.js",
|
|
32
32
|
"link": "npm run build && npm link",
|
|
33
33
|
"open": "npm run dev build && node scripts/open-and-view-dist.js"
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"@types/rss": "^0.0.32",
|
|
47
47
|
"@typescript-eslint/eslint-plugin": "^8.32.1",
|
|
48
48
|
"@typescript-eslint/parser": "^8.32.1",
|
|
49
|
-
"@vitest/coverage-v8": "^
|
|
49
|
+
"@vitest/coverage-v8": "^4.1.8",
|
|
50
50
|
"cross-env": "^7.0.3",
|
|
51
51
|
"eslint": "^9.27.0",
|
|
52
52
|
"jscpd": "^4.2.4",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"rimraf": "^6.1.3",
|
|
57
57
|
"tsx": "^4.21.0",
|
|
58
58
|
"typescript": "^6.0.3",
|
|
59
|
-
"vitest": "^
|
|
59
|
+
"vitest": "^4.1.8"
|
|
60
60
|
},
|
|
61
61
|
"overrides": {
|
|
62
62
|
"typescript": "^6.0.3"
|
|
@@ -84,4 +84,13 @@ If `jiraPrefix` is configured, entry folder names and ticket references must mat
|
|
|
84
84
|
## Tone & Style
|
|
85
85
|
- **Narrative over Lists**: In `index.md`, tell a story. Why did we make this change? What were the challenges?
|
|
86
86
|
- **Technical Precision**: In `log.md`, be specific. Mention file paths, error messages, and specific design patterns. Log in real time — do not reconstruct after the fact.
|
|
87
|
-
- **No Boilerplate in Commits**: All template placeholders must be replaced or removed before `logbook release`.
|
|
87
|
+
- **No Boilerplate in Commits**: All template placeholders must be replaced or removed before `logbook release`.
|
|
88
|
+
|
|
89
|
+
## Research Logs
|
|
90
|
+
For exploratory research, technical spike investigations, and architectural decision groundwork, we use **Research Logs**.
|
|
91
|
+
- **Location**: Stored in `docs/research/` (configurable via `researchDir`).
|
|
92
|
+
- **Scaffolding**: Run `logbook new [ID] [Slug] --research` or `logbook new -r` to scaffold. This automatically generates a numeric ID prefixed with `RES-` (e.g. `RES-1`).
|
|
93
|
+
- **Commands**: Commands like `logbook start RES-1`, `logbook log`, and `logbook release` work transparently.
|
|
94
|
+
- **Auto-Activity Tracking**: Writing a log message via `logbook log` automatically updates the `updated` frontmatter field inside the research log's `index.md`.
|
|
95
|
+
- **Status Lifecycle**: The frontmatter `status` field tracks progress: `active`, `paused`, `postponed`, or `completed`.
|
|
96
|
+
- **Visuals**: Research logs are compiled and displayed under a dedicated "Research" tab on the built logbook homepage, sorted by their latest `updated` date.
|
package/src/templates/log.md
CHANGED
package/src/templates/styles.css
CHANGED
|
@@ -169,6 +169,38 @@ main {
|
|
|
169
169
|
transform: translateX(4px);
|
|
170
170
|
}
|
|
171
171
|
|
|
172
|
+
.teaser-image-right {
|
|
173
|
+
flex-shrink: 0;
|
|
174
|
+
max-width: 200px;
|
|
175
|
+
max-height: 120px;
|
|
176
|
+
display: flex;
|
|
177
|
+
align-items: center;
|
|
178
|
+
justify-content: center;
|
|
179
|
+
overflow: hidden;
|
|
180
|
+
border-radius: 4px;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.teaser-image-right img {
|
|
184
|
+
max-width: 100%;
|
|
185
|
+
max-height: 100%;
|
|
186
|
+
object-fit: contain;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.teaser-image-bottom {
|
|
190
|
+
margin-top: 0.75rem;
|
|
191
|
+
display: flex;
|
|
192
|
+
justify-content: center;
|
|
193
|
+
align-items: center;
|
|
194
|
+
width: 100%;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.teaser-image-bottom img {
|
|
198
|
+
max-width: 100%;
|
|
199
|
+
max-height: 200px;
|
|
200
|
+
object-fit: contain;
|
|
201
|
+
border-radius: 4px;
|
|
202
|
+
}
|
|
203
|
+
|
|
172
204
|
/* Post Page */
|
|
173
205
|
.back-link {
|
|
174
206
|
display: inline-flex;
|