@skillit/core 1.5.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.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +55 -0
  3. package/dist/audit-formatter.d.ts +36 -0
  4. package/dist/audit-formatter.d.ts.map +1 -0
  5. package/dist/audit-formatter.js +173 -0
  6. package/dist/audit-formatter.js.map +1 -0
  7. package/dist/audit-score.d.ts +76 -0
  8. package/dist/audit-score.d.ts.map +1 -0
  9. package/dist/audit-score.js +490 -0
  10. package/dist/audit-score.js.map +1 -0
  11. package/dist/audit-types.d.ts +81 -0
  12. package/dist/audit-types.d.ts.map +1 -0
  13. package/dist/audit-types.js +2 -0
  14. package/dist/audit-types.js.map +1 -0
  15. package/dist/audit.d.ts +17 -0
  16. package/dist/audit.d.ts.map +1 -0
  17. package/dist/audit.js +567 -0
  18. package/dist/audit.js.map +1 -0
  19. package/dist/canonical.d.ts +36 -0
  20. package/dist/canonical.d.ts.map +1 -0
  21. package/dist/canonical.js +148 -0
  22. package/dist/canonical.js.map +1 -0
  23. package/dist/config-renderer.d.ts +16 -0
  24. package/dist/config-renderer.d.ts.map +1 -0
  25. package/dist/config-renderer.js +296 -0
  26. package/dist/config-renderer.js.map +1 -0
  27. package/dist/config-types.d.ts +144 -0
  28. package/dist/config-types.d.ts.map +1 -0
  29. package/dist/config-types.js +2 -0
  30. package/dist/config-types.js.map +1 -0
  31. package/dist/docs-scanner.d.ts +40 -0
  32. package/dist/docs-scanner.d.ts.map +1 -0
  33. package/dist/docs-scanner.js +176 -0
  34. package/dist/docs-scanner.js.map +1 -0
  35. package/dist/examples-scanner.d.ts +39 -0
  36. package/dist/examples-scanner.d.ts.map +1 -0
  37. package/dist/examples-scanner.js +221 -0
  38. package/dist/examples-scanner.js.map +1 -0
  39. package/dist/index.d.ts +40 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +31 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/llms-txt.d.ts +20 -0
  44. package/dist/llms-txt.d.ts.map +1 -0
  45. package/dist/llms-txt.js +187 -0
  46. package/dist/llms-txt.js.map +1 -0
  47. package/dist/markdown-parser.d.ts +11 -0
  48. package/dist/markdown-parser.d.ts.map +1 -0
  49. package/dist/markdown-parser.js +222 -0
  50. package/dist/markdown-parser.js.map +1 -0
  51. package/dist/markdown-types.d.ts +48 -0
  52. package/dist/markdown-types.d.ts.map +1 -0
  53. package/dist/markdown-types.js +2 -0
  54. package/dist/markdown-types.js.map +1 -0
  55. package/dist/readme-parser.d.ts +21 -0
  56. package/dist/readme-parser.d.ts.map +1 -0
  57. package/dist/readme-parser.js +137 -0
  58. package/dist/readme-parser.js.map +1 -0
  59. package/dist/references-mcp.d.ts +79 -0
  60. package/dist/references-mcp.d.ts.map +1 -0
  61. package/dist/references-mcp.js +130 -0
  62. package/dist/references-mcp.js.map +1 -0
  63. package/dist/refine/ast-edit.d.ts +21 -0
  64. package/dist/refine/ast-edit.d.ts.map +1 -0
  65. package/dist/refine/ast-edit.js +147 -0
  66. package/dist/refine/ast-edit.js.map +1 -0
  67. package/dist/refine/index.d.ts +7 -0
  68. package/dist/refine/index.d.ts.map +1 -0
  69. package/dist/refine/index.js +6 -0
  70. package/dist/refine/index.js.map +1 -0
  71. package/dist/refine/jsdoc-edit.d.ts +4 -0
  72. package/dist/refine/jsdoc-edit.d.ts.map +1 -0
  73. package/dist/refine/jsdoc-edit.js +6 -0
  74. package/dist/refine/jsdoc-edit.js.map +1 -0
  75. package/dist/refine/loop.d.ts +8 -0
  76. package/dist/refine/loop.d.ts.map +1 -0
  77. package/dist/refine/loop.js +98 -0
  78. package/dist/refine/loop.js.map +1 -0
  79. package/dist/refine/select-targets.d.ts +5 -0
  80. package/dist/refine/select-targets.d.ts.map +1 -0
  81. package/dist/refine/select-targets.js +30 -0
  82. package/dist/refine/select-targets.js.map +1 -0
  83. package/dist/refine/types.d.ts +67 -0
  84. package/dist/refine/types.d.ts.map +1 -0
  85. package/dist/refine/types.js +2 -0
  86. package/dist/refine/types.js.map +1 -0
  87. package/dist/renderer.d.ts +27 -0
  88. package/dist/renderer.d.ts.map +1 -0
  89. package/dist/renderer.js +1244 -0
  90. package/dist/renderer.js.map +1 -0
  91. package/dist/tokens.d.ts +14 -0
  92. package/dist/tokens.d.ts.map +1 -0
  93. package/dist/tokens.js +26 -0
  94. package/dist/tokens.js.map +1 -0
  95. package/dist/types.d.ts +519 -0
  96. package/dist/types.d.ts.map +1 -0
  97. package/dist/types.js +2 -0
  98. package/dist/types.js.map +1 -0
  99. package/dist/writer.d.ts +17 -0
  100. package/dist/writer.d.ts.map +1 -0
  101. package/dist/writer.js +313 -0
  102. package/dist/writer.js.map +1 -0
  103. package/package.json +54 -0
@@ -0,0 +1,187 @@
1
+ import { estimateTokens } from './tokens.js';
2
+ /** Max description length in llms.txt summary */
3
+ const SUMMARY_DESC_MAX = 150;
4
+ /** Render llms.txt and llms-full.txt from extracted skills */
5
+ export function renderLlmsTxt(skills, options) {
6
+ const summary = renderSummary(skills, options);
7
+ const full = renderFull(skills, options);
8
+ return {
9
+ summary,
10
+ full,
11
+ summaryTokens: estimateTokens(summary),
12
+ fullTokens: estimateTokens(full)
13
+ };
14
+ }
15
+ // ---------------------------------------------------------------------------
16
+ // llms.txt — summary index
17
+ // ---------------------------------------------------------------------------
18
+ function renderSummary(skills, options) {
19
+ const lines = [];
20
+ lines.push(`# ${options.projectName}\n`);
21
+ if (options.projectDescription) {
22
+ lines.push(`> ${options.projectDescription}\n`);
23
+ }
24
+ if (skills.length > 1) {
25
+ for (const skill of skills) {
26
+ lines.push(`## ${skill.name}\n`);
27
+ if (skill.description) {
28
+ lines.push(`> ${truncateDescription(skill.description)}\n`);
29
+ }
30
+ renderSummarySections(skill, lines);
31
+ }
32
+ }
33
+ else if (skills.length === 1) {
34
+ renderSummarySections(skills[0], lines);
35
+ }
36
+ return lines.join('\n');
37
+ }
38
+ function renderSummarySections(skill, lines) {
39
+ const primary = [];
40
+ const optional = [];
41
+ // Functions
42
+ for (const fn of skill.functions) {
43
+ const desc = truncateDescription(fn.description);
44
+ primary.push(`- \`${fn.name}\`${desc ? `: ${desc}` : ''}`);
45
+ }
46
+ // Classes
47
+ for (const cls of skill.classes) {
48
+ const desc = truncateDescription(cls.description);
49
+ primary.push(`- \`${cls.name}\`${desc ? `: ${desc}` : ''}`);
50
+ }
51
+ // Variables
52
+ for (const v of skill.variables ?? []) {
53
+ const desc = truncateDescription(v.description);
54
+ primary.push(`- \`${v.name}\`${desc ? `: ${desc}` : ''}`);
55
+ }
56
+ // Types/Interfaces
57
+ for (const t of skill.types) {
58
+ const desc = truncateDescription(t.description);
59
+ optional.push(`- \`${t.name}\`${desc ? `: ${desc}` : ''}`);
60
+ }
61
+ // Enums
62
+ for (const e of skill.enums) {
63
+ const desc = truncateDescription(e.description);
64
+ optional.push(`- \`${e.name}\`${desc ? `: ${desc}` : ''}`);
65
+ }
66
+ if (primary.length > 0) {
67
+ lines.push('### API\n');
68
+ lines.push(...primary);
69
+ lines.push('');
70
+ }
71
+ if (optional.length > 0) {
72
+ lines.push('## Optional\n');
73
+ lines.push('### Types\n');
74
+ lines.push(...optional);
75
+ lines.push('');
76
+ }
77
+ }
78
+ // ---------------------------------------------------------------------------
79
+ // llms-full.txt — complete API content
80
+ // ---------------------------------------------------------------------------
81
+ function renderFull(skills, options) {
82
+ const lines = [];
83
+ lines.push(`# ${options.projectName}\n`);
84
+ if (options.projectDescription) {
85
+ lines.push(`> ${options.projectDescription}\n`);
86
+ }
87
+ for (const skill of skills) {
88
+ if (skills.length > 1) {
89
+ lines.push(`## ${skill.name}\n`);
90
+ if (skill.description)
91
+ lines.push(`${skill.description}\n`);
92
+ }
93
+ // Functions
94
+ for (const fn of skill.functions) {
95
+ lines.push(`### ${fn.name}\n`);
96
+ if (fn.description)
97
+ lines.push(`${fn.description}\n`);
98
+ if (fn.signature) {
99
+ lines.push('```ts', fn.signature, '```\n');
100
+ }
101
+ if (fn.parameters.length > 0) {
102
+ lines.push('**Parameters:**');
103
+ for (const p of fn.parameters) {
104
+ const opt = p.optional ? ' (optional)' : '';
105
+ lines.push(`- \`${p.name}: ${p.type}\`${opt} — ${p.description || ''}`);
106
+ }
107
+ lines.push('');
108
+ }
109
+ if (fn.returnType && fn.returnType !== 'void') {
110
+ lines.push(`**Returns:** \`${fn.returnType}\`\n`);
111
+ }
112
+ if (fn.examples.length > 0) {
113
+ for (const ex of fn.examples) {
114
+ lines.push(ex);
115
+ }
116
+ lines.push('');
117
+ }
118
+ }
119
+ // Classes
120
+ for (const cls of skill.classes) {
121
+ lines.push(`### ${cls.name}\n`);
122
+ if (cls.description)
123
+ lines.push(`${cls.description}\n`);
124
+ if (cls.constructorSignature) {
125
+ lines.push('```ts', cls.constructorSignature, '```\n');
126
+ }
127
+ if (cls.properties.length > 0) {
128
+ lines.push('**Properties:**');
129
+ for (const p of cls.properties) {
130
+ lines.push(`- \`${p.name}: ${p.type}\` — ${p.description || ''}`);
131
+ }
132
+ lines.push('');
133
+ }
134
+ if (cls.methods.length > 0) {
135
+ lines.push('**Methods:**');
136
+ for (const m of cls.methods) {
137
+ lines.push(`- \`${m.signature}\` — ${m.description || ''}`);
138
+ }
139
+ lines.push('');
140
+ }
141
+ }
142
+ // Types
143
+ for (const t of skill.types) {
144
+ lines.push(`### ${t.name}\n`);
145
+ if (t.description)
146
+ lines.push(`${t.description}\n`);
147
+ if (t.definition) {
148
+ lines.push('```ts', `type ${t.name} = ${t.definition}`, '```\n');
149
+ }
150
+ }
151
+ // Enums
152
+ for (const e of skill.enums) {
153
+ lines.push(`### ${e.name}\n`);
154
+ if (e.description)
155
+ lines.push(`${e.description}\n`);
156
+ for (const m of e.members) {
157
+ lines.push(`- \`${m.name}\` = \`${m.value}\` — ${m.description || ''}`);
158
+ }
159
+ lines.push('');
160
+ }
161
+ // Variables
162
+ for (const v of skill.variables ?? []) {
163
+ lines.push(`### ${v.name}\n`);
164
+ if (v.description)
165
+ lines.push(`${v.description}\n`);
166
+ const keyword = v.isConst ? 'const' : 'let';
167
+ lines.push('```ts', `${keyword} ${v.name}: ${v.type}`, '```\n');
168
+ }
169
+ if (skills.length > 1) {
170
+ lines.push('---\n');
171
+ }
172
+ }
173
+ return lines.join('\n');
174
+ }
175
+ // ---------------------------------------------------------------------------
176
+ // Helpers
177
+ // ---------------------------------------------------------------------------
178
+ function truncateDescription(desc) {
179
+ if (!desc || desc.length <= SUMMARY_DESC_MAX)
180
+ return desc;
181
+ const firstSentence = desc.match(/^[^.!?]+[.!?]/)?.[0];
182
+ if (firstSentence && firstSentence.length <= SUMMARY_DESC_MAX) {
183
+ return firstSentence;
184
+ }
185
+ return desc.slice(0, SUMMARY_DESC_MAX - 3) + '...';
186
+ }
187
+ //# sourceMappingURL=llms-txt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llms-txt.js","sourceRoot":"","sources":["../src/llms-txt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ParsedMarkdownDoc } from './markdown-types.js';
2
+ /**
3
+ * Parse a markdown document string into a structured `ParsedMarkdownDoc`.
4
+ *
5
+ * @param markdown - Raw markdown source text.
6
+ * @param filePath - File path used for `relativePath`, title fallback, and order fallback.
7
+ *
8
+ * @category Parsing
9
+ */
10
+ export declare function parseMarkdownDoc(markdown: string, filePath: string): ParsedMarkdownDoc;
11
+ //# sourceMappingURL=markdown-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-parser.d.ts","sourceRoot":"","sources":["../src/markdown-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,qBAAqB,CAAC;AA0N5E;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAqCtF"}
@@ -0,0 +1,222 @@
1
+ // ─── Frontmatter ──────────────────────────────────────────────────────────────
2
+ /**
3
+ * Extract YAML frontmatter from the top of a markdown string.
4
+ * Returns the parsed key-value pairs and the remaining body, or undefined
5
+ * frontmatter when no frontmatter block is present.
6
+ */
7
+ function extractFrontmatter(markdown) {
8
+ const FM_OPEN = /^---\r?\n/;
9
+ if (!FM_OPEN.test(markdown)) {
10
+ return { frontmatter: undefined, body: markdown };
11
+ }
12
+ const closeIdx = markdown.indexOf('\n---\n', 3);
13
+ if (closeIdx === -1) {
14
+ return { frontmatter: undefined, body: markdown };
15
+ }
16
+ const fmText = markdown.slice(4, closeIdx); // skip leading "---\n"
17
+ const body = markdown.slice(closeIdx + 5); // skip "\n---\n"
18
+ const frontmatter = {};
19
+ for (const line of fmText.split('\n')) {
20
+ const colonIdx = line.indexOf(':');
21
+ if (colonIdx === -1)
22
+ continue;
23
+ const key = line.slice(0, colonIdx).trim();
24
+ if (!key)
25
+ continue;
26
+ let value = line.slice(colonIdx + 1).trim();
27
+ // Strip surrounding quotes
28
+ if ((value.startsWith('"') && value.endsWith('"')) ||
29
+ (value.startsWith("'") && value.endsWith("'"))) {
30
+ value = value.slice(1, -1);
31
+ }
32
+ // Coerce numeric
33
+ if (value !== '' && !Number.isNaN(Number(value))) {
34
+ frontmatter[key] = Number(value);
35
+ }
36
+ else {
37
+ frontmatter[key] = value;
38
+ }
39
+ }
40
+ return { frontmatter, body };
41
+ }
42
+ // ─── Title ────────────────────────────────────────────────────────────────────
43
+ /** Convert a kebab-case basename (without extension) to Title Case. */
44
+ function filenameToTitle(filePath) {
45
+ const basename = filePath.split('/').pop() ?? filePath;
46
+ const withoutExt = basename.replace(/\.[^.]+$/, '');
47
+ // Strip leading numeric prefix like "01-", "003-"
48
+ const stripped = withoutExt.replace(/^\d+-/, '');
49
+ return stripped
50
+ .split('-')
51
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
52
+ .join(' ');
53
+ }
54
+ /** Extract the text of the first `# heading` from a body string, or undefined. */
55
+ function extractFirstH1(body) {
56
+ for (const line of body.split('\n')) {
57
+ const m = line.match(/^#\s+(.+)/);
58
+ if (m)
59
+ return m[1]?.trim();
60
+ }
61
+ return undefined;
62
+ }
63
+ // ─── Description ─────────────────────────────────────────────────────────────
64
+ /**
65
+ * Extract the first prose paragraph that appears after the first `# heading`.
66
+ * Returns undefined when none found.
67
+ */
68
+ function extractFirstParagraph(body) {
69
+ const lines = body.split('\n');
70
+ let pastFirstHeading = false;
71
+ const paraLines = [];
72
+ let inPara = false;
73
+ for (const line of lines) {
74
+ // Detect any heading
75
+ if (/^#{1,6}\s/.test(line)) {
76
+ if (!pastFirstHeading) {
77
+ pastFirstHeading = true;
78
+ continue;
79
+ }
80
+ // Any subsequent heading ends the paragraph search
81
+ if (inPara || pastFirstHeading)
82
+ break;
83
+ continue;
84
+ }
85
+ if (!pastFirstHeading)
86
+ continue;
87
+ const trimmed = line.trim();
88
+ if (trimmed === '') {
89
+ if (inPara)
90
+ break; // blank line ends paragraph
91
+ continue;
92
+ }
93
+ inPara = true;
94
+ paraLines.push(trimmed);
95
+ }
96
+ if (paraLines.length === 0)
97
+ return undefined;
98
+ return paraLines.join(' ');
99
+ }
100
+ // ─── Sections ─────────────────────────────────────────────────────────────────
101
+ /** Return the heading level (number of leading `#`) or 0 if not a heading. */
102
+ function headingLevel(line) {
103
+ const m = line.match(/^(#{1,6})\s/);
104
+ return m ? (m[1]?.length ?? 0) : 0;
105
+ }
106
+ /** Extract the heading text from a heading line. */
107
+ function headingText(line) {
108
+ return line.replace(/^#{1,6}\s+/, '').trim();
109
+ }
110
+ /**
111
+ * Split content into a prose part and a list of fenced code blocks.
112
+ * Code blocks are stripped from the prose.
113
+ */
114
+ function splitContentAndCode(raw) {
115
+ const codeBlocks = [];
116
+ const lines = raw.split('\n');
117
+ const proseLines = [];
118
+ let inCode = false;
119
+ let currentBlock = [];
120
+ for (const line of lines) {
121
+ if (!inCode && line.startsWith('```')) {
122
+ inCode = true;
123
+ currentBlock = [line];
124
+ continue;
125
+ }
126
+ if (inCode) {
127
+ if (/^```\s*$/.test(line)) {
128
+ currentBlock.push(line);
129
+ codeBlocks.push(currentBlock.join('\n'));
130
+ currentBlock = [];
131
+ inCode = false;
132
+ }
133
+ else {
134
+ currentBlock.push(line);
135
+ }
136
+ continue;
137
+ }
138
+ proseLines.push(line);
139
+ }
140
+ // Unclosed code block — treat as a code block anyway
141
+ if (inCode && currentBlock.length > 0) {
142
+ codeBlocks.push(currentBlock.join('\n'));
143
+ }
144
+ return { content: proseLines.join('\n').trim(), codeBlocks };
145
+ }
146
+ /**
147
+ * Extract all `##`+ level sections from a markdown body.
148
+ * Each section spans from its heading to the next heading of the same or
149
+ * higher level (lower number = higher level).
150
+ */
151
+ function extractSections(body) {
152
+ const lines = body.split('\n');
153
+ const sections = [];
154
+ const headings = [];
155
+ for (let i = 0; i < lines.length; i++) {
156
+ const lvl = headingLevel(lines[i] ?? '');
157
+ if (lvl >= 2) {
158
+ headings.push({ idx: i, level: lvl, text: headingText(lines[i] ?? '') });
159
+ }
160
+ }
161
+ for (let h = 0; h < headings.length; h++) {
162
+ const current = headings[h];
163
+ // Find the next heading that is at the same or higher level
164
+ let endIdx = lines.length;
165
+ for (let k = h + 1; k < headings.length; k++) {
166
+ if (headings[k].level <= current.level) {
167
+ endIdx = headings[k].idx;
168
+ break;
169
+ }
170
+ }
171
+ const rawContent = lines.slice(current.idx + 1, endIdx).join('\n');
172
+ const { content, codeBlocks } = splitContentAndCode(rawContent);
173
+ sections.push({ heading: current.text, level: current.level, content, codeBlocks });
174
+ }
175
+ return sections;
176
+ }
177
+ // ─── Sort order ───────────────────────────────────────────────────────────────
178
+ /** Derive sort order from filename numeric prefix, e.g. "03-setup.md" → 3. */
179
+ function orderFromFilename(filePath) {
180
+ const basename = filePath.split('/').pop() ?? filePath;
181
+ const m = basename.match(/^(\d+)-/);
182
+ return m ? Number(m[1]) : Infinity;
183
+ }
184
+ // ─── Public API ───────────────────────────────────────────────────────────────
185
+ /**
186
+ * Parse a markdown document string into a structured `ParsedMarkdownDoc`.
187
+ *
188
+ * @param markdown - Raw markdown source text.
189
+ * @param filePath - File path used for `relativePath`, title fallback, and order fallback.
190
+ *
191
+ * @category Parsing
192
+ */
193
+ export function parseMarkdownDoc(markdown, filePath) {
194
+ const { frontmatter, body } = extractFrontmatter(markdown);
195
+ // Title: frontmatter.title > first # heading > filename
196
+ const fmTitle = frontmatter?.['title'] !== undefined && frontmatter['title'] !== ''
197
+ ? String(frontmatter['title'])
198
+ : undefined;
199
+ const title = fmTitle ?? extractFirstH1(body) ?? filenameToTitle(filePath);
200
+ // Description: frontmatter.description > first paragraph after first heading
201
+ const fmDescription = frontmatter?.['description'] !== undefined && frontmatter['description'] !== ''
202
+ ? String(frontmatter['description'])
203
+ : undefined;
204
+ const description = fmDescription ?? extractFirstParagraph(body);
205
+ // Sections
206
+ const sections = extractSections(body);
207
+ // Order: frontmatter.sidebar_position > filename prefix > Infinity
208
+ const fmOrder = frontmatter?.['sidebar_position'] !== undefined
209
+ ? Number(frontmatter['sidebar_position'])
210
+ : undefined;
211
+ const order = fmOrder !== undefined && !Number.isNaN(fmOrder) ? fmOrder : orderFromFilename(filePath);
212
+ return {
213
+ frontmatter,
214
+ title,
215
+ description,
216
+ relativePath: filePath,
217
+ sections,
218
+ rawContent: body,
219
+ order
220
+ };
221
+ }
222
+ //# sourceMappingURL=markdown-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-parser.js","sourceRoot":"","sources":["../src/markdown-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * A single section extracted from a markdown document, corresponding to one
3
+ * heading and all content that follows it until the next heading.
4
+ */
5
+ export interface ParsedSection {
6
+ /** The text content of the section heading, without the `#` prefix characters */
7
+ heading: string;
8
+ /** The heading depth: 1 for `#`, 2 for `##`, 3 for `###`, etc. */
9
+ level: number;
10
+ /** All prose content within the section, excluding code blocks */
11
+ content: string;
12
+ /** Source text of every fenced code block found within the section */
13
+ codeBlocks: string[];
14
+ }
15
+ /**
16
+ * A fully parsed markdown document with structured metadata and sections.
17
+ */
18
+ export interface ParsedMarkdownDoc {
19
+ /** Parsed YAML/TOML front-matter key-value pairs, or `undefined` if the document has none */
20
+ frontmatter: Record<string, unknown> | undefined;
21
+ /** Document title, typically derived from the first `#`-level heading or front-matter */
22
+ title: string;
23
+ /** Short description of the document, or `undefined` if none could be determined */
24
+ description: string | undefined;
25
+ /** File path to the document relative to the docs root directory */
26
+ relativePath: string;
27
+ /** Ordered list of sections extracted from the document body */
28
+ sections: ParsedSection[];
29
+ /** Original unmodified markdown source text of the document */
30
+ rawContent: string;
31
+ /** Zero-based sort order used to sequence this document within a collection */
32
+ order: number;
33
+ }
34
+ /**
35
+ * Configuration options that control how a docs directory is scanned and which
36
+ * markdown files are included in the extraction.
37
+ */
38
+ export interface DocsExtractionOptions {
39
+ /** Absolute or relative path to the directory containing markdown documentation files */
40
+ docsDir: string;
41
+ /** Glob pattern selecting files to include; when `undefined` all `.md` files are included */
42
+ include: string | undefined;
43
+ /** Glob patterns for files to exclude from extraction; `undefined` means no exclusions */
44
+ exclude: string[] | undefined;
45
+ /** Maximum number of documents to return; `undefined` means no limit */
46
+ maxDocs: number | undefined;
47
+ }
48
+ //# sourceMappingURL=markdown-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-types.d.ts","sourceRoot":"","sources":["../src/markdown-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,6FAA6F;IAC7F,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACjD,yFAAyF;IACzF,KAAK,EAAE,MAAM,CAAC;IACd,oFAAoF;IACpF,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,oEAAoE;IACpE,YAAY,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,yFAAyF;IACzF,OAAO,EAAE,MAAM,CAAC;IAChB,6FAA6F;IAC7F,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,0FAA0F;IAC1F,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC9B,wEAAwE;IACxE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=markdown-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-types.js","sourceRoot":"","sources":["../src/markdown-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import type { ParsedReadme } from './audit-types.js';
2
+ /**
3
+ * Parse a README markdown string and extract structured sections.
4
+ *
5
+ * Extraction rules:
6
+ * - **blockquote** – first `> …` line between `# title` and the first `## heading`.
7
+ * - **firstParagraph** – first prose lines before the first `## heading` that are
8
+ * not a heading, badge (`[![`), image (`![`), blockquote, or blank.
9
+ * Consecutive lines are joined with a single space.
10
+ * - **quickStart** – content under `## Quick Start`, `## Usage`, or `## Getting Started`.
11
+ * - **features** – content under `## Features`, `## Key Features`, or `## Highlights`.
12
+ * - **troubleshooting** – content under `## Troubleshooting`, `## Common Issues`, `## Common Errors`,
13
+ * or `## FAQ`.
14
+ *
15
+ * @category Parsing
16
+ * @useWhen
17
+ * - You need structured README sections for audit context or skill enrichment
18
+ * - The audit engine calls this to check for Features and Troubleshooting sections
19
+ */
20
+ export declare function parseReadme(markdown: string): ParsedReadme;
21
+ //# sourceMappingURL=readme-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readme-parser.d.ts","sourceRoot":"","sources":["../src/readme-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA4CrD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAuF1D"}