youmd 0.6.21 → 0.6.27
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/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +0 -1
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +283 -184
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/export.d.ts +1 -0
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +5 -0
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +21 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/keys.d.ts.map +1 -1
- package/dist/commands/keys.js +3 -3
- package/dist/commands/keys.js.map +1 -1
- package/dist/commands/link.d.ts.map +1 -1
- package/dist/commands/link.js +3 -3
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/login.d.ts +29 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +256 -127
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logs.js +0 -1
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/mcp.d.ts +14 -0
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +284 -28
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/okf.d.ts +12 -0
- package/dist/commands/okf.d.ts.map +1 -0
- package/dist/commands/okf.js +411 -0
- package/dist/commands/okf.js.map +1 -0
- package/dist/commands/private.d.ts.map +1 -1
- package/dist/commands/private.js +6 -5
- package/dist/commands/private.js.map +1 -1
- package/dist/commands/project.d.ts.map +1 -1
- package/dist/commands/project.js +9 -5
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +0 -1
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/pull.d.ts +24 -1
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +114 -14
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/push.d.ts +1 -0
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +33 -13
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/register.d.ts +6 -0
- package/dist/commands/register.d.ts.map +1 -1
- package/dist/commands/register.js +179 -79
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/skill.d.ts.map +1 -1
- package/dist/commands/skill.js +121 -50
- package/dist/commands/skill.js.map +1 -1
- package/dist/commands/stack.d.ts +16 -0
- package/dist/commands/stack.d.ts.map +1 -0
- package/dist/commands/stack.js +863 -0
- package/dist/commands/stack.js.map +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +25 -5
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/sync.d.ts +23 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +193 -12
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +21 -16
- package/dist/commands/whoami.js.map +1 -1
- package/dist/create.js +0 -0
- package/dist/index.js +64 -7
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +127 -5
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +142 -5
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/ascii.d.ts +1 -0
- package/dist/lib/ascii.d.ts.map +1 -1
- package/dist/lib/ascii.js +9 -26
- package/dist/lib/ascii.js.map +1 -1
- package/dist/lib/canonical-json.d.ts +8 -0
- package/dist/lib/canonical-json.d.ts.map +1 -0
- package/dist/lib/canonical-json.js +29 -0
- package/dist/lib/canonical-json.js.map +1 -0
- package/dist/lib/capability-router.d.ts +58 -0
- package/dist/lib/capability-router.d.ts.map +1 -0
- package/dist/lib/capability-router.js +54 -0
- package/dist/lib/capability-router.js.map +1 -0
- package/dist/lib/compiler.d.ts +32 -0
- package/dist/lib/compiler.d.ts.map +1 -1
- package/dist/lib/compiler.js +150 -0
- package/dist/lib/compiler.js.map +1 -1
- package/dist/lib/config.d.ts +71 -35
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +334 -124
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/decompile.d.ts +6 -1
- package/dist/lib/decompile.d.ts.map +1 -1
- package/dist/lib/decompile.js +120 -11
- package/dist/lib/decompile.js.map +1 -1
- package/dist/lib/hash.d.ts.map +1 -1
- package/dist/lib/hash.js +2 -19
- package/dist/lib/hash.js.map +1 -1
- package/dist/lib/heartbeat.d.ts +38 -0
- package/dist/lib/heartbeat.d.ts.map +1 -0
- package/dist/lib/heartbeat.js +70 -0
- package/dist/lib/heartbeat.js.map +1 -0
- package/dist/lib/host-link.d.ts +123 -0
- package/dist/lib/host-link.d.ts.map +1 -0
- package/dist/lib/host-link.js +350 -0
- package/dist/lib/host-link.js.map +1 -0
- package/dist/lib/merge.d.ts +50 -0
- package/dist/lib/merge.d.ts.map +1 -0
- package/dist/lib/merge.js +167 -0
- package/dist/lib/merge.js.map +1 -0
- package/dist/lib/okf-bundle.d.ts +104 -0
- package/dist/lib/okf-bundle.d.ts.map +1 -0
- package/dist/lib/okf-bundle.js +473 -0
- package/dist/lib/okf-bundle.js.map +1 -0
- package/dist/lib/okf-health.d.ts +40 -0
- package/dist/lib/okf-health.d.ts.map +1 -0
- package/dist/lib/okf-health.js +152 -0
- package/dist/lib/okf-health.js.map +1 -0
- package/dist/lib/okf-stack.d.ts +47 -0
- package/dist/lib/okf-stack.d.ts.map +1 -0
- package/dist/lib/okf-stack.js +331 -0
- package/dist/lib/okf-stack.js.map +1 -0
- package/dist/lib/okf-view.d.ts +49 -0
- package/dist/lib/okf-view.d.ts.map +1 -0
- package/dist/lib/okf-view.js +197 -0
- package/dist/lib/okf-view.js.map +1 -0
- package/dist/lib/okf.d.ts +130 -0
- package/dist/lib/okf.d.ts.map +1 -0
- package/dist/lib/okf.js +263 -0
- package/dist/lib/okf.js.map +1 -0
- package/dist/lib/onboarding.d.ts +17 -0
- package/dist/lib/onboarding.d.ts.map +1 -1
- package/dist/lib/onboarding.js +224 -207
- package/dist/lib/onboarding.js.map +1 -1
- package/dist/lib/project.d.ts +5 -0
- package/dist/lib/project.d.ts.map +1 -1
- package/dist/lib/project.js +8 -0
- package/dist/lib/project.js.map +1 -1
- package/dist/lib/projectContext.d.ts +201 -0
- package/dist/lib/projectContext.d.ts.map +1 -0
- package/dist/lib/projectContext.js +597 -0
- package/dist/lib/projectContext.js.map +1 -0
- package/dist/lib/render.d.ts +38 -1
- package/dist/lib/render.d.ts.map +1 -1
- package/dist/lib/render.js +83 -18
- package/dist/lib/render.js.map +1 -1
- package/dist/lib/skill-catalog.d.ts.map +1 -1
- package/dist/lib/skill-catalog.js +22 -2
- package/dist/lib/skill-catalog.js.map +1 -1
- package/dist/lib/skills.d.ts +20 -5
- package/dist/lib/skills.d.ts.map +1 -1
- package/dist/lib/skills.js +116 -58
- package/dist/lib/skills.js.map +1 -1
- package/dist/lib/stackEval.d.ts +87 -0
- package/dist/lib/stackEval.d.ts.map +1 -0
- package/dist/lib/stackEval.js +233 -0
- package/dist/lib/stackEval.js.map +1 -0
- package/dist/lib/stackImprove.d.ts +49 -0
- package/dist/lib/stackImprove.d.ts.map +1 -0
- package/dist/lib/stackImprove.js +313 -0
- package/dist/lib/stackImprove.js.map +1 -0
- package/dist/lib/stackInstall.d.ts +59 -0
- package/dist/lib/stackInstall.d.ts.map +1 -0
- package/dist/lib/stackInstall.js +162 -0
- package/dist/lib/stackInstall.js.map +1 -0
- package/dist/lib/stackSafety.d.ts +126 -0
- package/dist/lib/stackSafety.d.ts.map +1 -0
- package/dist/lib/stackSafety.js +486 -0
- package/dist/lib/stackSafety.js.map +1 -0
- package/dist/lib/stackUpdate.d.ts +44 -0
- package/dist/lib/stackUpdate.d.ts.map +1 -0
- package/dist/lib/stackUpdate.js +256 -0
- package/dist/lib/stackUpdate.js.map +1 -0
- package/dist/lib/stream.d.ts +116 -0
- package/dist/lib/stream.d.ts.map +1 -0
- package/dist/lib/stream.js +368 -0
- package/dist/lib/stream.js.map +1 -0
- package/dist/lib/youstack.d.ts +219 -0
- package/dist/lib/youstack.d.ts.map +1 -0
- package/dist/lib/youstack.js +1049 -0
- package/dist/lib/youstack.js.map +1 -0
- package/dist/mcp/registry.d.ts +133 -0
- package/dist/mcp/registry.d.ts.map +1 -0
- package/dist/mcp/registry.js +833 -0
- package/dist/mcp/registry.js.map +1 -0
- package/dist/mcp/server.d.ts +106 -5
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +851 -498
- package/dist/mcp/server.js.map +1 -1
- package/dist/postinstall.js +11 -2
- package/dist/postinstall.js.map +1 -1
- package/dist/you.d.ts +1 -0
- package/dist/you.js +40 -4
- package/dist/you.js.map +1 -1
- package/examples/youstack-bamfstack-public/docs/quickstart.md +34 -0
- package/examples/youstack-bamfstack-public/prompts/creator-draft-starter.md +15 -0
- package/examples/youstack-bamfstack-public/skills/bamfstack-start/SKILL.md +36 -0
- package/examples/youstack-bamfstack-public/tests/smoke.md +19 -0
- package/examples/youstack-bamfstack-public/workflows/creator-growth-workflow.md +22 -0
- package/examples/youstack-bamfstack-public/youstack.json +172 -0
- package/examples/youstack-personal/docs/quickstart.md +10 -0
- package/examples/youstack-personal/skills/youstack-start/SKILL.md +9 -0
- package/examples/youstack-personal/tests/smoke.md +9 -0
- package/examples/youstack-personal/workflows/startup.md +7 -0
- package/examples/youstack-personal/youstack.json +123 -0
- package/package.json +3 -3
- package/skills/claude-md-generator.md +1 -1
- package/skills/meta-improve.md +8 -3
- package/skills/proactive-context-fill.md +1 -1
- package/skills/youstack-maintainer.md +128 -0
- package/skills/youstack-start.md +78 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OKF brain view — a framework-agnostic view model over an OKF bundle plus a
|
|
4
|
+
* self-contained HTML renderer.
|
|
5
|
+
*
|
|
6
|
+
* This is the substrate for two surfaces that should feel identical: the future
|
|
7
|
+
* Obsidian-style desktop client and the web app. Both render the SAME view
|
|
8
|
+
* model (`buildBrainView`) so an OKF bundle looks the same everywhere. The HTML
|
|
9
|
+
* renderer is dependency-free (inline CSS, no JS, no network) so the generated
|
|
10
|
+
* page opens locally as a "daily brain page" and seeds the desktop client.
|
|
11
|
+
*
|
|
12
|
+
* Pure — no filesystem. The CLI wraps it to read a directory or the live bundle.
|
|
13
|
+
*/
|
|
14
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
15
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.buildBrainView = buildBrainView;
|
|
19
|
+
exports.renderBrainHtml = renderBrainHtml;
|
|
20
|
+
const gray_matter_1 = __importDefault(require("gray-matter"));
|
|
21
|
+
const okf_1 = require("./okf");
|
|
22
|
+
const okf_health_1 = require("./okf-health");
|
|
23
|
+
function asStringArray(v) {
|
|
24
|
+
return Array.isArray(v) ? v.filter((x) => typeof x === "string") : [];
|
|
25
|
+
}
|
|
26
|
+
/** Read the bundle title from a root index.md `# Heading`, if present. */
|
|
27
|
+
function readIndexTitle(files) {
|
|
28
|
+
const index = files.find((f) => f.path.replace(/\\/g, "/") === "index.md");
|
|
29
|
+
if (!index)
|
|
30
|
+
return undefined;
|
|
31
|
+
const { content } = (0, gray_matter_1.default)(index.content);
|
|
32
|
+
const m = content.match(/^#\s+(.+)$/m);
|
|
33
|
+
return m ? m[1].trim() : undefined;
|
|
34
|
+
}
|
|
35
|
+
/** Build the framework-agnostic view model from a set of OKF files. */
|
|
36
|
+
function buildBrainView(files, options = {}) {
|
|
37
|
+
const concepts = [];
|
|
38
|
+
for (const file of files) {
|
|
39
|
+
const rel = file.path.replace(/\\/g, "/");
|
|
40
|
+
if (!rel.toLowerCase().endsWith(".md") || (0, okf_1.isReservedFile)(rel))
|
|
41
|
+
continue;
|
|
42
|
+
const { data } = (0, gray_matter_1.default)(file.content);
|
|
43
|
+
const fm = (data || {});
|
|
44
|
+
const id = (0, okf_1.conceptId)(rel);
|
|
45
|
+
concepts.push({
|
|
46
|
+
id,
|
|
47
|
+
type: typeof fm.type === "string" ? fm.type : "Untyped",
|
|
48
|
+
title: typeof fm.title === "string" && fm.title.trim() ? fm.title : id,
|
|
49
|
+
description: typeof fm.description === "string" ? fm.description : undefined,
|
|
50
|
+
lastUpdatedBy: typeof fm.last_updated_by === "string" ? fm.last_updated_by : undefined,
|
|
51
|
+
confidence: typeof fm.confidence === "string" ? fm.confidence : undefined,
|
|
52
|
+
linkedSources: asStringArray(fm.linked_sources),
|
|
53
|
+
related: asStringArray(fm.related),
|
|
54
|
+
href: (0, okf_1.conceptHref)(rel),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
concepts.sort((a, b) => a.id.localeCompare(b.id));
|
|
58
|
+
const groupMap = new Map();
|
|
59
|
+
for (const c of concepts) {
|
|
60
|
+
const list = groupMap.get(c.type) || [];
|
|
61
|
+
list.push(c);
|
|
62
|
+
groupMap.set(c.type, list);
|
|
63
|
+
}
|
|
64
|
+
const groups = [...groupMap.entries()]
|
|
65
|
+
.map(([type, cs]) => ({ type, concepts: cs }))
|
|
66
|
+
.sort((a, b) => a.type.localeCompare(b.type));
|
|
67
|
+
const ids = new Set(concepts.map((c) => c.id));
|
|
68
|
+
const edges = [];
|
|
69
|
+
for (const c of concepts) {
|
|
70
|
+
for (const to of c.related) {
|
|
71
|
+
if (ids.has(to))
|
|
72
|
+
edges.push({ from: c.id, to });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const healthOpts = { now: options.now, staleDays: options.staleDays };
|
|
76
|
+
const health = (0, okf_health_1.auditOkfBundle)(files, healthOpts);
|
|
77
|
+
return {
|
|
78
|
+
title: options.title || readIndexTitle(files) || "You.md Brain",
|
|
79
|
+
okfVersion: okf_1.OKF_VERSION,
|
|
80
|
+
generatedAt: (options.now || new Date()).toISOString(),
|
|
81
|
+
concepts,
|
|
82
|
+
groups,
|
|
83
|
+
edges,
|
|
84
|
+
health,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// ─── HTML rendering ──────────────────────────────────────────────────────
|
|
88
|
+
function esc(s) {
|
|
89
|
+
return s
|
|
90
|
+
.replace(/&/g, "&")
|
|
91
|
+
.replace(/</g, "<")
|
|
92
|
+
.replace(/>/g, ">")
|
|
93
|
+
.replace(/"/g, """);
|
|
94
|
+
}
|
|
95
|
+
/** A stable, URL-safe anchor id for a concept. */
|
|
96
|
+
function anchor(id) {
|
|
97
|
+
return "c-" + id.replace(/[^a-z0-9]+/gi, "-");
|
|
98
|
+
}
|
|
99
|
+
// Terminal-native palette (STYLE_GUIDE / PRD v2.3): monochrome + burnt orange,
|
|
100
|
+
// JetBrains Mono, dark default, 2px radius, no emoji.
|
|
101
|
+
const STYLE = `
|
|
102
|
+
:root{--bg:#0D0D0D;--raised:#161616;--border:#2A2A2A;--fg:#EDEDED;--dim:#8A8A8A;--accent:#C46A3A;--green:#5FB073}
|
|
103
|
+
*{box-sizing:border-box}
|
|
104
|
+
body{margin:0;background:var(--bg);color:var(--fg);font-family:"JetBrains Mono",ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;line-height:1.6}
|
|
105
|
+
.wrap{max-width:980px;margin:0 auto;padding:32px 20px 64px}
|
|
106
|
+
h1{font-size:20px;font-weight:500;letter-spacing:.02em;margin:0 0 4px}
|
|
107
|
+
.sub{color:var(--dim);margin:0 0 24px}
|
|
108
|
+
.bar{display:flex;gap:16px;align-items:center;flex-wrap:wrap;margin:0 0 28px}
|
|
109
|
+
.score{font-weight:500}
|
|
110
|
+
.panel{background:var(--raised);border:1px solid var(--border);border-radius:2px;margin:0 0 18px}
|
|
111
|
+
.panel .hd{border-bottom:1px solid var(--border);padding:8px 14px;color:var(--dim);display:flex;gap:6px;align-items:center}
|
|
112
|
+
.dot{width:8px;height:8px;border-radius:50%;display:inline-block}
|
|
113
|
+
.panel .bd{padding:14px}
|
|
114
|
+
.group-title{color:var(--accent);text-transform:lowercase;letter-spacing:.04em;margin:0 0 10px;font-weight:500}
|
|
115
|
+
.concept{border-top:1px solid var(--border);padding:12px 0}
|
|
116
|
+
.concept:first-child{border-top:none;padding-top:0}
|
|
117
|
+
.concept .t{font-weight:500}
|
|
118
|
+
.concept .d{color:var(--dim);margin:2px 0 6px}
|
|
119
|
+
.meta{color:var(--dim);font-size:12px;display:flex;gap:14px;flex-wrap:wrap}
|
|
120
|
+
.tag{border:1px solid var(--border);border-radius:2px;padding:1px 6px;color:var(--dim)}
|
|
121
|
+
.conf-low{color:var(--accent)}
|
|
122
|
+
a{color:var(--accent);text-decoration:none}
|
|
123
|
+
a:hover{text-decoration:underline}
|
|
124
|
+
.rel a{margin-right:10px}
|
|
125
|
+
.empty{color:var(--dim)}
|
|
126
|
+
footer{color:var(--dim);margin-top:28px;font-size:12px}
|
|
127
|
+
`;
|
|
128
|
+
function healthLine(h) {
|
|
129
|
+
const color = h.score >= 80 ? "var(--green)" : h.score >= 50 ? "var(--accent)" : "#C0504D";
|
|
130
|
+
const parts = [];
|
|
131
|
+
const labels = {
|
|
132
|
+
missing_type: "missing type",
|
|
133
|
+
conflict: "conflicts",
|
|
134
|
+
needs_review: "needs review",
|
|
135
|
+
stale: "stale",
|
|
136
|
+
unsourced: "un-sourced",
|
|
137
|
+
no_description: "no description",
|
|
138
|
+
orphan: "orphans",
|
|
139
|
+
};
|
|
140
|
+
for (const [k, label] of Object.entries(labels)) {
|
|
141
|
+
const n = h.summary[k];
|
|
142
|
+
if (n)
|
|
143
|
+
parts.push(`${esc(label)}: ${n}`);
|
|
144
|
+
}
|
|
145
|
+
return (`<span class="score" style="color:${color}">brain health: ${h.score}/100</span>` +
|
|
146
|
+
`<span class="dim" style="color:var(--dim)">${h.totalConcepts} concepts</span>` +
|
|
147
|
+
(parts.length ? `<span style="color:var(--dim)">${parts.join(" · ")}</span>` : ""));
|
|
148
|
+
}
|
|
149
|
+
function renderConcept(c, byId) {
|
|
150
|
+
const rel = c.related
|
|
151
|
+
.map((id) => {
|
|
152
|
+
const t = byId.get(id);
|
|
153
|
+
return t ? `<a href="#${anchor(id)}">${esc(t.title)}</a>` : `<span class="tag">${esc(id)}</span>`;
|
|
154
|
+
})
|
|
155
|
+
.join("");
|
|
156
|
+
const meta = [];
|
|
157
|
+
if (c.lastUpdatedBy)
|
|
158
|
+
meta.push(`by ${esc(c.lastUpdatedBy)}`);
|
|
159
|
+
if (c.confidence) {
|
|
160
|
+
const cls = c.confidence === "low" ? ' class="conf-low"' : "";
|
|
161
|
+
meta.push(`<span${cls}>confidence: ${esc(c.confidence)}</span>`);
|
|
162
|
+
}
|
|
163
|
+
if (c.linkedSources.length)
|
|
164
|
+
meta.push(`${c.linkedSources.length} source(s)`);
|
|
165
|
+
return (`<div class="concept" id="${anchor(c.id)}">` +
|
|
166
|
+
`<div class="t">${esc(c.title)} <span class="tag">${esc(c.type)}</span></div>` +
|
|
167
|
+
(c.description ? `<div class="d">${esc(c.description)}</div>` : "") +
|
|
168
|
+
(meta.length ? `<div class="meta">${meta.join("")}</div>` : "") +
|
|
169
|
+
(rel ? `<div class="meta rel">related: ${rel}</div>` : "") +
|
|
170
|
+
`</div>`);
|
|
171
|
+
}
|
|
172
|
+
/** Render the brain view as a self-contained HTML page (no JS, no network). */
|
|
173
|
+
function renderBrainHtml(view) {
|
|
174
|
+
const byId = new Map(view.concepts.map((c) => [c.id, c]));
|
|
175
|
+
const groups = view.groups
|
|
176
|
+
.map((g) => `<section class="panel"><div class="hd"><span class="dot" style="background:#C0504D"></span>` +
|
|
177
|
+
`<span class="dot" style="background:var(--accent)"></span><span class="dot" style="background:var(--green)"></span>` +
|
|
178
|
+
` ${esc(g.type)}</div><div class="bd">` +
|
|
179
|
+
`<div class="group-title">${esc(g.type.toLowerCase())} (${g.concepts.length})</div>` +
|
|
180
|
+
g.concepts.map((c) => renderConcept(c, byId)).join("") +
|
|
181
|
+
`</div></section>`)
|
|
182
|
+
.join("\n");
|
|
183
|
+
return `<!doctype html>
|
|
184
|
+
<html lang="en"><head><meta charset="utf-8">
|
|
185
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
186
|
+
<title>${esc(view.title)} — You.md Brain</title>
|
|
187
|
+
<style>${STYLE}</style></head>
|
|
188
|
+
<body><div class="wrap">
|
|
189
|
+
<h1>${esc(view.title)}</h1>
|
|
190
|
+
<p class="sub">Open Knowledge Format brain · okf/${esc(view.okfVersion)} · ${view.concepts.length} concepts · ${view.edges.length} links</p>
|
|
191
|
+
<div class="bar">${healthLine(view.health)}</div>
|
|
192
|
+
${groups || '<p class="empty">No concepts found.</p>'}
|
|
193
|
+
<footer>Generated ${esc(view.generatedAt)} by You.md · this page renders the same OKF model the web app and desktop client use.</footer>
|
|
194
|
+
</div></body></html>
|
|
195
|
+
`;
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=okf-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"okf-view.js","sourceRoot":"","sources":["../../src/lib/okf-view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OKF (Open Knowledge Format) core library.
|
|
3
|
+
*
|
|
4
|
+
* OKF is a vendor-neutral standard (okf/v0.1) for representing knowledge as a
|
|
5
|
+
* directory of UTF-8 markdown files, each carrying a YAML frontmatter block.
|
|
6
|
+
* The only required frontmatter field is `type`. Two filenames are reserved:
|
|
7
|
+
* - index.md — directory listing for progressive disclosure (no frontmatter,
|
|
8
|
+
* except a bundle-root index may declare `okf_version`)
|
|
9
|
+
* - log.md — chronological, date-grouped change history (newest first)
|
|
10
|
+
* A concept's ID is its file path with the trailing ".md" removed.
|
|
11
|
+
*
|
|
12
|
+
* Spec: https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md
|
|
13
|
+
*
|
|
14
|
+
* This module is pure — no filesystem access, no You.md specifics — so it can
|
|
15
|
+
* be unit-tested in isolation and reused by the export/import layers.
|
|
16
|
+
*/
|
|
17
|
+
export declare const OKF_VERSION = "0.1";
|
|
18
|
+
export declare const OKF_RESERVED_FILES: readonly ["index.md", "log.md"];
|
|
19
|
+
/** Allowed `confidence` values (warned, not enforced — OKF tolerates unknowns). */
|
|
20
|
+
export declare const OKF_CONFIDENCE_LEVELS: readonly ["low", "medium", "high"];
|
|
21
|
+
export type OkfConfidence = (typeof OKF_CONFIDENCE_LEVELS)[number];
|
|
22
|
+
export interface OkfFrontmatter {
|
|
23
|
+
/** Required: a short string identifying the kind of concept. */
|
|
24
|
+
type: string;
|
|
25
|
+
/** Human-readable display name. */
|
|
26
|
+
title?: string;
|
|
27
|
+
/** A single sentence summarizing the concept. */
|
|
28
|
+
description?: string;
|
|
29
|
+
/** URI uniquely identifying the underlying asset. */
|
|
30
|
+
resource?: string;
|
|
31
|
+
/** Cross-cutting categorization. */
|
|
32
|
+
tags?: string[];
|
|
33
|
+
/** ISO 8601 datetime of last change. */
|
|
34
|
+
timestamp?: string;
|
|
35
|
+
/** Provenance: who last wrote this concept (e.g. "houston", "agent"). */
|
|
36
|
+
last_updated_by?: string;
|
|
37
|
+
/** Provenance: writer's confidence — low | medium | high. */
|
|
38
|
+
confidence?: string;
|
|
39
|
+
/** Provenance: source concept IDs or URIs this concept derives from. */
|
|
40
|
+
linked_sources?: string[];
|
|
41
|
+
/** Graph edges: concept IDs this concept relates to. */
|
|
42
|
+
related?: string[];
|
|
43
|
+
/** Producers may add custom keys; consumers must preserve them. */
|
|
44
|
+
[key: string]: unknown;
|
|
45
|
+
}
|
|
46
|
+
export interface OkfFile {
|
|
47
|
+
frontmatter: OkfFrontmatter;
|
|
48
|
+
body: string;
|
|
49
|
+
}
|
|
50
|
+
/** The OKF concept ID for a file path: the path with ".md" removed. */
|
|
51
|
+
export declare function conceptId(relPath: string): string;
|
|
52
|
+
/** Whether a path's basename is an OKF reserved filename. */
|
|
53
|
+
export declare function isReservedFile(relPath: string): boolean;
|
|
54
|
+
/** A bundle-relative absolute link to a concept (recommended stable form). */
|
|
55
|
+
export declare function conceptHref(relPath: string): string;
|
|
56
|
+
/**
|
|
57
|
+
* Serialize a concept file: frontmatter (type first, then recommended fields,
|
|
58
|
+
* then custom keys sorted for determinism) followed by the markdown body.
|
|
59
|
+
* Throws if `type` is missing or empty — that is the one OKF hard requirement.
|
|
60
|
+
*/
|
|
61
|
+
export declare function serializeOkfFile(file: OkfFile): string;
|
|
62
|
+
/** Parse a concept file into frontmatter + trimmed body. */
|
|
63
|
+
export declare function parseOkfFile(raw: string): OkfFile;
|
|
64
|
+
export interface OkfValidationIssue {
|
|
65
|
+
file: string;
|
|
66
|
+
level: "error" | "warning";
|
|
67
|
+
message: string;
|
|
68
|
+
}
|
|
69
|
+
export interface OkfValidationResult {
|
|
70
|
+
ok: boolean;
|
|
71
|
+
errors: OkfValidationIssue[];
|
|
72
|
+
warnings: OkfValidationIssue[];
|
|
73
|
+
}
|
|
74
|
+
export interface OkfBundleFile {
|
|
75
|
+
/** Bundle-relative path, e.g. "profile/about.md". */
|
|
76
|
+
path: string;
|
|
77
|
+
content: string;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Validate a single file against OKF conformance rules. `isRoot` marks the
|
|
81
|
+
* bundle-root index.md, which may carry an `okf_version` frontmatter.
|
|
82
|
+
*/
|
|
83
|
+
export declare function validateOkfFileEntry(file: OkfBundleFile, options?: {
|
|
84
|
+
isRoot?: boolean;
|
|
85
|
+
}): OkfValidationIssue[];
|
|
86
|
+
/**
|
|
87
|
+
* Validate a whole bundle (provided as in-memory files). A bundle is
|
|
88
|
+
* conformant when there are zero errors. Broken links and unknown types are
|
|
89
|
+
* explicitly NOT errors per the spec — consumers must tolerate them.
|
|
90
|
+
*/
|
|
91
|
+
export declare function validateOkfBundle(files: OkfBundleFile[]): OkfValidationResult;
|
|
92
|
+
export interface OkfIndexEntry {
|
|
93
|
+
/** e.g. "profile/about". */
|
|
94
|
+
conceptId: string;
|
|
95
|
+
title: string;
|
|
96
|
+
description?: string;
|
|
97
|
+
}
|
|
98
|
+
export interface OkfIndexSection {
|
|
99
|
+
heading: string;
|
|
100
|
+
entries: OkfIndexEntry[];
|
|
101
|
+
}
|
|
102
|
+
export interface OkfIndexOptions {
|
|
103
|
+
title?: string;
|
|
104
|
+
intro?: string;
|
|
105
|
+
/** When set, declares the OKF version (only valid on a bundle-root index). */
|
|
106
|
+
okfVersion?: string;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Build a reserved index.md. Per spec it carries no frontmatter, except a
|
|
110
|
+
* bundle-root index may declare `okf_version`. Entries link to concepts using
|
|
111
|
+
* the stable bundle-relative absolute form ("/profile/about.md").
|
|
112
|
+
*/
|
|
113
|
+
export declare function buildIndexMd(sections: OkfIndexSection[], options?: OkfIndexOptions): string;
|
|
114
|
+
export interface OkfLogEntry {
|
|
115
|
+
/** ISO date, YYYY-MM-DD. */
|
|
116
|
+
date: string;
|
|
117
|
+
/** Conventional label: Update | Creation | Deprecation | custom. */
|
|
118
|
+
label?: string;
|
|
119
|
+
/** Markdown prose describing the change. */
|
|
120
|
+
message: string;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Build a reserved log.md: a flat, date-grouped list, newest first. Date
|
|
124
|
+
* headings use `## YYYY-MM-DD`; entries are bullets with an optional bold
|
|
125
|
+
* label, e.g. `* **Update**: ...`.
|
|
126
|
+
*/
|
|
127
|
+
export declare function buildLogMd(entries: OkfLogEntry[], options?: {
|
|
128
|
+
title?: string;
|
|
129
|
+
}): string;
|
|
130
|
+
//# sourceMappingURL=okf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"okf.d.ts","sourceRoot":"","sources":["../../src/lib/okf.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/okf.js
ADDED
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OKF (Open Knowledge Format) core library.
|
|
4
|
+
*
|
|
5
|
+
* OKF is a vendor-neutral standard (okf/v0.1) for representing knowledge as a
|
|
6
|
+
* directory of UTF-8 markdown files, each carrying a YAML frontmatter block.
|
|
7
|
+
* The only required frontmatter field is `type`. Two filenames are reserved:
|
|
8
|
+
* - index.md — directory listing for progressive disclosure (no frontmatter,
|
|
9
|
+
* except a bundle-root index may declare `okf_version`)
|
|
10
|
+
* - log.md — chronological, date-grouped change history (newest first)
|
|
11
|
+
* A concept's ID is its file path with the trailing ".md" removed.
|
|
12
|
+
*
|
|
13
|
+
* Spec: https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md
|
|
14
|
+
*
|
|
15
|
+
* This module is pure — no filesystem access, no You.md specifics — so it can
|
|
16
|
+
* be unit-tested in isolation and reused by the export/import layers.
|
|
17
|
+
*/
|
|
18
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
19
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.OKF_CONFIDENCE_LEVELS = exports.OKF_RESERVED_FILES = exports.OKF_VERSION = void 0;
|
|
23
|
+
exports.conceptId = conceptId;
|
|
24
|
+
exports.isReservedFile = isReservedFile;
|
|
25
|
+
exports.conceptHref = conceptHref;
|
|
26
|
+
exports.serializeOkfFile = serializeOkfFile;
|
|
27
|
+
exports.parseOkfFile = parseOkfFile;
|
|
28
|
+
exports.validateOkfFileEntry = validateOkfFileEntry;
|
|
29
|
+
exports.validateOkfBundle = validateOkfBundle;
|
|
30
|
+
exports.buildIndexMd = buildIndexMd;
|
|
31
|
+
exports.buildLogMd = buildLogMd;
|
|
32
|
+
const gray_matter_1 = __importDefault(require("gray-matter"));
|
|
33
|
+
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
34
|
+
exports.OKF_VERSION = "0.1";
|
|
35
|
+
exports.OKF_RESERVED_FILES = ["index.md", "log.md"];
|
|
36
|
+
/** Recommended frontmatter fields, in the spec's priority order. */
|
|
37
|
+
const RECOMMENDED_FIELD_ORDER = [
|
|
38
|
+
"type",
|
|
39
|
+
"title",
|
|
40
|
+
"description",
|
|
41
|
+
"resource",
|
|
42
|
+
"tags",
|
|
43
|
+
"timestamp",
|
|
44
|
+
];
|
|
45
|
+
/**
|
|
46
|
+
* Provenance fields (Familiar-second-brain convention). Optional, OKF-legal
|
|
47
|
+
* custom keys that let agents audit a concept: who last wrote it, how sure the
|
|
48
|
+
* writer is, and what it was derived from. Emitted in a stable position right
|
|
49
|
+
* after the recommended fields so audits are scannable.
|
|
50
|
+
*/
|
|
51
|
+
const PROVENANCE_FIELD_ORDER = ["last_updated_by", "confidence", "linked_sources", "related"];
|
|
52
|
+
/** Allowed `confidence` values (warned, not enforced — OKF tolerates unknowns). */
|
|
53
|
+
exports.OKF_CONFIDENCE_LEVELS = ["low", "medium", "high"];
|
|
54
|
+
// ─── Concept identity ──────────────────────────────────────────────────
|
|
55
|
+
/** Normalize a path to forward slashes. */
|
|
56
|
+
function normalizeRelPath(relPath) {
|
|
57
|
+
return relPath.replace(/\\/g, "/").replace(/^\.\//, "");
|
|
58
|
+
}
|
|
59
|
+
/** The OKF concept ID for a file path: the path with ".md" removed. */
|
|
60
|
+
function conceptId(relPath) {
|
|
61
|
+
return normalizeRelPath(relPath).replace(/\.md$/i, "");
|
|
62
|
+
}
|
|
63
|
+
/** Whether a path's basename is an OKF reserved filename. */
|
|
64
|
+
function isReservedFile(relPath) {
|
|
65
|
+
const base = normalizeRelPath(relPath).split("/").pop() || "";
|
|
66
|
+
return exports.OKF_RESERVED_FILES.includes(base);
|
|
67
|
+
}
|
|
68
|
+
/** A bundle-relative absolute link to a concept (recommended stable form). */
|
|
69
|
+
function conceptHref(relPath) {
|
|
70
|
+
return "/" + normalizeRelPath(relPath);
|
|
71
|
+
}
|
|
72
|
+
// ─── Serialize / parse ─────────────────────────────────────────────────
|
|
73
|
+
/**
|
|
74
|
+
* Serialize a concept file: frontmatter (type first, then recommended fields,
|
|
75
|
+
* then custom keys sorted for determinism) followed by the markdown body.
|
|
76
|
+
* Throws if `type` is missing or empty — that is the one OKF hard requirement.
|
|
77
|
+
*/
|
|
78
|
+
function serializeOkfFile(file) {
|
|
79
|
+
const { frontmatter, body } = file;
|
|
80
|
+
if (!frontmatter ||
|
|
81
|
+
typeof frontmatter.type !== "string" ||
|
|
82
|
+
frontmatter.type.trim() === "") {
|
|
83
|
+
throw new Error("OKF concept file requires a non-empty `type` frontmatter field");
|
|
84
|
+
}
|
|
85
|
+
const placed = new Set();
|
|
86
|
+
const ordered = {};
|
|
87
|
+
for (const key of [...RECOMMENDED_FIELD_ORDER, ...PROVENANCE_FIELD_ORDER]) {
|
|
88
|
+
if (frontmatter[key] !== undefined) {
|
|
89
|
+
ordered[key] = frontmatter[key];
|
|
90
|
+
placed.add(key);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
for (const key of Object.keys(frontmatter).sort()) {
|
|
94
|
+
if (placed.has(key))
|
|
95
|
+
continue;
|
|
96
|
+
if (frontmatter[key] !== undefined)
|
|
97
|
+
ordered[key] = frontmatter[key];
|
|
98
|
+
}
|
|
99
|
+
const yamlStr = js_yaml_1.default
|
|
100
|
+
.dump(ordered, { lineWidth: -1, noRefs: true, sortKeys: false })
|
|
101
|
+
.trimEnd();
|
|
102
|
+
return `---\n${yamlStr}\n---\n\n${body.trim()}\n`;
|
|
103
|
+
}
|
|
104
|
+
/** Parse a concept file into frontmatter + trimmed body. */
|
|
105
|
+
function parseOkfFile(raw) {
|
|
106
|
+
const { data, content } = (0, gray_matter_1.default)(raw);
|
|
107
|
+
return { frontmatter: (data || {}), body: content.trim() };
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Validate a single file against OKF conformance rules. `isRoot` marks the
|
|
111
|
+
* bundle-root index.md, which may carry an `okf_version` frontmatter.
|
|
112
|
+
*/
|
|
113
|
+
function validateOkfFileEntry(file, options = {}) {
|
|
114
|
+
const issues = [];
|
|
115
|
+
const rel = normalizeRelPath(file.path);
|
|
116
|
+
if (!rel.toLowerCase().endsWith(".md")) {
|
|
117
|
+
// Non-markdown files (manifests, json) are allowed alongside concepts.
|
|
118
|
+
return issues;
|
|
119
|
+
}
|
|
120
|
+
const base = rel.split("/").pop() || "";
|
|
121
|
+
if (base === "index.md") {
|
|
122
|
+
const { data } = (0, gray_matter_1.default)(file.content);
|
|
123
|
+
const keys = Object.keys(data || {});
|
|
124
|
+
const allowed = options.isRoot ? ["okf_version"] : [];
|
|
125
|
+
const extra = keys.filter((k) => !allowed.includes(k));
|
|
126
|
+
if (extra.length > 0) {
|
|
127
|
+
issues.push({
|
|
128
|
+
file: rel,
|
|
129
|
+
level: "error",
|
|
130
|
+
message: options.isRoot
|
|
131
|
+
? `index.md may only declare \`okf_version\` in frontmatter; found: ${extra.join(", ")}`
|
|
132
|
+
: `index.md must not contain frontmatter; found: ${extra.join(", ")}`,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return issues;
|
|
136
|
+
}
|
|
137
|
+
if (base === "log.md") {
|
|
138
|
+
const { data } = (0, gray_matter_1.default)(file.content);
|
|
139
|
+
if (Object.keys(data || {}).length > 0) {
|
|
140
|
+
issues.push({
|
|
141
|
+
file: rel,
|
|
142
|
+
level: "warning",
|
|
143
|
+
message: "log.md should not contain frontmatter",
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
return issues;
|
|
147
|
+
}
|
|
148
|
+
// Non-reserved concept file: must have parseable frontmatter with `type`.
|
|
149
|
+
let parsed;
|
|
150
|
+
try {
|
|
151
|
+
parsed = (0, gray_matter_1.default)(file.content);
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
issues.push({
|
|
155
|
+
file: rel,
|
|
156
|
+
level: "error",
|
|
157
|
+
message: `unparseable YAML frontmatter: ${err.message}`,
|
|
158
|
+
});
|
|
159
|
+
return issues;
|
|
160
|
+
}
|
|
161
|
+
const data = (parsed.data || {});
|
|
162
|
+
const type = data.type;
|
|
163
|
+
if (typeof type !== "string" || type.trim() === "") {
|
|
164
|
+
issues.push({
|
|
165
|
+
file: rel,
|
|
166
|
+
level: "error",
|
|
167
|
+
message: "concept file is missing a non-empty `type` frontmatter field",
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
// Provenance fields are optional; malformed values are warnings, not errors.
|
|
171
|
+
if (data.confidence !== undefined) {
|
|
172
|
+
const ok = typeof data.confidence === "string" &&
|
|
173
|
+
exports.OKF_CONFIDENCE_LEVELS.includes(data.confidence);
|
|
174
|
+
if (!ok) {
|
|
175
|
+
issues.push({
|
|
176
|
+
file: rel,
|
|
177
|
+
level: "warning",
|
|
178
|
+
message: `confidence should be one of: ${exports.OKF_CONFIDENCE_LEVELS.join(", ")}`,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (data.last_updated_by !== undefined && typeof data.last_updated_by !== "string") {
|
|
183
|
+
issues.push({ file: rel, level: "warning", message: "last_updated_by should be a string" });
|
|
184
|
+
}
|
|
185
|
+
if (data.linked_sources !== undefined && !Array.isArray(data.linked_sources)) {
|
|
186
|
+
issues.push({ file: rel, level: "warning", message: "linked_sources should be a list" });
|
|
187
|
+
}
|
|
188
|
+
return issues;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Validate a whole bundle (provided as in-memory files). A bundle is
|
|
192
|
+
* conformant when there are zero errors. Broken links and unknown types are
|
|
193
|
+
* explicitly NOT errors per the spec — consumers must tolerate them.
|
|
194
|
+
*/
|
|
195
|
+
function validateOkfBundle(files) {
|
|
196
|
+
const errors = [];
|
|
197
|
+
const warnings = [];
|
|
198
|
+
for (const file of files) {
|
|
199
|
+
const rel = normalizeRelPath(file.path);
|
|
200
|
+
const isRoot = rel === "index.md";
|
|
201
|
+
for (const issue of validateOkfFileEntry(file, { isRoot })) {
|
|
202
|
+
if (issue.level === "error")
|
|
203
|
+
errors.push(issue);
|
|
204
|
+
else
|
|
205
|
+
warnings.push(issue);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return { ok: errors.length === 0, errors, warnings };
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Build a reserved index.md. Per spec it carries no frontmatter, except a
|
|
212
|
+
* bundle-root index may declare `okf_version`. Entries link to concepts using
|
|
213
|
+
* the stable bundle-relative absolute form ("/profile/about.md").
|
|
214
|
+
*/
|
|
215
|
+
function buildIndexMd(sections, options = {}) {
|
|
216
|
+
const parts = [];
|
|
217
|
+
if (options.okfVersion) {
|
|
218
|
+
parts.push(`---\nokf_version: "${options.okfVersion}"\n---\n`);
|
|
219
|
+
}
|
|
220
|
+
if (options.title)
|
|
221
|
+
parts.push(`# ${options.title}\n`);
|
|
222
|
+
if (options.intro)
|
|
223
|
+
parts.push(`${options.intro.trim()}\n`);
|
|
224
|
+
for (const section of sections) {
|
|
225
|
+
if (section.entries.length === 0)
|
|
226
|
+
continue;
|
|
227
|
+
parts.push(`## ${section.heading}\n`);
|
|
228
|
+
const lines = section.entries.map((entry) => {
|
|
229
|
+
const href = conceptHref(`${entry.conceptId}.md`);
|
|
230
|
+
const desc = entry.description ? ` - ${entry.description}` : "";
|
|
231
|
+
return `* [${entry.title}](${href})${desc}`;
|
|
232
|
+
});
|
|
233
|
+
parts.push(lines.join("\n") + "\n");
|
|
234
|
+
}
|
|
235
|
+
return parts.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd() + "\n";
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Build a reserved log.md: a flat, date-grouped list, newest first. Date
|
|
239
|
+
* headings use `## YYYY-MM-DD`; entries are bullets with an optional bold
|
|
240
|
+
* label, e.g. `* **Update**: ...`.
|
|
241
|
+
*/
|
|
242
|
+
function buildLogMd(entries, options = {}) {
|
|
243
|
+
const parts = [];
|
|
244
|
+
if (options.title)
|
|
245
|
+
parts.push(`# ${options.title}\n`);
|
|
246
|
+
const byDate = new Map();
|
|
247
|
+
for (const entry of entries) {
|
|
248
|
+
const list = byDate.get(entry.date) || [];
|
|
249
|
+
list.push(entry);
|
|
250
|
+
byDate.set(entry.date, list);
|
|
251
|
+
}
|
|
252
|
+
const dates = [...byDate.keys()].sort().reverse();
|
|
253
|
+
for (const date of dates) {
|
|
254
|
+
parts.push(`## ${date}\n`);
|
|
255
|
+
const lines = (byDate.get(date) || []).map((entry) => {
|
|
256
|
+
const label = entry.label ? `**${entry.label}**: ` : "";
|
|
257
|
+
return `* ${label}${entry.message}`;
|
|
258
|
+
});
|
|
259
|
+
parts.push(lines.join("\n") + "\n");
|
|
260
|
+
}
|
|
261
|
+
return parts.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd() + "\n";
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=okf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"okf.js","sourceRoot":"","sources":["../../src/lib/okf.ts"],"names":[],"mappings":"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"}
|