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,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OKF brain-health audit.
|
|
4
|
+
*
|
|
5
|
+
* Audits an OKF bundle for the failure modes that rot agent knowledge bases
|
|
6
|
+
* (the Familiar-second-brain "graph health" idea, applied to OKF): concepts
|
|
7
|
+
* missing a type, thin/un-sourced concepts, agent-authored low-confidence
|
|
8
|
+
* concepts that need a human pass, stale concepts, unresolved [CONFLICT]/[STALE]
|
|
9
|
+
* markers, and orphans nothing links to.
|
|
10
|
+
*
|
|
11
|
+
* Pure — operates on in-memory files so it can be unit-tested and reused by the
|
|
12
|
+
* CLI against either the live bundle or any OKF directory on disk.
|
|
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.auditOkfBundle = auditOkfBundle;
|
|
19
|
+
const gray_matter_1 = __importDefault(require("gray-matter"));
|
|
20
|
+
const okf_1 = require("./okf");
|
|
21
|
+
/** Extract every link target from markdown: [text](target) and [[wikilink]]. */
|
|
22
|
+
function extractLinkTargets(text) {
|
|
23
|
+
const targets = [];
|
|
24
|
+
const mdLink = /\]\(([^)\s]+)\)/g;
|
|
25
|
+
let m;
|
|
26
|
+
while ((m = mdLink.exec(text)) !== null)
|
|
27
|
+
targets.push(m[1]);
|
|
28
|
+
const wiki = /\[\[([^\]]+)\]\]/g;
|
|
29
|
+
while ((m = wiki.exec(text)) !== null)
|
|
30
|
+
targets.push(m[1]);
|
|
31
|
+
return targets;
|
|
32
|
+
}
|
|
33
|
+
/** Normalize a link target to a concept id (strip leading slash, .md, anchors). */
|
|
34
|
+
function targetToConceptId(target) {
|
|
35
|
+
return target
|
|
36
|
+
.replace(/^\.?\//, "")
|
|
37
|
+
.replace(/#.*$/, "")
|
|
38
|
+
.replace(/\.md$/i, "")
|
|
39
|
+
.trim();
|
|
40
|
+
}
|
|
41
|
+
const EMPTY_SUMMARY = () => ({
|
|
42
|
+
missing_type: 0,
|
|
43
|
+
no_description: 0,
|
|
44
|
+
unsourced: 0,
|
|
45
|
+
needs_review: 0,
|
|
46
|
+
stale: 0,
|
|
47
|
+
conflict: 0,
|
|
48
|
+
orphan: 0,
|
|
49
|
+
});
|
|
50
|
+
const PENALTY = {
|
|
51
|
+
error: 10,
|
|
52
|
+
warning: 3,
|
|
53
|
+
info: 1,
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Audit a set of OKF files. A bundle is `ok` when there are no errors (a
|
|
57
|
+
* missing `type` is the only error; everything else is advisory).
|
|
58
|
+
*/
|
|
59
|
+
function auditOkfBundle(files, options = {}) {
|
|
60
|
+
const staleDays = options.staleDays ?? 30;
|
|
61
|
+
const now = options.now ?? new Date();
|
|
62
|
+
const concepts = [];
|
|
63
|
+
const referenced = new Set();
|
|
64
|
+
for (const file of files) {
|
|
65
|
+
const rel = file.path.replace(/\\/g, "/");
|
|
66
|
+
if (!rel.toLowerCase().endsWith(".md"))
|
|
67
|
+
continue;
|
|
68
|
+
// Every file (including index.md/log.md) contributes graph edges.
|
|
69
|
+
for (const target of extractLinkTargets(file.content)) {
|
|
70
|
+
referenced.add(targetToConceptId(target));
|
|
71
|
+
}
|
|
72
|
+
if ((0, okf_1.isReservedFile)(rel))
|
|
73
|
+
continue;
|
|
74
|
+
const { data, content } = (0, gray_matter_1.default)(file.content);
|
|
75
|
+
const fm = (data || {});
|
|
76
|
+
// `related` frontmatter edges count toward the graph too.
|
|
77
|
+
if (Array.isArray(fm.related)) {
|
|
78
|
+
for (const target of fm.related) {
|
|
79
|
+
if (typeof target === "string")
|
|
80
|
+
referenced.add(targetToConceptId(target));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
concepts.push({
|
|
84
|
+
file: rel,
|
|
85
|
+
id: (0, okf_1.conceptId)(rel),
|
|
86
|
+
data: fm,
|
|
87
|
+
body: content,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
const issues = [];
|
|
91
|
+
const summary = EMPTY_SUMMARY();
|
|
92
|
+
const add = (issue) => {
|
|
93
|
+
issues.push(issue);
|
|
94
|
+
summary[issue.category] += 1;
|
|
95
|
+
};
|
|
96
|
+
for (const concept of concepts) {
|
|
97
|
+
const { file, id, data, body } = concept;
|
|
98
|
+
const type = data.type;
|
|
99
|
+
if (typeof type !== "string" || type.trim() === "") {
|
|
100
|
+
add({ category: "missing_type", level: "error", file, message: "missing required `type`" });
|
|
101
|
+
}
|
|
102
|
+
if (typeof data.description !== "string" || !data.description.trim()) {
|
|
103
|
+
add({ category: "no_description", level: "info", file, message: "no description" });
|
|
104
|
+
}
|
|
105
|
+
const linkedSources = data.linked_sources;
|
|
106
|
+
if (!Array.isArray(linkedSources) || linkedSources.length === 0) {
|
|
107
|
+
add({ category: "unsourced", level: "info", file, message: "no linked_sources (un-sourced)" });
|
|
108
|
+
}
|
|
109
|
+
const confidence = typeof data.confidence === "string" ? data.confidence : "";
|
|
110
|
+
const author = typeof data.last_updated_by === "string" ? data.last_updated_by : "";
|
|
111
|
+
if (confidence === "low" || (author === "agent" && !confidence)) {
|
|
112
|
+
add({
|
|
113
|
+
category: "needs_review",
|
|
114
|
+
level: "warning",
|
|
115
|
+
file,
|
|
116
|
+
message: confidence === "low"
|
|
117
|
+
? "low confidence — needs a human pass"
|
|
118
|
+
: "agent-authored with no confidence — needs a human pass",
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
const timestamp = typeof data.timestamp === "string" ? data.timestamp : "";
|
|
122
|
+
if (timestamp) {
|
|
123
|
+
const ts = Date.parse(timestamp);
|
|
124
|
+
if (!Number.isNaN(ts)) {
|
|
125
|
+
const ageDays = (now.getTime() - ts) / (1000 * 60 * 60 * 24);
|
|
126
|
+
if (ageDays > staleDays) {
|
|
127
|
+
add({
|
|
128
|
+
category: "stale",
|
|
129
|
+
level: "warning",
|
|
130
|
+
file,
|
|
131
|
+
message: `not updated in ${Math.floor(ageDays)} days (> ${staleDays})`,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (/\[STALE\]/.test(body)) {
|
|
137
|
+
add({ category: "stale", level: "warning", file, message: "contains a [STALE] marker" });
|
|
138
|
+
}
|
|
139
|
+
if (/\[CONFLICT\]/.test(body)) {
|
|
140
|
+
add({ category: "conflict", level: "warning", file, message: "contains an unresolved [CONFLICT] marker" });
|
|
141
|
+
}
|
|
142
|
+
// Orphan: no other file links to this concept id.
|
|
143
|
+
if (!referenced.has(id)) {
|
|
144
|
+
add({ category: "orphan", level: "info", file, message: "orphan — nothing links to it" });
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const ok = issues.every((i) => i.level !== "error");
|
|
148
|
+
const penalty = issues.reduce((sum, i) => sum + PENALTY[i.level], 0);
|
|
149
|
+
const score = Math.max(0, 100 - penalty);
|
|
150
|
+
return { ok, totalConcepts: concepts.length, issues, summary, score };
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=okf-health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"okf-health.js","sourceRoot":"","sources":["../../src/lib/okf-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YouStack -> OKF bundle.
|
|
3
|
+
*
|
|
4
|
+
* A YouStack is a manifest (youstack.json) plus typed markdown files — skills,
|
|
5
|
+
* workflows, docs, tests, prompts. This module renders a stack as a conformant
|
|
6
|
+
* OKF bundle so a published "Gstack-style" stack is readable by any OKF
|
|
7
|
+
* consumer (an LLM, Obsidian, MkDocs, a static server) with no You.md SDK. The
|
|
8
|
+
* canonical youstack.json is carried alongside so the stack stays installable.
|
|
9
|
+
*
|
|
10
|
+
* Export-focused: the OKF rendering is the shareable/consumable view; the
|
|
11
|
+
* youstack.json remains the source of truth for installation and routing.
|
|
12
|
+
*/
|
|
13
|
+
import { OkfBundleFile, OkfValidationResult } from "./okf";
|
|
14
|
+
import { YouStackManifest } from "./youstack";
|
|
15
|
+
export interface StackSourceFile {
|
|
16
|
+
/** Bundle-relative path, e.g. "skills/youstack-start/SKILL.md". */
|
|
17
|
+
path: string;
|
|
18
|
+
/** Declared file type from the manifest, if known. */
|
|
19
|
+
declaredType?: string;
|
|
20
|
+
content: string;
|
|
21
|
+
}
|
|
22
|
+
export interface BuildStackOkfResult {
|
|
23
|
+
files: OkfBundleFile[];
|
|
24
|
+
conceptCount: number;
|
|
25
|
+
validation: OkfValidationResult;
|
|
26
|
+
}
|
|
27
|
+
/** Pure: build the full OKF file set for a stack manifest + its source files. */
|
|
28
|
+
export declare function buildStackOkfFiles(manifest: YouStackManifest, sourceFiles: StackSourceFile[], options?: {
|
|
29
|
+
timestamp?: string;
|
|
30
|
+
defaultAuthor?: string;
|
|
31
|
+
defaultConfidence?: string;
|
|
32
|
+
}): BuildStackOkfResult;
|
|
33
|
+
/** Collect all markdown source files from a stack root, tagging declared
|
|
34
|
+
* types from manifest.files where available. */
|
|
35
|
+
export declare function collectStackSourceFiles(rootDir: string, manifest: YouStackManifest): StackSourceFile[];
|
|
36
|
+
export interface ExportStackToOkfResult {
|
|
37
|
+
outDir: string;
|
|
38
|
+
written: string[];
|
|
39
|
+
conceptCount: number;
|
|
40
|
+
validation: OkfValidationResult;
|
|
41
|
+
}
|
|
42
|
+
/** Export a loaded stack (manifest + rootDir) as a conformant OKF bundle. */
|
|
43
|
+
export declare function exportYouStackToOkf(manifest: YouStackManifest, rootDir: string, outDir: string, options?: {
|
|
44
|
+
defaultAuthor?: string;
|
|
45
|
+
defaultConfidence?: string;
|
|
46
|
+
}): ExportStackToOkfResult;
|
|
47
|
+
//# sourceMappingURL=okf-stack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"okf-stack.d.ts","sourceRoot":"","sources":["../../src/lib/okf-stack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,EAEL,aAAa,EAOb,mBAAmB,EACpB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,gBAAgB,EAA2B,MAAM,YAAY,CAAC;AAuBvE,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAoHD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,mBAAmB,CAAC;CACjC;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,gBAAgB,EAC1B,WAAW,EAAE,eAAe,EAAE,EAC9B,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAO,GACvF,mBAAmB,CAsGrB;AAID;iDACiD;AACjD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,gBAAgB,GACzB,eAAe,EAAE,CA2BnB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,mBAAmB,CAAC;CACjC;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAO,GACnE,sBAAsB,CA6BxB"}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* YouStack -> OKF bundle.
|
|
4
|
+
*
|
|
5
|
+
* A YouStack is a manifest (youstack.json) plus typed markdown files — skills,
|
|
6
|
+
* workflows, docs, tests, prompts. This module renders a stack as a conformant
|
|
7
|
+
* OKF bundle so a published "Gstack-style" stack is readable by any OKF
|
|
8
|
+
* consumer (an LLM, Obsidian, MkDocs, a static server) with no You.md SDK. The
|
|
9
|
+
* canonical youstack.json is carried alongside so the stack stays installable.
|
|
10
|
+
*
|
|
11
|
+
* Export-focused: the OKF rendering is the shareable/consumable view; the
|
|
12
|
+
* youstack.json remains the source of truth for installation and routing.
|
|
13
|
+
*/
|
|
14
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
+
}
|
|
20
|
+
Object.defineProperty(o, k2, desc);
|
|
21
|
+
}) : (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
o[k2] = m[k];
|
|
24
|
+
}));
|
|
25
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
+
}) : function(o, v) {
|
|
28
|
+
o["default"] = v;
|
|
29
|
+
});
|
|
30
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
+
var ownKeys = function(o) {
|
|
32
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
+
var ar = [];
|
|
34
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
+
return ar;
|
|
36
|
+
};
|
|
37
|
+
return ownKeys(o);
|
|
38
|
+
};
|
|
39
|
+
return function (mod) {
|
|
40
|
+
if (mod && mod.__esModule) return mod;
|
|
41
|
+
var result = {};
|
|
42
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
+
__setModuleDefault(result, mod);
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
})();
|
|
47
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
48
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
49
|
+
};
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.buildStackOkfFiles = buildStackOkfFiles;
|
|
52
|
+
exports.collectStackSourceFiles = collectStackSourceFiles;
|
|
53
|
+
exports.exportYouStackToOkf = exportYouStackToOkf;
|
|
54
|
+
const fs = __importStar(require("fs"));
|
|
55
|
+
const path = __importStar(require("path"));
|
|
56
|
+
const gray_matter_1 = __importDefault(require("gray-matter"));
|
|
57
|
+
const okf_1 = require("./okf");
|
|
58
|
+
const youstack_1 = require("./youstack");
|
|
59
|
+
/** Declared file `type` -> human-friendly OKF `type` + index heading. */
|
|
60
|
+
const FILE_TYPE_META = {
|
|
61
|
+
skill: { type: "Skill", heading: "Skills" },
|
|
62
|
+
workflow: { type: "Workflow", heading: "Workflows" },
|
|
63
|
+
docs: { type: "Documentation", heading: "Docs" },
|
|
64
|
+
doc: { type: "Documentation", heading: "Docs" },
|
|
65
|
+
prompt: { type: "Prompt", heading: "Prompts" },
|
|
66
|
+
test: { type: "Test", heading: "Tests" },
|
|
67
|
+
example: { type: "Example", heading: "Examples" },
|
|
68
|
+
};
|
|
69
|
+
/** Directory name -> declared file type, for files not listed in manifest.files. */
|
|
70
|
+
const DIR_TYPE_HINT = {
|
|
71
|
+
skills: "skill",
|
|
72
|
+
workflows: "workflow",
|
|
73
|
+
docs: "docs",
|
|
74
|
+
prompts: "prompt",
|
|
75
|
+
tests: "test",
|
|
76
|
+
examples: "example",
|
|
77
|
+
};
|
|
78
|
+
function titleCase(slug) {
|
|
79
|
+
return slug
|
|
80
|
+
.split(/[-_.]/)
|
|
81
|
+
.filter(Boolean)
|
|
82
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
83
|
+
.join(" ");
|
|
84
|
+
}
|
|
85
|
+
function deriveDescription(body) {
|
|
86
|
+
for (const raw of body.split("\n")) {
|
|
87
|
+
const line = raw.trim();
|
|
88
|
+
if (!line)
|
|
89
|
+
continue;
|
|
90
|
+
if (/^[#>*\-+|]/.test(line))
|
|
91
|
+
continue;
|
|
92
|
+
const sentence = line.split(/(?<=[.!?])\s/)[0].trim();
|
|
93
|
+
if (!sentence)
|
|
94
|
+
continue;
|
|
95
|
+
return sentence.length > 160 ? sentence.slice(0, 157).trimEnd() + "..." : sentence;
|
|
96
|
+
}
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
function dropUndefined(obj) {
|
|
100
|
+
const out = {};
|
|
101
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
102
|
+
if (v !== undefined && !(Array.isArray(v) && v.length === 0))
|
|
103
|
+
out[k] = v;
|
|
104
|
+
}
|
|
105
|
+
return out;
|
|
106
|
+
}
|
|
107
|
+
function typeMetaFor(file) {
|
|
108
|
+
if (file.declaredType && FILE_TYPE_META[file.declaredType]) {
|
|
109
|
+
return FILE_TYPE_META[file.declaredType];
|
|
110
|
+
}
|
|
111
|
+
const topDir = file.path.replace(/\\/g, "/").split("/")[0];
|
|
112
|
+
const hinted = DIR_TYPE_HINT[topDir];
|
|
113
|
+
if (hinted && FILE_TYPE_META[hinted])
|
|
114
|
+
return FILE_TYPE_META[hinted];
|
|
115
|
+
return { type: "Stack File", heading: "Other" };
|
|
116
|
+
}
|
|
117
|
+
/** Read provenance fields from a parsed frontmatter block, applying defaults. */
|
|
118
|
+
function readProvenance(data, defaults) {
|
|
119
|
+
const lastUpdatedBy = (typeof data.last_updated_by === "string" && data.last_updated_by) || defaults.author;
|
|
120
|
+
const confidence = (typeof data.confidence === "string" && data.confidence) || defaults.confidence;
|
|
121
|
+
const linkedSources = Array.isArray(data.linked_sources)
|
|
122
|
+
? data.linked_sources.filter((s) => typeof s === "string")
|
|
123
|
+
: undefined;
|
|
124
|
+
return {
|
|
125
|
+
last_updated_by: lastUpdatedBy || undefined,
|
|
126
|
+
confidence: confidence || undefined,
|
|
127
|
+
linked_sources: linkedSources && linkedSources.length > 0 ? linkedSources : undefined,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/** Build the manifest summary concept (type: YouStack). */
|
|
131
|
+
function buildStackManifestConcept(manifest, timestamp, defaults = {}) {
|
|
132
|
+
const capabilities = (0, youstack_1.getYouStackCapabilities)(manifest);
|
|
133
|
+
const lines = [];
|
|
134
|
+
lines.push(`# ${manifest.name}`);
|
|
135
|
+
lines.push("");
|
|
136
|
+
if (manifest.description) {
|
|
137
|
+
lines.push(manifest.description);
|
|
138
|
+
lines.push("");
|
|
139
|
+
}
|
|
140
|
+
lines.push("## Identity");
|
|
141
|
+
lines.push("");
|
|
142
|
+
lines.push(`- Slug: ${manifest.slug}`);
|
|
143
|
+
lines.push(`- Version: ${manifest.version}`);
|
|
144
|
+
lines.push(`- Visibility: ${manifest.visibility}`);
|
|
145
|
+
if (manifest.domain)
|
|
146
|
+
lines.push(`- Domain: ${manifest.domain}`);
|
|
147
|
+
if (manifest.tags?.length)
|
|
148
|
+
lines.push(`- Tags: ${manifest.tags.join(", ")}`);
|
|
149
|
+
lines.push("");
|
|
150
|
+
lines.push("## Capabilities");
|
|
151
|
+
lines.push("");
|
|
152
|
+
for (const capability of capabilities) {
|
|
153
|
+
const mode = capability.localOnly ? "local" : "protected";
|
|
154
|
+
lines.push(`- ${capability.id} (${mode}): ${capability.intent || "No intent declared."}`);
|
|
155
|
+
}
|
|
156
|
+
if (manifest.improvement) {
|
|
157
|
+
lines.push("");
|
|
158
|
+
lines.push("## Self-Improvement");
|
|
159
|
+
lines.push("");
|
|
160
|
+
lines.push(`- Mode: ${manifest.improvement.mode || "observe"}`);
|
|
161
|
+
if (manifest.improvement.cadence)
|
|
162
|
+
lines.push(`- Cadence: ${manifest.improvement.cadence}`);
|
|
163
|
+
}
|
|
164
|
+
const frontmatter = dropUndefined({
|
|
165
|
+
type: "YouStack",
|
|
166
|
+
title: manifest.name,
|
|
167
|
+
description: manifest.description,
|
|
168
|
+
tags: manifest.tags && manifest.tags.length > 0 ? manifest.tags : undefined,
|
|
169
|
+
timestamp,
|
|
170
|
+
last_updated_by: defaults.author,
|
|
171
|
+
confidence: defaults.confidence,
|
|
172
|
+
youmd_kind: "youstack",
|
|
173
|
+
stack_slug: manifest.slug,
|
|
174
|
+
stack_version: manifest.version,
|
|
175
|
+
stack_visibility: manifest.visibility,
|
|
176
|
+
});
|
|
177
|
+
return {
|
|
178
|
+
path: "youstack.md",
|
|
179
|
+
content: (0, okf_1.serializeOkfFile)({ frontmatter, body: lines.join("\n") }),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/** Pure: build the full OKF file set for a stack manifest + its source files. */
|
|
183
|
+
function buildStackOkfFiles(manifest, sourceFiles, options = {}) {
|
|
184
|
+
const timestamp = options.timestamp || new Date().toISOString();
|
|
185
|
+
const date = timestamp.split("T")[0];
|
|
186
|
+
const provDefaults = { author: options.defaultAuthor, confidence: options.defaultConfidence };
|
|
187
|
+
const manifestConcept = buildStackManifestConcept(manifest, timestamp, provDefaults);
|
|
188
|
+
const conceptFiles = sourceFiles.map((file) => {
|
|
189
|
+
const meta = typeMetaFor(file);
|
|
190
|
+
const { data, content } = (0, gray_matter_1.default)(file.content);
|
|
191
|
+
const slug = path.basename(file.path, path.extname(file.path));
|
|
192
|
+
const title = (typeof data.title === "string" && data.title.trim()) ||
|
|
193
|
+
(typeof data.name === "string" && data.name.trim()) ||
|
|
194
|
+
titleCase(slug);
|
|
195
|
+
const description = (typeof data.description === "string" && data.description.trim()) ||
|
|
196
|
+
deriveDescription(content);
|
|
197
|
+
const provenance = readProvenance(data, provDefaults);
|
|
198
|
+
const frontmatter = dropUndefined({
|
|
199
|
+
type: meta.type,
|
|
200
|
+
title,
|
|
201
|
+
description,
|
|
202
|
+
timestamp,
|
|
203
|
+
last_updated_by: provenance.last_updated_by,
|
|
204
|
+
confidence: provenance.confidence,
|
|
205
|
+
linked_sources: provenance.linked_sources,
|
|
206
|
+
// Every stack file belongs to the stack — link it to the manifest concept.
|
|
207
|
+
related: ["youstack"],
|
|
208
|
+
youmd_kind: file.path.replace(/\\/g, "/").replace(/\.md$/i, ""),
|
|
209
|
+
stack_slug: manifest.slug,
|
|
210
|
+
});
|
|
211
|
+
return {
|
|
212
|
+
path: file.path.replace(/\\/g, "/"),
|
|
213
|
+
content: (0, okf_1.serializeOkfFile)({ frontmatter, body: content.trim() }),
|
|
214
|
+
};
|
|
215
|
+
});
|
|
216
|
+
// index.md grouped by heading.
|
|
217
|
+
const headingOrder = ["Skills", "Workflows", "Prompts", "Docs", "Tests", "Examples", "Other"];
|
|
218
|
+
const grouped = new Map();
|
|
219
|
+
// Manifest summary goes in an "Overview" section first.
|
|
220
|
+
grouped.set("Overview", {
|
|
221
|
+
heading: "Overview",
|
|
222
|
+
entries: [{ conceptId: "youstack", title: manifest.name, description: manifest.description }],
|
|
223
|
+
});
|
|
224
|
+
for (const file of sourceFiles) {
|
|
225
|
+
const meta = typeMetaFor(file);
|
|
226
|
+
const { data, content } = (0, gray_matter_1.default)(file.content);
|
|
227
|
+
const slug = path.basename(file.path, path.extname(file.path));
|
|
228
|
+
const title = (typeof data.title === "string" && data.title.trim()) ||
|
|
229
|
+
(typeof data.name === "string" && data.name.trim()) ||
|
|
230
|
+
titleCase(slug);
|
|
231
|
+
const section = grouped.get(meta.heading) || { heading: meta.heading, entries: [] };
|
|
232
|
+
section.entries.push({
|
|
233
|
+
conceptId: file.path.replace(/\\/g, "/").replace(/\.md$/i, ""),
|
|
234
|
+
title,
|
|
235
|
+
description: (typeof data.description === "string" && data.description.trim()) ||
|
|
236
|
+
deriveDescription(content),
|
|
237
|
+
});
|
|
238
|
+
grouped.set(meta.heading, section);
|
|
239
|
+
}
|
|
240
|
+
const indexSections = [
|
|
241
|
+
grouped.get("Overview"),
|
|
242
|
+
...headingOrder
|
|
243
|
+
.filter((h) => grouped.has(h))
|
|
244
|
+
.map((h) => grouped.get(h)),
|
|
245
|
+
];
|
|
246
|
+
const indexMd = (0, okf_1.buildIndexMd)(indexSections, {
|
|
247
|
+
title: `${manifest.name} — YouStack`,
|
|
248
|
+
intro: manifest.description ||
|
|
249
|
+
"A portable YouStack in Open Knowledge Format. Skills, workflows, and docs an agent can read natively.",
|
|
250
|
+
okfVersion: okf_1.OKF_VERSION,
|
|
251
|
+
});
|
|
252
|
+
const log = [
|
|
253
|
+
{
|
|
254
|
+
date,
|
|
255
|
+
label: "Export",
|
|
256
|
+
message: `Generated OKF bundle for ${manifest.name} v${manifest.version} — ${conceptFiles.length + 1} concepts.`,
|
|
257
|
+
},
|
|
258
|
+
];
|
|
259
|
+
const files = [
|
|
260
|
+
{ path: "index.md", content: indexMd },
|
|
261
|
+
manifestConcept,
|
|
262
|
+
...conceptFiles,
|
|
263
|
+
{ path: "log.md", content: (0, okf_1.buildLogMd)(log, { title: "Change Log" }) },
|
|
264
|
+
];
|
|
265
|
+
return {
|
|
266
|
+
files,
|
|
267
|
+
conceptCount: conceptFiles.length + 1,
|
|
268
|
+
validation: (0, okf_1.validateOkfBundle)(files),
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
// ─── Filesystem wrapper ────────────────────────────────────────────────
|
|
272
|
+
/** Collect all markdown source files from a stack root, tagging declared
|
|
273
|
+
* types from manifest.files where available. */
|
|
274
|
+
function collectStackSourceFiles(rootDir, manifest) {
|
|
275
|
+
const declaredType = new Map();
|
|
276
|
+
for (const file of manifest.files || []) {
|
|
277
|
+
declaredType.set(file.path.replace(/\\/g, "/"), file.type);
|
|
278
|
+
}
|
|
279
|
+
const collected = [];
|
|
280
|
+
const walk = (dir, prefix) => {
|
|
281
|
+
if (!fs.existsSync(dir))
|
|
282
|
+
return;
|
|
283
|
+
for (const entry of fs
|
|
284
|
+
.readdirSync(dir, { withFileTypes: true })
|
|
285
|
+
.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
286
|
+
const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
287
|
+
const abs = path.join(dir, entry.name);
|
|
288
|
+
if (entry.isDirectory()) {
|
|
289
|
+
walk(abs, rel);
|
|
290
|
+
}
|
|
291
|
+
else if (entry.name.endsWith(".md")) {
|
|
292
|
+
collected.push({
|
|
293
|
+
path: rel,
|
|
294
|
+
declaredType: declaredType.get(rel),
|
|
295
|
+
content: fs.readFileSync(abs, "utf-8"),
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
walk(rootDir, "");
|
|
301
|
+
return collected;
|
|
302
|
+
}
|
|
303
|
+
/** Export a loaded stack (manifest + rootDir) as a conformant OKF bundle. */
|
|
304
|
+
function exportYouStackToOkf(manifest, rootDir, outDir, options = {}) {
|
|
305
|
+
const sourceFiles = collectStackSourceFiles(rootDir, manifest);
|
|
306
|
+
const built = buildStackOkfFiles(manifest, sourceFiles, {
|
|
307
|
+
defaultAuthor: options.defaultAuthor,
|
|
308
|
+
defaultConfidence: options.defaultConfidence,
|
|
309
|
+
});
|
|
310
|
+
fs.mkdirSync(outDir, { recursive: true });
|
|
311
|
+
const written = [];
|
|
312
|
+
for (const file of built.files) {
|
|
313
|
+
const dest = path.join(outDir, file.path);
|
|
314
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
315
|
+
fs.writeFileSync(dest, file.content);
|
|
316
|
+
written.push(file.path);
|
|
317
|
+
}
|
|
318
|
+
// Carry the canonical manifest so the OKF bundle stays installable.
|
|
319
|
+
const manifestSrc = path.join(rootDir, "youstack.json");
|
|
320
|
+
if (fs.existsSync(manifestSrc)) {
|
|
321
|
+
fs.copyFileSync(manifestSrc, path.join(outDir, "youstack.json"));
|
|
322
|
+
written.push("youstack.json");
|
|
323
|
+
}
|
|
324
|
+
return {
|
|
325
|
+
outDir,
|
|
326
|
+
written,
|
|
327
|
+
conceptCount: built.conceptCount,
|
|
328
|
+
validation: built.validation,
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=okf-stack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"okf-stack.js","sourceRoot":"","sources":["../../src/lib/okf-stack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OKF brain view — a framework-agnostic view model over an OKF bundle plus a
|
|
3
|
+
* self-contained HTML renderer.
|
|
4
|
+
*
|
|
5
|
+
* This is the substrate for two surfaces that should feel identical: the future
|
|
6
|
+
* Obsidian-style desktop client and the web app. Both render the SAME view
|
|
7
|
+
* model (`buildBrainView`) so an OKF bundle looks the same everywhere. The HTML
|
|
8
|
+
* renderer is dependency-free (inline CSS, no JS, no network) so the generated
|
|
9
|
+
* page opens locally as a "daily brain page" and seeds the desktop client.
|
|
10
|
+
*
|
|
11
|
+
* Pure — no filesystem. The CLI wraps it to read a directory or the live bundle.
|
|
12
|
+
*/
|
|
13
|
+
import { OkfBundleFile } from "./okf";
|
|
14
|
+
import { OkfHealthReport } from "./okf-health";
|
|
15
|
+
export interface BrainConcept {
|
|
16
|
+
id: string;
|
|
17
|
+
type: string;
|
|
18
|
+
title: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
lastUpdatedBy?: string;
|
|
21
|
+
confidence?: string;
|
|
22
|
+
linkedSources: string[];
|
|
23
|
+
related: string[];
|
|
24
|
+
href: string;
|
|
25
|
+
}
|
|
26
|
+
export interface BrainView {
|
|
27
|
+
title: string;
|
|
28
|
+
okfVersion: string;
|
|
29
|
+
generatedAt: string;
|
|
30
|
+
concepts: BrainConcept[];
|
|
31
|
+
groups: Array<{
|
|
32
|
+
type: string;
|
|
33
|
+
concepts: BrainConcept[];
|
|
34
|
+
}>;
|
|
35
|
+
edges: Array<{
|
|
36
|
+
from: string;
|
|
37
|
+
to: string;
|
|
38
|
+
}>;
|
|
39
|
+
health: OkfHealthReport;
|
|
40
|
+
}
|
|
41
|
+
/** Build the framework-agnostic view model from a set of OKF files. */
|
|
42
|
+
export declare function buildBrainView(files: OkfBundleFile[], options?: {
|
|
43
|
+
title?: string;
|
|
44
|
+
now?: Date;
|
|
45
|
+
staleDays?: number;
|
|
46
|
+
}): BrainView;
|
|
47
|
+
/** Render the brain view as a self-contained HTML page (no JS, no network). */
|
|
48
|
+
export declare function renderBrainHtml(view: BrainView): string;
|
|
49
|
+
//# sourceMappingURL=okf-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"okf-view.d.ts","sourceRoot":"","sources":["../../src/lib/okf-view.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,aAAa,EAAuD,MAAM,OAAO,CAAC;AAC3F,OAAO,EAAkB,eAAe,EAAoB,MAAM,cAAc,CAAC;AAEjF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC,CAAC;IAC1D,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3C,MAAM,EAAE,eAAe,CAAC;CACzB;AAeD,uEAAuE;AACvE,wBAAgB,cAAc,CAC5B,KAAK,EAAE,aAAa,EAAE,EACtB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/D,SAAS,CAsDX;AA8FD,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CA2BvD"}
|