@organon-methodology/tools 0.3.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/LICENSE +21 -0
- package/README.md +152 -0
- package/dist/cli/commands/coverage.d.ts +12 -0
- package/dist/cli/commands/coverage.d.ts.map +1 -0
- package/dist/cli/commands/coverage.js +80 -0
- package/dist/cli/commands/coverage.js.map +1 -0
- package/dist/cli/commands/find.d.ts +15 -0
- package/dist/cli/commands/find.d.ts.map +1 -0
- package/dist/cli/commands/find.js +81 -0
- package/dist/cli/commands/find.js.map +1 -0
- package/dist/cli/commands/generate-tests.d.ts +14 -0
- package/dist/cli/commands/generate-tests.d.ts.map +1 -0
- package/dist/cli/commands/generate-tests.js +87 -0
- package/dist/cli/commands/generate-tests.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +15 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +77 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/health.d.ts +13 -0
- package/dist/cli/commands/health.d.ts.map +1 -0
- package/dist/cli/commands/health.js +79 -0
- package/dist/cli/commands/health.js.map +1 -0
- package/dist/cli/commands/init.d.ts +14 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +132 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +11 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +26 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/query.d.ts +19 -0
- package/dist/cli/commands/query.d.ts.map +1 -0
- package/dist/cli/commands/query.js +103 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/upgrade.d.ts +13 -0
- package/dist/cli/commands/upgrade.d.ts.map +1 -0
- package/dist/cli/commands/upgrade.js +162 -0
- package/dist/cli/commands/upgrade.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +13 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +89 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/commands/verify.d.ts +12 -0
- package/dist/cli/commands/verify.d.ts.map +1 -0
- package/dist/cli/commands/verify.js +67 -0
- package/dist/cli/commands/verify.js.map +1 -0
- package/dist/cli/index.d.ts +19 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +59 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/add-protocols-array.d.ts +17 -0
- package/dist/core/add-protocols-array.d.ts.map +1 -0
- package/dist/core/add-protocols-array.js +95 -0
- package/dist/core/add-protocols-array.js.map +1 -0
- package/dist/core/add-protocols-array.test.d.ts +2 -0
- package/dist/core/add-protocols-array.test.d.ts.map +1 -0
- package/dist/core/add-protocols-array.test.js +86 -0
- package/dist/core/add-protocols-array.test.js.map +1 -0
- package/dist/core/config.d.ts +44 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +130 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/config.test.d.ts +2 -0
- package/dist/core/config.test.d.ts.map +1 -0
- package/dist/core/config.test.js +88 -0
- package/dist/core/config.test.js.map +1 -0
- package/dist/core/find.d.ts +29 -0
- package/dist/core/find.d.ts.map +1 -0
- package/dist/core/find.js +191 -0
- package/dist/core/find.js.map +1 -0
- package/dist/core/find.test.d.ts +2 -0
- package/dist/core/find.test.d.ts.map +1 -0
- package/dist/core/find.test.js +91 -0
- package/dist/core/find.test.js.map +1 -0
- package/dist/core/frontmatter-parser.d.ts +45 -0
- package/dist/core/frontmatter-parser.d.ts.map +1 -0
- package/dist/core/frontmatter-parser.js +122 -0
- package/dist/core/frontmatter-parser.js.map +1 -0
- package/dist/core/frontmatter-parser.test.d.ts +2 -0
- package/dist/core/frontmatter-parser.test.d.ts.map +1 -0
- package/dist/core/frontmatter-parser.test.js +200 -0
- package/dist/core/frontmatter-parser.test.js.map +1 -0
- package/dist/core/generate-frontmatter.d.ts +27 -0
- package/dist/core/generate-frontmatter.d.ts.map +1 -0
- package/dist/core/generate-frontmatter.js +219 -0
- package/dist/core/generate-frontmatter.js.map +1 -0
- package/dist/core/generate-frontmatter.test.d.ts +2 -0
- package/dist/core/generate-frontmatter.test.d.ts.map +1 -0
- package/dist/core/generate-frontmatter.test.js +161 -0
- package/dist/core/generate-frontmatter.test.js.map +1 -0
- package/dist/core/generate-tests.d.ts +41 -0
- package/dist/core/generate-tests.d.ts.map +1 -0
- package/dist/core/generate-tests.js +191 -0
- package/dist/core/generate-tests.js.map +1 -0
- package/dist/core/generate-tests.test.d.ts +2 -0
- package/dist/core/generate-tests.test.d.ts.map +1 -0
- package/dist/core/generate-tests.test.js +205 -0
- package/dist/core/generate-tests.test.js.map +1 -0
- package/dist/core/health.d.ts +16 -0
- package/dist/core/health.d.ts.map +1 -0
- package/dist/core/health.js +156 -0
- package/dist/core/health.js.map +1 -0
- package/dist/core/health.test.d.ts +2 -0
- package/dist/core/health.test.d.ts.map +1 -0
- package/dist/core/health.test.js +97 -0
- package/dist/core/health.test.js.map +1 -0
- package/dist/core/init.d.ts +25 -0
- package/dist/core/init.d.ts.map +1 -0
- package/dist/core/init.js +100 -0
- package/dist/core/init.js.map +1 -0
- package/dist/core/init.test.d.ts +8 -0
- package/dist/core/init.test.d.ts.map +1 -0
- package/dist/core/init.test.js +203 -0
- package/dist/core/init.test.js.map +1 -0
- package/dist/core/invariant-coverage.d.ts +41 -0
- package/dist/core/invariant-coverage.d.ts.map +1 -0
- package/dist/core/invariant-coverage.js +181 -0
- package/dist/core/invariant-coverage.js.map +1 -0
- package/dist/core/invariant-coverage.test.d.ts +2 -0
- package/dist/core/invariant-coverage.test.d.ts.map +1 -0
- package/dist/core/invariant-coverage.test.js +188 -0
- package/dist/core/invariant-coverage.test.js.map +1 -0
- package/dist/core/meta-invariants.test.d.ts +17 -0
- package/dist/core/meta-invariants.test.d.ts.map +1 -0
- package/dist/core/meta-invariants.test.js +191 -0
- package/dist/core/meta-invariants.test.js.map +1 -0
- package/dist/core/node-fs.d.ts +22 -0
- package/dist/core/node-fs.d.ts.map +1 -0
- package/dist/core/node-fs.js +47 -0
- package/dist/core/node-fs.js.map +1 -0
- package/dist/core/organon-invariants.test.d.ts +15 -0
- package/dist/core/organon-invariants.test.d.ts.map +1 -0
- package/dist/core/organon-invariants.test.js +149 -0
- package/dist/core/organon-invariants.test.js.map +1 -0
- package/dist/core/query.d.ts +35 -0
- package/dist/core/query.d.ts.map +1 -0
- package/dist/core/query.js +139 -0
- package/dist/core/query.js.map +1 -0
- package/dist/core/query.test.d.ts +2 -0
- package/dist/core/query.test.d.ts.map +1 -0
- package/dist/core/query.test.js +97 -0
- package/dist/core/query.test.js.map +1 -0
- package/dist/core/suggest-tools.d.ts +15 -0
- package/dist/core/suggest-tools.d.ts.map +1 -0
- package/dist/core/suggest-tools.js +139 -0
- package/dist/core/suggest-tools.js.map +1 -0
- package/dist/core/suggest-tools.test.d.ts +2 -0
- package/dist/core/suggest-tools.test.d.ts.map +1 -0
- package/dist/core/suggest-tools.test.js +122 -0
- package/dist/core/suggest-tools.test.js.map +1 -0
- package/dist/core/test-helpers.d.ts +63 -0
- package/dist/core/test-helpers.d.ts.map +1 -0
- package/dist/core/test-helpers.js +265 -0
- package/dist/core/test-helpers.js.map +1 -0
- package/dist/core/types.d.ts +277 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +9 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/upgrade.d.ts +46 -0
- package/dist/core/upgrade.d.ts.map +1 -0
- package/dist/core/upgrade.js +227 -0
- package/dist/core/upgrade.js.map +1 -0
- package/dist/core/upgrade.test.d.ts +8 -0
- package/dist/core/upgrade.test.d.ts.map +1 -0
- package/dist/core/upgrade.test.js +370 -0
- package/dist/core/upgrade.test.js.map +1 -0
- package/dist/core/validate-frontmatter.d.ts +20 -0
- package/dist/core/validate-frontmatter.d.ts.map +1 -0
- package/dist/core/validate-frontmatter.js +529 -0
- package/dist/core/validate-frontmatter.js.map +1 -0
- package/dist/core/validate-frontmatter.test.d.ts +2 -0
- package/dist/core/validate-frontmatter.test.d.ts.map +1 -0
- package/dist/core/validate-frontmatter.test.js +366 -0
- package/dist/core/validate-frontmatter.test.js.map +1 -0
- package/dist/core/validate-workflow.d.ts +17 -0
- package/dist/core/validate-workflow.d.ts.map +1 -0
- package/dist/core/validate-workflow.js +233 -0
- package/dist/core/validate-workflow.js.map +1 -0
- package/dist/core/validate-workflow.test.d.ts +2 -0
- package/dist/core/validate-workflow.test.d.ts.map +1 -0
- package/dist/core/validate-workflow.test.js +205 -0
- package/dist/core/validate-workflow.test.js.map +1 -0
- package/dist/core/verify-tier4-tests.d.ts +34 -0
- package/dist/core/verify-tier4-tests.d.ts.map +1 -0
- package/dist/core/verify-tier4-tests.js +106 -0
- package/dist/core/verify-tier4-tests.js.map +1 -0
- package/dist/core/verify-tier4-tests.test.d.ts +2 -0
- package/dist/core/verify-tier4-tests.test.d.ts.map +1 -0
- package/dist/core/verify-tier4-tests.test.js +140 -0
- package/dist/core/verify-tier4-tests.test.js.map +1 -0
- package/dist/core/verify-triplets.d.ts +17 -0
- package/dist/core/verify-triplets.d.ts.map +1 -0
- package/dist/core/verify-triplets.js +217 -0
- package/dist/core/verify-triplets.js.map +1 -0
- package/dist/core/verify-triplets.test.d.ts +2 -0
- package/dist/core/verify-triplets.test.d.ts.map +1 -0
- package/dist/core/verify-triplets.test.js +147 -0
- package/dist/core/verify-triplets.test.js.map +1 -0
- package/dist/core/verify.d.ts +19 -0
- package/dist/core/verify.d.ts.map +1 -0
- package/dist/core/verify.js +162 -0
- package/dist/core/verify.js.map +1 -0
- package/dist/core/verify.test.d.ts +2 -0
- package/dist/core/verify.test.d.ts.map +1 -0
- package/dist/core/verify.test.js +147 -0
- package/dist/core/verify.test.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/prompts.d.ts +9 -0
- package/dist/mcp/prompts.d.ts.map +1 -0
- package/dist/mcp/prompts.js +265 -0
- package/dist/mcp/prompts.js.map +1 -0
- package/dist/mcp/resources.d.ts +7 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +111 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/server.d.ts +7 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +31 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +7 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +130 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/templates/config.d.ts +6 -0
- package/dist/templates/config.d.ts.map +1 -0
- package/dist/templates/config.js +30 -0
- package/dist/templates/config.js.map +1 -0
- package/dist/templates/index.d.ts +7 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +7 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/organon/claude-md.d.ts +7 -0
- package/dist/templates/organon/claude-md.d.ts.map +1 -0
- package/dist/templates/organon/claude-md.js +32 -0
- package/dist/templates/organon/claude-md.js.map +1 -0
- package/dist/templates/organon/ethos.d.ts +5 -0
- package/dist/templates/organon/ethos.d.ts.map +1 -0
- package/dist/templates/organon/ethos.js +69 -0
- package/dist/templates/organon/ethos.js.map +1 -0
- package/dist/templates/organon/index.d.ts +10 -0
- package/dist/templates/organon/index.d.ts.map +1 -0
- package/dist/templates/organon/index.js +10 -0
- package/dist/templates/organon/index.js.map +1 -0
- package/dist/templates/organon/observations-readme.d.ts +5 -0
- package/dist/templates/organon/observations-readme.d.ts.map +1 -0
- package/dist/templates/organon/observations-readme.js +25 -0
- package/dist/templates/organon/observations-readme.js.map +1 -0
- package/dist/templates/organon/philosophy.d.ts +5 -0
- package/dist/templates/organon/philosophy.d.ts.map +1 -0
- package/dist/templates/organon/philosophy.js +75 -0
- package/dist/templates/organon/philosophy.js.map +1 -0
- package/dist/templates/organon/protocols.d.ts +7 -0
- package/dist/templates/organon/protocols.d.ts.map +1 -0
- package/dist/templates/organon/protocols.js +197 -0
- package/dist/templates/organon/protocols.js.map +1 -0
- package/dist/templates/organon/readme.d.ts +5 -0
- package/dist/templates/organon/readme.d.ts.map +1 -0
- package/dist/templates/organon/readme.js +40 -0
- package/dist/templates/organon/readme.js.map +1 -0
- package/dist/templates/skills/domain-feature-design.d.ts +9 -0
- package/dist/templates/skills/domain-feature-design.d.ts.map +1 -0
- package/dist/templates/skills/domain-feature-design.js +123 -0
- package/dist/templates/skills/domain-feature-design.js.map +1 -0
- package/dist/templates/skills/index.d.ts +15 -0
- package/dist/templates/skills/index.d.ts.map +1 -0
- package/dist/templates/skills/index.js +35 -0
- package/dist/templates/skills/index.js.map +1 -0
- package/dist/templates/skills/organon-file-creation.d.ts +9 -0
- package/dist/templates/skills/organon-file-creation.d.ts.map +1 -0
- package/dist/templates/skills/organon-file-creation.js +138 -0
- package/dist/templates/skills/organon-file-creation.js.map +1 -0
- package/dist/templates/skills/quality-review.d.ts +9 -0
- package/dist/templates/skills/quality-review.d.ts.map +1 -0
- package/dist/templates/skills/quality-review.js +127 -0
- package/dist/templates/skills/quality-review.js.map +1 -0
- package/dist/templates/skills/session-compounding.d.ts +9 -0
- package/dist/templates/skills/session-compounding.d.ts.map +1 -0
- package/dist/templates/skills/session-compounding.js +118 -0
- package/dist/templates/skills/session-compounding.js.map +1 -0
- package/dist/templates/skills/verify-and-health.d.ts +9 -0
- package/dist/templates/skills/verify-and-health.d.ts.map +1 -0
- package/dist/templates/skills/verify-and-health.js +99 -0
- package/dist/templates/skills/verify-and-health.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YAML frontmatter extraction utility.
|
|
3
|
+
*
|
|
4
|
+
* Parses the --- delimited YAML block at the top of organon files.
|
|
5
|
+
* Returns typed Frontmatter or null if missing/invalid.
|
|
6
|
+
*/
|
|
7
|
+
import { parse as parseYaml } from 'yaml';
|
|
8
|
+
const FRONTMATTER_REGEX = /^---\r?\n([\s\S]*?)\r?\n---/;
|
|
9
|
+
/**
|
|
10
|
+
* Extract and parse YAML frontmatter from file content.
|
|
11
|
+
*/
|
|
12
|
+
export function parseFrontmatter(content) {
|
|
13
|
+
const match = content.match(FRONTMATTER_REGEX);
|
|
14
|
+
if (!match) {
|
|
15
|
+
return { frontmatter: null, rawFrontmatter: '', body: content };
|
|
16
|
+
}
|
|
17
|
+
const rawFrontmatter = match[1];
|
|
18
|
+
const body = content.slice(match[0].length).replace(/^\r?\n/, '');
|
|
19
|
+
try {
|
|
20
|
+
const parsed = parseYaml(rawFrontmatter);
|
|
21
|
+
if (parsed === null || typeof parsed !== 'object') {
|
|
22
|
+
return { frontmatter: null, rawFrontmatter, body };
|
|
23
|
+
}
|
|
24
|
+
return { frontmatter: parsed, rawFrontmatter, body };
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return { frontmatter: null, rawFrontmatter, body };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Build a ParsedOrganonFile from raw file content and path.
|
|
32
|
+
*/
|
|
33
|
+
export function parseOrganonFile(path, content) {
|
|
34
|
+
const { frontmatter, rawFrontmatter, body } = parseFrontmatter(content);
|
|
35
|
+
return { path, frontmatter, rawFrontmatter, body, content };
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Estimate token count from content.
|
|
39
|
+
* Heuristic: ~3.5 characters per token for markdown text.
|
|
40
|
+
* (Accounts for spaces, punctuation, and markdown syntax)
|
|
41
|
+
*/
|
|
42
|
+
export function estimateTokens(content) {
|
|
43
|
+
return Math.ceil(content.length / 3.5);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Count entries in a numbered/bulleted section.
|
|
47
|
+
* Matches patterns like:
|
|
48
|
+
* 1. **Name.**
|
|
49
|
+
* ### 1. Name
|
|
50
|
+
* - **Name.**
|
|
51
|
+
* ### Invariant 1:
|
|
52
|
+
*/
|
|
53
|
+
export function countSectionEntries(sectionContent) {
|
|
54
|
+
const lines = sectionContent.split('\n');
|
|
55
|
+
let count = 0;
|
|
56
|
+
for (const line of lines) {
|
|
57
|
+
const trimmed = line.trim();
|
|
58
|
+
// Match numbered entries: "1. **", "1. ", "### 1."
|
|
59
|
+
if (/^\d+\.\s/.test(trimmed)) {
|
|
60
|
+
count++;
|
|
61
|
+
}
|
|
62
|
+
// Match heading-style entries: "### Invariant 1:", "### Name"
|
|
63
|
+
else if (/^#{2,4}\s+(?:Invariant\s+)?\d+/i.test(trimmed)) {
|
|
64
|
+
count++;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return count;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Extract a specific ## section from markdown content.
|
|
71
|
+
* Returns the content between the matched heading and the next ## heading (or EOF).
|
|
72
|
+
*/
|
|
73
|
+
export function extractSection(content, heading) {
|
|
74
|
+
// Escape special regex characters in heading but allow flexible whitespace
|
|
75
|
+
const escapedHeading = heading.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
76
|
+
const pattern = new RegExp(`^##\\s+${escapedHeading}.*$`, 'm');
|
|
77
|
+
const match = content.match(pattern);
|
|
78
|
+
if (!match || match.index === undefined)
|
|
79
|
+
return null;
|
|
80
|
+
const start = match.index + match[0].length;
|
|
81
|
+
const rest = content.slice(start);
|
|
82
|
+
// Find next ## heading
|
|
83
|
+
const nextHeading = rest.match(/^##\s+/m);
|
|
84
|
+
const sectionContent = nextHeading && nextHeading.index !== undefined
|
|
85
|
+
? rest.slice(0, nextHeading.index)
|
|
86
|
+
: rest;
|
|
87
|
+
return sectionContent.trim();
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Count rows in a markdown table (excluding header and separator rows).
|
|
91
|
+
*/
|
|
92
|
+
export function countTableRows(sectionContent) {
|
|
93
|
+
const lines = sectionContent.split('\n');
|
|
94
|
+
let inTable = false;
|
|
95
|
+
let headerSeen = false;
|
|
96
|
+
let count = 0;
|
|
97
|
+
for (const line of lines) {
|
|
98
|
+
const trimmed = line.trim();
|
|
99
|
+
if (trimmed.startsWith('|') && trimmed.endsWith('|')) {
|
|
100
|
+
if (!inTable) {
|
|
101
|
+
inTable = true;
|
|
102
|
+
continue; // header row
|
|
103
|
+
}
|
|
104
|
+
if (!headerSeen) {
|
|
105
|
+
// separator row (|---|---|)
|
|
106
|
+
if (/^\|[\s\-:|]+\|$/.test(trimmed)) {
|
|
107
|
+
headerSeen = true;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (headerSeen) {
|
|
112
|
+
count++;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
inTable = false;
|
|
117
|
+
headerSeen = false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return count;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=frontmatter-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter-parser.js","sourceRoot":"","sources":["../../src/core/frontmatter-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter-parser.test.d.ts","sourceRoot":"","sources":["../../src/core/frontmatter-parser.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { parseFrontmatter, parseOrganonFile, estimateTokens, countSectionEntries, extractSection, countTableRows, } from './frontmatter-parser.js';
|
|
3
|
+
describe('parseFrontmatter', () => {
|
|
4
|
+
it('parses valid YAML frontmatter', () => {
|
|
5
|
+
const content = `---
|
|
6
|
+
type: constraints
|
|
7
|
+
scope: domain
|
|
8
|
+
name: test
|
|
9
|
+
version: "1.0"
|
|
10
|
+
summary: A test file
|
|
11
|
+
token_estimate: 500
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Content here`;
|
|
15
|
+
const result = parseFrontmatter(content);
|
|
16
|
+
expect(result.frontmatter).not.toBeNull();
|
|
17
|
+
expect(result.frontmatter.type).toBe('constraints');
|
|
18
|
+
expect(result.frontmatter.scope).toBe('domain');
|
|
19
|
+
expect(result.frontmatter.name).toBe('test');
|
|
20
|
+
expect(result.frontmatter.version).toBe('1.0');
|
|
21
|
+
expect(result.body).toContain('# Content here');
|
|
22
|
+
expect(result.rawFrontmatter).toContain('type: constraints');
|
|
23
|
+
});
|
|
24
|
+
it('returns null frontmatter for files without frontmatter', () => {
|
|
25
|
+
const content = '# Just a markdown file\n\nNo frontmatter here.';
|
|
26
|
+
const result = parseFrontmatter(content);
|
|
27
|
+
expect(result.frontmatter).toBeNull();
|
|
28
|
+
expect(result.rawFrontmatter).toBe('');
|
|
29
|
+
expect(result.body).toBe(content);
|
|
30
|
+
});
|
|
31
|
+
it('returns null frontmatter for invalid YAML', () => {
|
|
32
|
+
const content = `---
|
|
33
|
+
{{not: valid: yaml: [}}
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
# Content`;
|
|
37
|
+
const result = parseFrontmatter(content);
|
|
38
|
+
expect(result.frontmatter).toBeNull();
|
|
39
|
+
});
|
|
40
|
+
it('handles frontmatter with arrays and nested objects', () => {
|
|
41
|
+
const content = `---
|
|
42
|
+
type: procedures
|
|
43
|
+
scope: methodology
|
|
44
|
+
name: test-proto
|
|
45
|
+
version: "1.0"
|
|
46
|
+
summary: Test
|
|
47
|
+
token_estimate: 300
|
|
48
|
+
protocols:
|
|
49
|
+
- id: PROTO-TEST-1
|
|
50
|
+
name: Test Protocol
|
|
51
|
+
steps: 5
|
|
52
|
+
automation_tier: manual
|
|
53
|
+
complexity: medium
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
# Content`;
|
|
57
|
+
const result = parseFrontmatter(content);
|
|
58
|
+
expect(result.frontmatter.protocols).toHaveLength(1);
|
|
59
|
+
expect(result.frontmatter.protocols[0].id).toBe('PROTO-TEST-1');
|
|
60
|
+
});
|
|
61
|
+
it('handles Windows-style line endings', () => {
|
|
62
|
+
const content = '---\r\ntype: constraints\r\nname: test\r\n---\r\n\r\n# Content';
|
|
63
|
+
const result = parseFrontmatter(content);
|
|
64
|
+
expect(result.frontmatter).not.toBeNull();
|
|
65
|
+
expect(result.frontmatter.type).toBe('constraints');
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe('parseOrganonFile', () => {
|
|
69
|
+
it('returns a complete ParsedOrganonFile', () => {
|
|
70
|
+
const content = `---
|
|
71
|
+
type: constraints
|
|
72
|
+
scope: meta
|
|
73
|
+
name: test
|
|
74
|
+
version: "1.0"
|
|
75
|
+
summary: Test
|
|
76
|
+
token_estimate: 200
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
# Body`;
|
|
80
|
+
const result = parseOrganonFile('book-llms/ETHOS.md', content);
|
|
81
|
+
expect(result.path).toBe('book-llms/ETHOS.md');
|
|
82
|
+
expect(result.frontmatter).not.toBeNull();
|
|
83
|
+
expect(result.body).toContain('# Body');
|
|
84
|
+
expect(result.content).toBe(content);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe('estimateTokens', () => {
|
|
88
|
+
it('estimates ~1 token per 3.5 characters', () => {
|
|
89
|
+
const content = 'a'.repeat(400);
|
|
90
|
+
expect(estimateTokens(content)).toBe(115); // ceil(400/3.5) = 115
|
|
91
|
+
});
|
|
92
|
+
it('rounds up', () => {
|
|
93
|
+
const content = 'a'.repeat(5);
|
|
94
|
+
expect(estimateTokens(content)).toBe(2); // ceil(5/3.5) = 2
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('countSectionEntries', () => {
|
|
98
|
+
it('counts numbered entries', () => {
|
|
99
|
+
const section = `
|
|
100
|
+
1. **Rule one.** Description.
|
|
101
|
+
2. **Rule two.** Description.
|
|
102
|
+
3. **Rule three.** Description.
|
|
103
|
+
`;
|
|
104
|
+
expect(countSectionEntries(section)).toBe(3);
|
|
105
|
+
});
|
|
106
|
+
it('counts heading-style entries', () => {
|
|
107
|
+
const section = `
|
|
108
|
+
### 1. First heading
|
|
109
|
+
Content.
|
|
110
|
+
|
|
111
|
+
### 2. Second heading
|
|
112
|
+
Content.
|
|
113
|
+
`;
|
|
114
|
+
expect(countSectionEntries(section)).toBe(2);
|
|
115
|
+
});
|
|
116
|
+
it('returns 0 for empty section', () => {
|
|
117
|
+
expect(countSectionEntries('')).toBe(0);
|
|
118
|
+
});
|
|
119
|
+
it('ignores non-numbered lines', () => {
|
|
120
|
+
const section = `
|
|
121
|
+
Some text before.
|
|
122
|
+
- bullet point
|
|
123
|
+
* another bullet
|
|
124
|
+
1. **Actual entry.** Real one.
|
|
125
|
+
More text.
|
|
126
|
+
`;
|
|
127
|
+
expect(countSectionEntries(section)).toBe(1);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
describe('extractSection', () => {
|
|
131
|
+
it('extracts a section by heading', () => {
|
|
132
|
+
const content = `## Identity
|
|
133
|
+
|
|
134
|
+
Some identity content.
|
|
135
|
+
|
|
136
|
+
## Invariants
|
|
137
|
+
|
|
138
|
+
1. **Rule 1.** Description.
|
|
139
|
+
2. **Rule 2.** Description.
|
|
140
|
+
|
|
141
|
+
## Principles
|
|
142
|
+
|
|
143
|
+
1. **Principle 1.** Description.
|
|
144
|
+
`;
|
|
145
|
+
const section = extractSection(content, 'Invariants');
|
|
146
|
+
expect(section).not.toBeNull();
|
|
147
|
+
expect(section).toContain('Rule 1');
|
|
148
|
+
expect(section).toContain('Rule 2');
|
|
149
|
+
expect(section).not.toContain('Principle 1');
|
|
150
|
+
expect(section).not.toContain('Some identity');
|
|
151
|
+
});
|
|
152
|
+
it('returns null for missing section', () => {
|
|
153
|
+
const content = '## Identity\n\nContent.';
|
|
154
|
+
expect(extractSection(content, 'Invariants')).toBeNull();
|
|
155
|
+
});
|
|
156
|
+
it('extracts the last section (no next heading)', () => {
|
|
157
|
+
const content = `## First
|
|
158
|
+
|
|
159
|
+
First content.
|
|
160
|
+
|
|
161
|
+
## Last
|
|
162
|
+
|
|
163
|
+
Last content here.
|
|
164
|
+
`;
|
|
165
|
+
const section = extractSection(content, 'Last');
|
|
166
|
+
expect(section).not.toBeNull();
|
|
167
|
+
expect(section).toContain('Last content here.');
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe('countTableRows', () => {
|
|
171
|
+
it('counts data rows excluding header and separator', () => {
|
|
172
|
+
const section = `
|
|
173
|
+
| Situation | Action |
|
|
174
|
+
|-----------|--------|
|
|
175
|
+
| When X | Do Y |
|
|
176
|
+
| When A | Do B |
|
|
177
|
+
| When C | Do D |
|
|
178
|
+
`;
|
|
179
|
+
expect(countTableRows(section)).toBe(3);
|
|
180
|
+
});
|
|
181
|
+
it('returns 0 for no table', () => {
|
|
182
|
+
expect(countTableRows('Just plain text')).toBe(0);
|
|
183
|
+
});
|
|
184
|
+
it('handles multiple tables', () => {
|
|
185
|
+
const section = `
|
|
186
|
+
| Col1 | Col2 |
|
|
187
|
+
|------|------|
|
|
188
|
+
| A | B |
|
|
189
|
+
|
|
190
|
+
Some text between.
|
|
191
|
+
|
|
192
|
+
| Col1 | Col2 |
|
|
193
|
+
|------|------|
|
|
194
|
+
| C | D |
|
|
195
|
+
| E | F |
|
|
196
|
+
`;
|
|
197
|
+
expect(countTableRows(section)).toBe(3);
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
//# sourceMappingURL=frontmatter-parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter-parser.test.js","sourceRoot":"","sources":["../../src/core/frontmatter-parser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-generate frontmatter from file content.
|
|
3
|
+
*
|
|
4
|
+
* Analyzes the file's content to infer type, scope, name, version,
|
|
5
|
+
* summary, token_estimate, and type-specific counts. Can be used to
|
|
6
|
+
* bootstrap frontmatter for new files or update stale counts.
|
|
7
|
+
*/
|
|
8
|
+
import type { FileSystem, Frontmatter, FrontmatterScope, FrontmatterType, GenerateFrontmatterResult, OrganonConfig } from './types.js';
|
|
9
|
+
export interface GenerateFrontmatterOptions {
|
|
10
|
+
projectRoot: string;
|
|
11
|
+
config: OrganonConfig;
|
|
12
|
+
fs: FileSystem;
|
|
13
|
+
/** File to generate frontmatter for (project-relative path) */
|
|
14
|
+
file: string;
|
|
15
|
+
/** If true, write updated frontmatter back to file */
|
|
16
|
+
update?: boolean;
|
|
17
|
+
/** Override auto-detected type */
|
|
18
|
+
type?: FrontmatterType;
|
|
19
|
+
/** Override auto-detected scope */
|
|
20
|
+
scope?: FrontmatterScope;
|
|
21
|
+
}
|
|
22
|
+
export declare function generateFrontmatter(options: GenerateFrontmatterOptions): Promise<GenerateFrontmatterResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Serialize generated frontmatter as a YAML block (with --- delimiters).
|
|
25
|
+
*/
|
|
26
|
+
export declare function serializeFrontmatter(fm: Partial<Frontmatter>): string;
|
|
27
|
+
//# sourceMappingURL=generate-frontmatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-frontmatter.d.ts","sourceRoot":"","sources":["../../src/core/generate-frontmatter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAEV,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,yBAAyB,EACzB,aAAa,EACd,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,EAAE,EAAE,UAAU,CAAC;IACf,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kCAAkC;IAClC,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,mCAAmC;IACnC,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAMD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,yBAAyB,CAAC,CAsGpC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,CAGrE"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-generate frontmatter from file content.
|
|
3
|
+
*
|
|
4
|
+
* Analyzes the file's content to infer type, scope, name, version,
|
|
5
|
+
* summary, token_estimate, and type-specific counts. Can be used to
|
|
6
|
+
* bootstrap frontmatter for new files or update stale counts.
|
|
7
|
+
*/
|
|
8
|
+
import { parseFrontmatter, estimateTokens, extractSection, countSectionEntries, countTableRows } from './frontmatter-parser.js';
|
|
9
|
+
import { parseProtocols } from './add-protocols-array.js';
|
|
10
|
+
import { joinPath, baseName, dirName } from './config.js';
|
|
11
|
+
import { stringify as yamlStringify } from 'yaml';
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Main
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
export async function generateFrontmatter(options) {
|
|
16
|
+
const { projectRoot, fs, file } = options;
|
|
17
|
+
const errors = [];
|
|
18
|
+
const warnings = [];
|
|
19
|
+
const absPath = joinPath(projectRoot, file);
|
|
20
|
+
let content;
|
|
21
|
+
try {
|
|
22
|
+
content = await fs.readFile(absPath);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return {
|
|
26
|
+
success: false,
|
|
27
|
+
file,
|
|
28
|
+
generated: {},
|
|
29
|
+
errors: [{
|
|
30
|
+
severity: 'error',
|
|
31
|
+
code: 'FILE_READ_ERROR',
|
|
32
|
+
message: `Cannot read file: ${file}`,
|
|
33
|
+
file,
|
|
34
|
+
}],
|
|
35
|
+
warnings: [],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const existing = parseFrontmatter(content);
|
|
39
|
+
const body = existing.body || content;
|
|
40
|
+
const existingFm = existing.frontmatter;
|
|
41
|
+
// Infer fields from content and path
|
|
42
|
+
const type = options.type ?? existingFm?.type ?? inferType(file);
|
|
43
|
+
const scope = options.scope ?? existingFm?.scope ?? inferScope(file);
|
|
44
|
+
const name = existingFm?.name ?? inferName(file);
|
|
45
|
+
const version = existingFm?.version ?? '1.0';
|
|
46
|
+
const summary = existingFm?.summary ?? inferSummary(body);
|
|
47
|
+
const tokenEstimate = estimateTokens(content);
|
|
48
|
+
const generated = {
|
|
49
|
+
type,
|
|
50
|
+
scope,
|
|
51
|
+
name,
|
|
52
|
+
version,
|
|
53
|
+
summary,
|
|
54
|
+
token_estimate: tokenEstimate,
|
|
55
|
+
};
|
|
56
|
+
// Type-specific fields
|
|
57
|
+
if (type === 'constraints') {
|
|
58
|
+
const invariantsSection = extractSection(body, 'Invariants');
|
|
59
|
+
if (invariantsSection) {
|
|
60
|
+
generated.invariants_count = countSectionEntries(invariantsSection);
|
|
61
|
+
}
|
|
62
|
+
const principlesSection = extractSection(body, 'Principles');
|
|
63
|
+
if (principlesSection) {
|
|
64
|
+
generated.principles_count = countSectionEntries(principlesSection);
|
|
65
|
+
}
|
|
66
|
+
const heuristicsSection = extractSection(body, 'Decision Heuristics');
|
|
67
|
+
if (heuristicsSection) {
|
|
68
|
+
generated.heuristics_count = countTableRows(heuristicsSection);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (type === 'rationale') {
|
|
72
|
+
const decisionsSection = extractSection(body, 'Design Decisions');
|
|
73
|
+
if (decisionsSection) {
|
|
74
|
+
generated.decision_count = countSectionEntries(decisionsSection);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (type === 'procedures') {
|
|
78
|
+
const protocols = parseProtocols(body);
|
|
79
|
+
if (protocols.length > 0) {
|
|
80
|
+
generated.protocols_count = protocols.length;
|
|
81
|
+
generated.protocols = protocols;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (type === 'navigation') {
|
|
85
|
+
generated.provides = inferProvides(body);
|
|
86
|
+
generated.parent = inferParent(file);
|
|
87
|
+
}
|
|
88
|
+
// Preserve existing relationship fields
|
|
89
|
+
if (existingFm) {
|
|
90
|
+
if (existingFm.inherits_from)
|
|
91
|
+
generated.inherits_from = existingFm.inherits_from;
|
|
92
|
+
if (existingFm.related_domains)
|
|
93
|
+
generated.related_domains = existingFm.related_domains;
|
|
94
|
+
if (existingFm.related_features)
|
|
95
|
+
generated.related_features = existingFm.related_features;
|
|
96
|
+
if (existingFm.primary_rfcs)
|
|
97
|
+
generated.primary_rfcs = existingFm.primary_rfcs;
|
|
98
|
+
if (existingFm.secondary_rfcs)
|
|
99
|
+
generated.secondary_rfcs = existingFm.secondary_rfcs;
|
|
100
|
+
if (existingFm.load_priority)
|
|
101
|
+
generated.load_priority = existingFm.load_priority;
|
|
102
|
+
if (existingFm.required_for)
|
|
103
|
+
generated.required_for = existingFm.required_for;
|
|
104
|
+
if (existingFm.audience)
|
|
105
|
+
generated.audience = existingFm.audience;
|
|
106
|
+
if (existingFm.last_reviewed)
|
|
107
|
+
generated.last_reviewed = existingFm.last_reviewed;
|
|
108
|
+
if (existingFm.methodology_version)
|
|
109
|
+
generated.methodology_version = existingFm.methodology_version;
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
success: errors.length === 0,
|
|
113
|
+
file,
|
|
114
|
+
generated,
|
|
115
|
+
errors,
|
|
116
|
+
warnings,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Serialize generated frontmatter as a YAML block (with --- delimiters).
|
|
121
|
+
*/
|
|
122
|
+
export function serializeFrontmatter(fm) {
|
|
123
|
+
const yaml = yamlStringify(fm, { lineWidth: 120 });
|
|
124
|
+
return `---\n${yaml}---\n`;
|
|
125
|
+
}
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
// Inference helpers
|
|
128
|
+
// ---------------------------------------------------------------------------
|
|
129
|
+
function inferType(file) {
|
|
130
|
+
const name = baseName(file).toUpperCase();
|
|
131
|
+
if (name === 'ETHOS.MD')
|
|
132
|
+
return 'constraints';
|
|
133
|
+
if (name === 'PHILOSOPHY.MD')
|
|
134
|
+
return 'rationale';
|
|
135
|
+
if (name === 'PROTOCOL.MD' || name === 'PROTOCOLS.MD')
|
|
136
|
+
return 'procedures';
|
|
137
|
+
if (name === 'README.MD')
|
|
138
|
+
return 'navigation';
|
|
139
|
+
if (name === 'COMPONENTS.MD')
|
|
140
|
+
return 'mapping';
|
|
141
|
+
// Default based on content — but since we don't have content here, pick constraints
|
|
142
|
+
return 'constraints';
|
|
143
|
+
}
|
|
144
|
+
function inferScope(file) {
|
|
145
|
+
const path = file.replace(/\\/g, '/');
|
|
146
|
+
if (path.includes('/domains/'))
|
|
147
|
+
return 'domain';
|
|
148
|
+
if (path.includes('/features/'))
|
|
149
|
+
return 'feature';
|
|
150
|
+
if (path.includes('/components/'))
|
|
151
|
+
return 'component';
|
|
152
|
+
if (path.includes('/methodology/'))
|
|
153
|
+
return 'methodology';
|
|
154
|
+
if (path.includes('book-llms/') || path.includes('book-humans/'))
|
|
155
|
+
return 'meta';
|
|
156
|
+
// Top-level files are product scope
|
|
157
|
+
const depth = path.split('/').length;
|
|
158
|
+
if (depth <= 2)
|
|
159
|
+
return 'product';
|
|
160
|
+
return 'meta';
|
|
161
|
+
}
|
|
162
|
+
function inferName(file) {
|
|
163
|
+
const dir = dirName(file);
|
|
164
|
+
const parts = dir.replace(/\\/g, '/').split('/');
|
|
165
|
+
const parentDir = parts[parts.length - 1];
|
|
166
|
+
if (parentDir && parentDir !== '.' && parentDir !== '') {
|
|
167
|
+
return parentDir.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
|
|
168
|
+
}
|
|
169
|
+
// Fallback: use filename without extension
|
|
170
|
+
const filename = baseName(file);
|
|
171
|
+
return filename.replace(/\.md$/i, '').toLowerCase().replace(/[^a-z0-9]+/g, '-');
|
|
172
|
+
}
|
|
173
|
+
function inferSummary(body) {
|
|
174
|
+
// Look for the first line that's not a heading, empty, or horizontal rule
|
|
175
|
+
const lines = body.split('\n');
|
|
176
|
+
for (const line of lines) {
|
|
177
|
+
const trimmed = line.trim();
|
|
178
|
+
if (!trimmed)
|
|
179
|
+
continue;
|
|
180
|
+
if (trimmed.startsWith('#'))
|
|
181
|
+
continue;
|
|
182
|
+
if (trimmed.startsWith('---'))
|
|
183
|
+
continue;
|
|
184
|
+
if (trimmed.startsWith('>')) {
|
|
185
|
+
// Blockquote — use as summary
|
|
186
|
+
const text = trimmed.replace(/^>\s*/, '');
|
|
187
|
+
if (text.length > 200)
|
|
188
|
+
return text.slice(0, 197) + '...';
|
|
189
|
+
return text;
|
|
190
|
+
}
|
|
191
|
+
// First paragraph line
|
|
192
|
+
if (trimmed.length > 200)
|
|
193
|
+
return trimmed.slice(0, 197) + '...';
|
|
194
|
+
return trimmed;
|
|
195
|
+
}
|
|
196
|
+
return 'No summary available';
|
|
197
|
+
}
|
|
198
|
+
function inferProvides(body) {
|
|
199
|
+
const provides = [];
|
|
200
|
+
const lines = body.split('\n');
|
|
201
|
+
for (const line of lines) {
|
|
202
|
+
const trimmed = line.trim();
|
|
203
|
+
// Look for links or list items
|
|
204
|
+
const linkMatch = trimmed.match(/^\-\s*\[([^\]]+)\]/);
|
|
205
|
+
if (linkMatch) {
|
|
206
|
+
provides.push(linkMatch[1]);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return provides.length > 0 ? provides : ['contents'];
|
|
210
|
+
}
|
|
211
|
+
function inferParent(file) {
|
|
212
|
+
const dir = dirName(file);
|
|
213
|
+
const parts = dir.replace(/\\/g, '/').split('/');
|
|
214
|
+
if (parts.length >= 2) {
|
|
215
|
+
return parts[parts.length - 2];
|
|
216
|
+
}
|
|
217
|
+
return 'root';
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=generate-frontmatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-frontmatter.js","sourceRoot":"","sources":["../../src/core/generate-frontmatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-frontmatter.test.d.ts","sourceRoot":"","sources":["../../src/core/generate-frontmatter.test.ts"],"names":[],"mappings":""}
|