kirograph 0.14.1 → 0.16.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 (125) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +239 -20
  3. package/dist/assets/logo.png +0 -0
  4. package/dist/bin/commands/docs.js +357 -0
  5. package/dist/bin/commands/docs.js.map +7 -0
  6. package/dist/bin/commands/help.js +3 -0
  7. package/dist/bin/commands/help.js.map +2 -2
  8. package/dist/bin/commands/uninit.js +10 -13
  9. package/dist/bin/commands/uninit.js.map +2 -2
  10. package/dist/bin/installer/config-prompt.js +53 -23
  11. package/dist/bin/installer/config-prompt.js.map +2 -2
  12. package/dist/bin/installer/hooks.js +20 -1
  13. package/dist/bin/installer/hooks.js.map +2 -2
  14. package/dist/bin/installer/index.js +14 -4
  15. package/dist/bin/installer/index.js.map +2 -2
  16. package/dist/bin/installer/prompts.js +37 -6
  17. package/dist/bin/installer/prompts.js.map +2 -2
  18. package/dist/bin/installer/steering.js +40 -0
  19. package/dist/bin/installer/steering.js.map +2 -2
  20. package/dist/bin/installer/targets/aider.js +72 -0
  21. package/dist/bin/installer/targets/aider.js.map +7 -0
  22. package/dist/bin/installer/targets/amp.js +91 -0
  23. package/dist/bin/installer/targets/amp.js.map +7 -0
  24. package/dist/bin/installer/targets/antigravity.js +109 -0
  25. package/dist/bin/installer/targets/antigravity.js.map +7 -0
  26. package/dist/bin/installer/targets/augment.js +81 -0
  27. package/dist/bin/installer/targets/augment.js.map +7 -0
  28. package/dist/bin/installer/targets/claude.js +1 -1
  29. package/dist/bin/installer/targets/claude.js.map +2 -2
  30. package/dist/bin/installer/targets/cline.js +91 -0
  31. package/dist/bin/installer/targets/cline.js.map +7 -0
  32. package/dist/bin/installer/targets/codex.js +1 -1
  33. package/dist/bin/installer/targets/codex.js.map +2 -2
  34. package/dist/bin/installer/targets/continue.js +107 -0
  35. package/dist/bin/installer/targets/continue.js.map +7 -0
  36. package/dist/bin/installer/targets/copilot.js +123 -0
  37. package/dist/bin/installer/targets/copilot.js.map +7 -0
  38. package/dist/bin/installer/targets/cursor.js +143 -0
  39. package/dist/bin/installer/targets/cursor.js.map +7 -0
  40. package/dist/bin/installer/targets/devin.js +148 -0
  41. package/dist/bin/installer/targets/devin.js.map +7 -0
  42. package/dist/bin/installer/targets/gemini-cli.js +126 -0
  43. package/dist/bin/installer/targets/gemini-cli.js.map +7 -0
  44. package/dist/bin/installer/targets/generic.js +120 -0
  45. package/dist/bin/installer/targets/generic.js.map +7 -0
  46. package/dist/bin/installer/targets/goose.js +72 -0
  47. package/dist/bin/installer/targets/goose.js.map +7 -0
  48. package/dist/bin/installer/targets/index.js.map +1 -1
  49. package/dist/bin/installer/targets/junie.js +105 -0
  50. package/dist/bin/installer/targets/junie.js.map +7 -0
  51. package/dist/bin/installer/targets/kilo.js +122 -0
  52. package/dist/bin/installer/targets/kilo.js.map +7 -0
  53. package/dist/bin/installer/targets/kiro.js +3 -3
  54. package/dist/bin/installer/targets/kiro.js.map +2 -2
  55. package/dist/bin/installer/targets/opencode.js +135 -0
  56. package/dist/bin/installer/targets/opencode.js.map +7 -0
  57. package/dist/bin/installer/targets/openhands.js +90 -0
  58. package/dist/bin/installer/targets/openhands.js.map +7 -0
  59. package/dist/bin/installer/targets/replit.js +72 -0
  60. package/dist/bin/installer/targets/replit.js.map +7 -0
  61. package/dist/bin/installer/targets/roo.js +96 -0
  62. package/dist/bin/installer/targets/roo.js.map +7 -0
  63. package/dist/bin/installer/targets/tabnine.js +82 -0
  64. package/dist/bin/installer/targets/tabnine.js.map +7 -0
  65. package/dist/bin/installer/targets/trae.js +84 -0
  66. package/dist/bin/installer/targets/trae.js.map +7 -0
  67. package/dist/bin/installer/targets/warp.js +97 -0
  68. package/dist/bin/installer/targets/warp.js.map +7 -0
  69. package/dist/bin/installer/targets/windsurf.js +141 -0
  70. package/dist/bin/installer/targets/windsurf.js.map +7 -0
  71. package/dist/bin/kirograph.js +5 -1
  72. package/dist/bin/kirograph.js.map +3 -3
  73. package/dist/compression/naive-cost.js +33 -0
  74. package/dist/compression/naive-cost.js.map +2 -2
  75. package/dist/compression/tracker.js +27 -4
  76. package/dist/compression/tracker.js.map +2 -2
  77. package/dist/compression/types.js.map +1 -1
  78. package/dist/config.js +66 -1
  79. package/dist/config.js.map +2 -2
  80. package/dist/core/pipeline.js +23 -0
  81. package/dist/core/pipeline.js.map +2 -2
  82. package/dist/db/database.js +28 -0
  83. package/dist/db/database.js.map +2 -2
  84. package/dist/db/docs-schema.sql +50 -0
  85. package/dist/docs/formats/asciidoc.js +108 -0
  86. package/dist/docs/formats/asciidoc.js.map +7 -0
  87. package/dist/docs/formats/html.js +100 -0
  88. package/dist/docs/formats/html.js.map +7 -0
  89. package/dist/docs/formats/index.js +81 -0
  90. package/dist/docs/formats/index.js.map +7 -0
  91. package/dist/docs/formats/markdown.js +146 -0
  92. package/dist/docs/formats/markdown.js.map +7 -0
  93. package/dist/docs/formats/openapi.js +228 -0
  94. package/dist/docs/formats/openapi.js.map +7 -0
  95. package/dist/docs/formats/org.js +117 -0
  96. package/dist/docs/formats/org.js.map +7 -0
  97. package/dist/docs/formats/plaintext.js +119 -0
  98. package/dist/docs/formats/plaintext.js.map +7 -0
  99. package/dist/docs/formats/rdoc.js +105 -0
  100. package/dist/docs/formats/rdoc.js.map +7 -0
  101. package/dist/docs/formats/rst.js +121 -0
  102. package/dist/docs/formats/rst.js.map +7 -0
  103. package/dist/docs/indexer.js +340 -0
  104. package/dist/docs/indexer.js.map +7 -0
  105. package/dist/docs/linker.js +151 -0
  106. package/dist/docs/linker.js.map +7 -0
  107. package/dist/docs/lint.js +92 -0
  108. package/dist/docs/lint.js.map +7 -0
  109. package/dist/docs/queries.js +295 -0
  110. package/dist/docs/queries.js.map +7 -0
  111. package/dist/docs/section-id.js +57 -0
  112. package/dist/docs/section-id.js.map +7 -0
  113. package/dist/docs/summarizer.js +55 -0
  114. package/dist/docs/summarizer.js.map +7 -0
  115. package/dist/docs/types.js +17 -0
  116. package/dist/docs/types.js.map +7 -0
  117. package/dist/docs/vectors.js +217 -0
  118. package/dist/docs/vectors.js.map +7 -0
  119. package/dist/index.js +3 -0
  120. package/dist/index.js.map +2 -2
  121. package/dist/mcp/tool-names.js +10 -1
  122. package/dist/mcp/tool-names.js.map +2 -2
  123. package/dist/mcp/tools.js +476 -3
  124. package/dist/mcp/tools.js.map +2 -2
  125. package/package.json +1 -1
@@ -0,0 +1,228 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var openapi_exports = {};
20
+ __export(openapi_exports, {
21
+ isOpenAPI: () => isOpenAPI,
22
+ openapiParser: () => openapiParser
23
+ });
24
+ module.exports = __toCommonJS(openapi_exports);
25
+ function isOpenAPIContent(content, filePath) {
26
+ const ext = filePath.slice(filePath.lastIndexOf(".")).toLowerCase();
27
+ if (ext === ".json") {
28
+ try {
29
+ const parsed = JSON.parse(content);
30
+ return "openapi" in parsed || "swagger" in parsed;
31
+ } catch {
32
+ return false;
33
+ }
34
+ }
35
+ return /^(openapi|swagger)\s*:/m.test(content);
36
+ }
37
+ function parseYAMLOperations(content) {
38
+ const operations = [];
39
+ const lines = content.split("\n");
40
+ let inPaths = false;
41
+ let currentPath = "";
42
+ let currentMethod = "";
43
+ let currentTags = [];
44
+ let currentSummary = "";
45
+ let currentDescription = "";
46
+ let opStart = 0;
47
+ let byteOffset = 0;
48
+ for (let i = 0; i < lines.length; i++) {
49
+ const line = lines[i];
50
+ const lineBytes = Buffer.byteLength(line, "utf8") + 1;
51
+ if (/^paths\s*:/.test(line)) {
52
+ inPaths = true;
53
+ byteOffset += lineBytes;
54
+ continue;
55
+ }
56
+ if (inPaths && /^\S/.test(line) && !/^paths/.test(line)) {
57
+ if (currentPath && currentMethod) {
58
+ operations.push({
59
+ method: currentMethod.toUpperCase(),
60
+ path: currentPath,
61
+ summary: currentSummary,
62
+ description: currentDescription,
63
+ tags: currentTags.length > 0 ? currentTags : ["default"],
64
+ byteStart: opStart,
65
+ byteEnd: byteOffset
66
+ });
67
+ }
68
+ inPaths = false;
69
+ byteOffset += lineBytes;
70
+ continue;
71
+ }
72
+ if (inPaths) {
73
+ const pathMatch = line.match(/^\s{2}(['"]?)(\/[^'":\s]*)\1\s*:/);
74
+ if (pathMatch) {
75
+ if (currentPath && currentMethod) {
76
+ operations.push({
77
+ method: currentMethod.toUpperCase(),
78
+ path: currentPath,
79
+ summary: currentSummary,
80
+ description: currentDescription,
81
+ tags: currentTags.length > 0 ? currentTags : ["default"],
82
+ byteStart: opStart,
83
+ byteEnd: byteOffset
84
+ });
85
+ currentMethod = "";
86
+ currentSummary = "";
87
+ currentDescription = "";
88
+ currentTags = [];
89
+ }
90
+ currentPath = pathMatch[2];
91
+ }
92
+ const methodMatch = line.match(/^\s{4}(get|post|put|delete|patch|head|options)\s*:/);
93
+ if (methodMatch) {
94
+ if (currentMethod) {
95
+ operations.push({
96
+ method: currentMethod.toUpperCase(),
97
+ path: currentPath,
98
+ summary: currentSummary,
99
+ description: currentDescription,
100
+ tags: currentTags.length > 0 ? currentTags : ["default"],
101
+ byteStart: opStart,
102
+ byteEnd: byteOffset
103
+ });
104
+ }
105
+ currentMethod = methodMatch[1];
106
+ currentSummary = "";
107
+ currentDescription = "";
108
+ currentTags = [];
109
+ opStart = byteOffset;
110
+ }
111
+ const summaryMatch = line.match(/^\s{6}summary\s*:\s*['"]?(.+?)['"]?\s*$/);
112
+ if (summaryMatch) currentSummary = summaryMatch[1];
113
+ const descMatch = line.match(/^\s{6}description\s*:\s*['"]?(.+?)['"]?\s*$/);
114
+ if (descMatch) currentDescription = descMatch[1];
115
+ const tagMatch = line.match(/^\s{8}-\s*['"]?(.+?)['"]?\s*$/);
116
+ if (tagMatch && i > 0 && /^\s{6}tags\s*:/.test(lines[i - 1] || "")) {
117
+ currentTags.push(tagMatch[1]);
118
+ }
119
+ if (/^\s{6}tags\s*:/.test(line)) {
120
+ for (let j = i + 1; j < lines.length && /^\s{8}-/.test(lines[j]); j++) {
121
+ const t = lines[j].match(/^\s{8}-\s*['"]?(.+?)['"]?\s*$/);
122
+ if (t) currentTags.push(t[1]);
123
+ }
124
+ }
125
+ }
126
+ byteOffset += lineBytes;
127
+ }
128
+ if (currentPath && currentMethod) {
129
+ operations.push({
130
+ method: currentMethod.toUpperCase(),
131
+ path: currentPath,
132
+ summary: currentSummary,
133
+ description: currentDescription,
134
+ tags: currentTags.length > 0 ? currentTags : ["default"],
135
+ byteStart: opStart,
136
+ byteEnd: byteOffset
137
+ });
138
+ }
139
+ return operations;
140
+ }
141
+ function parseJSONOperations(content) {
142
+ const operations = [];
143
+ try {
144
+ const spec = JSON.parse(content);
145
+ const paths = spec.paths || {};
146
+ const contentBytes = Buffer.byteLength(content, "utf8");
147
+ const methods = ["get", "post", "put", "delete", "patch", "head", "options"];
148
+ for (const [pathStr, pathItem] of Object.entries(paths)) {
149
+ if (!pathItem || typeof pathItem !== "object") continue;
150
+ for (const method of methods) {
151
+ const op = pathItem[method];
152
+ if (!op) continue;
153
+ operations.push({
154
+ method: method.toUpperCase(),
155
+ path: pathStr,
156
+ summary: op.summary || "",
157
+ description: op.description || "",
158
+ tags: Array.isArray(op.tags) ? op.tags : ["default"],
159
+ byteStart: 0,
160
+ byteEnd: contentBytes
161
+ });
162
+ }
163
+ }
164
+ } catch {
165
+ }
166
+ return operations;
167
+ }
168
+ function buildSections(operations, content) {
169
+ const contentBytes = Buffer.byteLength(content, "utf8");
170
+ if (operations.length === 0) {
171
+ return [{
172
+ title: "(API spec)",
173
+ level: 0,
174
+ byteStart: 0,
175
+ byteEnd: contentBytes,
176
+ content,
177
+ children: []
178
+ }];
179
+ }
180
+ const byTag = /* @__PURE__ */ new Map();
181
+ for (const op of operations) {
182
+ for (const tag of op.tags) {
183
+ if (!byTag.has(tag)) byTag.set(tag, []);
184
+ byTag.get(tag).push(op);
185
+ }
186
+ }
187
+ const root = [];
188
+ for (const [tag, ops] of byTag) {
189
+ const children = ops.map((op) => ({
190
+ title: `${op.method} ${op.path}`,
191
+ level: 2,
192
+ byteStart: op.byteStart,
193
+ byteEnd: op.byteEnd,
194
+ content: [op.summary, op.description].filter(Boolean).join("\n") || `${op.method} ${op.path}`,
195
+ children: []
196
+ }));
197
+ root.push({
198
+ title: tag,
199
+ level: 1,
200
+ byteStart: ops[0]?.byteStart ?? 0,
201
+ byteEnd: ops[ops.length - 1]?.byteEnd ?? contentBytes,
202
+ content: `Tag: ${tag}
203
+ ${ops.map((o) => `${o.method} ${o.path}`).join("\n")}`,
204
+ children
205
+ });
206
+ }
207
+ return root;
208
+ }
209
+ const openapiParser = {
210
+ name: "openapi",
211
+ extensions: [],
212
+ // Not registered by extension — detected by content
213
+ parse(content, filePath) {
214
+ const ext = filePath.slice(filePath.lastIndexOf(".")).toLowerCase();
215
+ const operations = ext === ".json" ? parseJSONOperations(content) : parseYAMLOperations(content);
216
+ const sections = buildSections(operations, content);
217
+ return { sections, format: "openapi" };
218
+ }
219
+ };
220
+ function isOpenAPI(content, filePath) {
221
+ return isOpenAPIContent(content, filePath);
222
+ }
223
+ // Annotate the CommonJS export names for ESM import in node:
224
+ 0 && (module.exports = {
225
+ isOpenAPI,
226
+ openapiParser
227
+ });
228
+ //# sourceMappingURL=openapi.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/docs/formats/openapi.ts"],
4
+ "sourcesContent": ["/**\n * OpenAPI/Swagger Section Parser\n *\n * Handles: .yaml, .yml, .json (when detected as OpenAPI spec)\n * Parsing strategy: Operations grouped by tag.\n * Each tag becomes a level-1 section, each operation becomes a level-2 section.\n *\n * Detection: file must contain \"openapi:\" or \"swagger:\" (YAML) or\n * \"openapi\" / \"swagger\" keys at root level (JSON).\n */\n\nimport type { DocFormatParser, ParseResult, ParsedSection } from '../types';\n\ninterface OpenAPIOperation {\n method: string;\n path: string;\n summary?: string;\n description?: string;\n tags: string[];\n byteStart: number;\n byteEnd: number;\n}\n\nfunction isOpenAPIContent(content: string, filePath: string): boolean {\n const ext = filePath.slice(filePath.lastIndexOf('.')).toLowerCase();\n if (ext === '.json') {\n try {\n const parsed = JSON.parse(content);\n return 'openapi' in parsed || 'swagger' in parsed;\n } catch { return false; }\n }\n // YAML detection\n return /^(openapi|swagger)\\s*:/m.test(content);\n}\n\nfunction parseYAMLOperations(content: string): OpenAPIOperation[] {\n const operations: OpenAPIOperation[] = [];\n const lines = content.split('\\n');\n let inPaths = false;\n let currentPath = '';\n let currentMethod = '';\n let currentTags: string[] = [];\n let currentSummary = '';\n let currentDescription = '';\n let opStart = 0;\n let byteOffset = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineBytes = Buffer.byteLength(line, 'utf8') + 1;\n\n // Detect paths: section\n if (/^paths\\s*:/.test(line)) {\n inPaths = true;\n byteOffset += lineBytes;\n continue;\n }\n\n // Exit paths section on next top-level key\n if (inPaths && /^\\S/.test(line) && !/^paths/.test(line)) {\n // Flush last operation\n if (currentPath && currentMethod) {\n operations.push({\n method: currentMethod.toUpperCase(),\n path: currentPath,\n summary: currentSummary,\n description: currentDescription,\n tags: currentTags.length > 0 ? currentTags : ['default'],\n byteStart: opStart,\n byteEnd: byteOffset,\n });\n }\n inPaths = false;\n byteOffset += lineBytes;\n continue;\n }\n\n if (inPaths) {\n // Path pattern: \" /users:\" or \" '/users/{id}':\"\n const pathMatch = line.match(/^\\s{2}(['\"]?)(\\/[^'\":\\s]*)\\1\\s*:/);\n if (pathMatch) {\n // Flush previous operation\n if (currentPath && currentMethod) {\n operations.push({\n method: currentMethod.toUpperCase(),\n path: currentPath,\n summary: currentSummary,\n description: currentDescription,\n tags: currentTags.length > 0 ? currentTags : ['default'],\n byteStart: opStart,\n byteEnd: byteOffset,\n });\n currentMethod = '';\n currentSummary = '';\n currentDescription = '';\n currentTags = [];\n }\n currentPath = pathMatch[2];\n }\n\n // Method pattern: \" get:\", \" post:\", etc.\n const methodMatch = line.match(/^\\s{4}(get|post|put|delete|patch|head|options)\\s*:/);\n if (methodMatch) {\n // Flush previous operation if same path different method\n if (currentMethod) {\n operations.push({\n method: currentMethod.toUpperCase(),\n path: currentPath,\n summary: currentSummary,\n description: currentDescription,\n tags: currentTags.length > 0 ? currentTags : ['default'],\n byteStart: opStart,\n byteEnd: byteOffset,\n });\n }\n currentMethod = methodMatch[1];\n currentSummary = '';\n currentDescription = '';\n currentTags = [];\n opStart = byteOffset;\n }\n\n // Summary\n const summaryMatch = line.match(/^\\s{6}summary\\s*:\\s*['\"]?(.+?)['\"]?\\s*$/);\n if (summaryMatch) currentSummary = summaryMatch[1];\n\n // Description\n const descMatch = line.match(/^\\s{6}description\\s*:\\s*['\"]?(.+?)['\"]?\\s*$/);\n if (descMatch) currentDescription = descMatch[1];\n\n // Tags\n const tagMatch = line.match(/^\\s{8}-\\s*['\"]?(.+?)['\"]?\\s*$/);\n if (tagMatch && i > 0 && /^\\s{6}tags\\s*:/.test(lines[i - 1] || '')) {\n currentTags.push(tagMatch[1]);\n }\n // Also handle inline tag after \"tags:\" line\n if (/^\\s{6}tags\\s*:/.test(line)) {\n // Look ahead for tag items\n for (let j = i + 1; j < lines.length && /^\\s{8}-/.test(lines[j]); j++) {\n const t = lines[j].match(/^\\s{8}-\\s*['\"]?(.+?)['\"]?\\s*$/);\n if (t) currentTags.push(t[1]);\n }\n }\n }\n\n byteOffset += lineBytes;\n }\n\n // Flush last operation\n if (currentPath && currentMethod) {\n operations.push({\n method: currentMethod.toUpperCase(),\n path: currentPath,\n summary: currentSummary,\n description: currentDescription,\n tags: currentTags.length > 0 ? currentTags : ['default'],\n byteStart: opStart,\n byteEnd: byteOffset,\n });\n }\n\n return operations;\n}\n\nfunction parseJSONOperations(content: string): OpenAPIOperation[] {\n const operations: OpenAPIOperation[] = [];\n try {\n const spec = JSON.parse(content);\n const paths = spec.paths || {};\n const contentBytes = Buffer.byteLength(content, 'utf8');\n const methods = ['get', 'post', 'put', 'delete', 'patch', 'head', 'options'];\n\n for (const [pathStr, pathItem] of Object.entries(paths)) {\n if (!pathItem || typeof pathItem !== 'object') continue;\n for (const method of methods) {\n const op = (pathItem as any)[method];\n if (!op) continue;\n operations.push({\n method: method.toUpperCase(),\n path: pathStr,\n summary: op.summary || '',\n description: op.description || '',\n tags: Array.isArray(op.tags) ? op.tags : ['default'],\n byteStart: 0,\n byteEnd: contentBytes,\n });\n }\n }\n } catch { /* invalid JSON */ }\n return operations;\n}\n\nfunction buildSections(operations: OpenAPIOperation[], content: string): ParsedSection[] {\n const contentBytes = Buffer.byteLength(content, 'utf8');\n\n if (operations.length === 0) {\n return [{\n title: '(API spec)',\n level: 0,\n byteStart: 0,\n byteEnd: contentBytes,\n content,\n children: [],\n }];\n }\n\n // Group by tag\n const byTag = new Map<string, OpenAPIOperation[]>();\n for (const op of operations) {\n for (const tag of op.tags) {\n if (!byTag.has(tag)) byTag.set(tag, []);\n byTag.get(tag)!.push(op);\n }\n }\n\n const root: ParsedSection[] = [];\n for (const [tag, ops] of byTag) {\n const children: ParsedSection[] = ops.map(op => ({\n title: `${op.method} ${op.path}`,\n level: 2,\n byteStart: op.byteStart,\n byteEnd: op.byteEnd,\n content: [op.summary, op.description].filter(Boolean).join('\\n') || `${op.method} ${op.path}`,\n children: [],\n }));\n\n root.push({\n title: tag,\n level: 1,\n byteStart: ops[0]?.byteStart ?? 0,\n byteEnd: ops[ops.length - 1]?.byteEnd ?? contentBytes,\n content: `Tag: ${tag}\\n${ops.map(o => `${o.method} ${o.path}`).join('\\n')}`,\n children,\n });\n }\n\n return root;\n}\n\nexport const openapiParser: DocFormatParser = {\n name: 'openapi',\n extensions: [], // Not registered by extension \u2014 detected by content\n\n parse(content: string, filePath: string): ParseResult {\n const ext = filePath.slice(filePath.lastIndexOf('.')).toLowerCase();\n const operations = ext === '.json'\n ? parseJSONOperations(content)\n : parseYAMLOperations(content);\n\n const sections = buildSections(operations, content);\n return { sections, format: 'openapi' };\n },\n};\n\n/**\n * Check if a file is an OpenAPI spec (used by the format registry for content-based detection).\n */\nexport function isOpenAPI(content: string, filePath: string): boolean {\n return isOpenAPIContent(content, filePath);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var org_exports = {};
20
+ __export(org_exports, {
21
+ orgParser: () => orgParser
22
+ });
23
+ module.exports = __toCommonJS(org_exports);
24
+ const HEADING_RE = /^(\*{1,6})\s+(.+)$/;
25
+ function extractHeadings(content) {
26
+ const lines = content.split("\n");
27
+ const headings = [];
28
+ let byteOffset = 0;
29
+ let inBlock = false;
30
+ for (let i = 0; i < lines.length; i++) {
31
+ const line = lines[i];
32
+ const lineBytes = Buffer.byteLength(line, "utf8") + 1;
33
+ if (/^#\+BEGIN_/i.test(line)) {
34
+ inBlock = true;
35
+ byteOffset += lineBytes;
36
+ continue;
37
+ }
38
+ if (/^#\+END_/i.test(line)) {
39
+ inBlock = false;
40
+ byteOffset += lineBytes;
41
+ continue;
42
+ }
43
+ if (!inBlock) {
44
+ const match = line.match(HEADING_RE);
45
+ if (match) {
46
+ let title = match[2].trim();
47
+ title = title.replace(/^(TODO|DONE|NEXT|WAITING|CANCELLED)\s+/, "");
48
+ title = title.replace(/^\[#[A-Z]\]\s+/, "");
49
+ title = title.replace(/\s+:[^\s:]+(?::[^\s:]+)*:\s*$/, "");
50
+ headings.push({
51
+ title,
52
+ level: match[1].length,
53
+ lineIndex: i,
54
+ byteOffset
55
+ });
56
+ }
57
+ }
58
+ byteOffset += lineBytes;
59
+ }
60
+ return headings;
61
+ }
62
+ function buildHierarchy(headings, content) {
63
+ const contentBytes = Buffer.byteLength(content, "utf8");
64
+ if (headings.length === 0) {
65
+ return [{
66
+ title: "(document)",
67
+ level: 0,
68
+ byteStart: 0,
69
+ byteEnd: contentBytes,
70
+ content,
71
+ children: []
72
+ }];
73
+ }
74
+ const sections = [];
75
+ for (let i = 0; i < headings.length; i++) {
76
+ const start = headings[i].byteOffset;
77
+ const end = i + 1 < headings.length ? headings[i + 1].byteOffset : contentBytes;
78
+ const sectionContent = Buffer.from(content, "utf8").slice(start, end).toString("utf8");
79
+ sections.push({ ...headings[i], byteEnd: end, content: sectionContent });
80
+ }
81
+ const root = [];
82
+ const stack = [];
83
+ for (const s of sections) {
84
+ const parsed = {
85
+ title: s.title,
86
+ level: s.level,
87
+ byteStart: s.byteOffset,
88
+ byteEnd: s.byteEnd,
89
+ content: s.content,
90
+ children: []
91
+ };
92
+ while (stack.length > 0 && stack[stack.length - 1].level >= s.level) {
93
+ stack.pop();
94
+ }
95
+ if (stack.length === 0) {
96
+ root.push(parsed);
97
+ } else {
98
+ stack[stack.length - 1].section.children.push(parsed);
99
+ }
100
+ stack.push({ section: parsed, level: s.level });
101
+ }
102
+ return root;
103
+ }
104
+ const orgParser = {
105
+ name: "org",
106
+ extensions: [".org"],
107
+ parse(content, _filePath) {
108
+ const headings = extractHeadings(content);
109
+ const sections = buildHierarchy(headings, content);
110
+ return { sections, format: "org" };
111
+ }
112
+ };
113
+ // Annotate the CommonJS export names for ESM import in node:
114
+ 0 && (module.exports = {
115
+ orgParser
116
+ });
117
+ //# sourceMappingURL=org.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/docs/formats/org.ts"],
4
+ "sourcesContent": ["/**\n * Org-mode Section Parser\n *\n * Handles: .org\n * Parsing strategy: * heading hierarchy (* Title, ** Section, *** Subsection)\n */\n\nimport type { DocFormatParser, ParseResult, ParsedSection } from '../types';\n\nconst HEADING_RE = /^(\\*{1,6})\\s+(.+)$/;\n\ninterface RawHeading {\n title: string;\n level: number;\n lineIndex: number;\n byteOffset: number;\n}\n\nfunction extractHeadings(content: string): RawHeading[] {\n const lines = content.split('\\n');\n const headings: RawHeading[] = [];\n let byteOffset = 0;\n let inBlock = false;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineBytes = Buffer.byteLength(line, 'utf8') + 1;\n\n // Track source blocks (#+BEGIN_SRC ... #+END_SRC)\n if (/^#\\+BEGIN_/i.test(line)) { inBlock = true; byteOffset += lineBytes; continue; }\n if (/^#\\+END_/i.test(line)) { inBlock = false; byteOffset += lineBytes; continue; }\n\n if (!inBlock) {\n const match = line.match(HEADING_RE);\n if (match) {\n // Strip TODO keywords and priority cookies from title\n let title = match[2].trim();\n title = title.replace(/^(TODO|DONE|NEXT|WAITING|CANCELLED)\\s+/, '');\n title = title.replace(/^\\[#[A-Z]\\]\\s+/, '');\n // Strip tags at end (:tag1:tag2:)\n title = title.replace(/\\s+:[^\\s:]+(?::[^\\s:]+)*:\\s*$/, '');\n\n headings.push({\n title,\n level: match[1].length,\n lineIndex: i,\n byteOffset,\n });\n }\n }\n\n byteOffset += lineBytes;\n }\n\n return headings;\n}\n\nfunction buildHierarchy(headings: RawHeading[], content: string): ParsedSection[] {\n const contentBytes = Buffer.byteLength(content, 'utf8');\n\n if (headings.length === 0) {\n return [{\n title: '(document)',\n level: 0,\n byteStart: 0,\n byteEnd: contentBytes,\n content,\n children: [],\n }];\n }\n\n const sections: Array<RawHeading & { byteEnd: number; content: string }> = [];\n for (let i = 0; i < headings.length; i++) {\n const start = headings[i].byteOffset;\n const end = i + 1 < headings.length ? headings[i + 1].byteOffset : contentBytes;\n const sectionContent = Buffer.from(content, 'utf8').slice(start, end).toString('utf8');\n sections.push({ ...headings[i], byteEnd: end, content: sectionContent });\n }\n\n const root: ParsedSection[] = [];\n const stack: Array<{ section: ParsedSection; level: number }> = [];\n\n for (const s of sections) {\n const parsed: ParsedSection = {\n title: s.title,\n level: s.level,\n byteStart: s.byteOffset,\n byteEnd: s.byteEnd,\n content: s.content,\n children: [],\n };\n\n while (stack.length > 0 && stack[stack.length - 1].level >= s.level) {\n stack.pop();\n }\n\n if (stack.length === 0) {\n root.push(parsed);\n } else {\n stack[stack.length - 1].section.children.push(parsed);\n }\n\n stack.push({ section: parsed, level: s.level });\n }\n\n return root;\n}\n\nexport const orgParser: DocFormatParser = {\n name: 'org',\n extensions: ['.org'],\n\n parse(content: string, _filePath: string): ParseResult {\n const headings = extractHeadings(content);\n const sections = buildHierarchy(headings, content);\n return { sections, format: 'org' };\n },\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAM,aAAa;AASnB,SAAS,gBAAgB,SAA+B;AACtD,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAM,WAAyB,CAAC;AAChC,MAAI,aAAa;AACjB,MAAI,UAAU;AAEd,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,YAAY,OAAO,WAAW,MAAM,MAAM,IAAI;AAGpD,QAAI,cAAc,KAAK,IAAI,GAAG;AAAE,gBAAU;AAAM,oBAAc;AAAW;AAAA,IAAU;AACnF,QAAI,YAAY,KAAK,IAAI,GAAG;AAAE,gBAAU;AAAO,oBAAc;AAAW;AAAA,IAAU;AAElF,QAAI,CAAC,SAAS;AACZ,YAAM,QAAQ,KAAK,MAAM,UAAU;AACnC,UAAI,OAAO;AAET,YAAI,QAAQ,MAAM,CAAC,EAAE,KAAK;AAC1B,gBAAQ,MAAM,QAAQ,0CAA0C,EAAE;AAClE,gBAAQ,MAAM,QAAQ,kBAAkB,EAAE;AAE1C,gBAAQ,MAAM,QAAQ,iCAAiC,EAAE;AAEzD,iBAAS,KAAK;AAAA,UACZ;AAAA,UACA,OAAO,MAAM,CAAC,EAAE;AAAA,UAChB,WAAW;AAAA,UACX;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,kBAAc;AAAA,EAChB;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,UAAwB,SAAkC;AAChF,QAAM,eAAe,OAAO,WAAW,SAAS,MAAM;AAEtD,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,CAAC;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW;AAAA,MACX,SAAS;AAAA,MACT;AAAA,MACA,UAAU,CAAC;AAAA,IACb,CAAC;AAAA,EACH;AAEA,QAAM,WAAqE,CAAC;AAC5E,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,QAAQ,SAAS,CAAC,EAAE;AAC1B,UAAM,MAAM,IAAI,IAAI,SAAS,SAAS,SAAS,IAAI,CAAC,EAAE,aAAa;AACnE,UAAM,iBAAiB,OAAO,KAAK,SAAS,MAAM,EAAE,MAAM,OAAO,GAAG,EAAE,SAAS,MAAM;AACrF,aAAS,KAAK,EAAE,GAAG,SAAS,CAAC,GAAG,SAAS,KAAK,SAAS,eAAe,CAAC;AAAA,EACzE;AAEA,QAAM,OAAwB,CAAC;AAC/B,QAAM,QAA0D,CAAC;AAEjE,aAAW,KAAK,UAAU;AACxB,UAAM,SAAwB;AAAA,MAC5B,OAAO,EAAE;AAAA,MACT,OAAO,EAAE;AAAA,MACT,WAAW,EAAE;AAAA,MACb,SAAS,EAAE;AAAA,MACX,SAAS,EAAE;AAAA,MACX,UAAU,CAAC;AAAA,IACb;AAEA,WAAO,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO;AACnE,YAAM,IAAI;AAAA,IACZ;AAEA,QAAI,MAAM,WAAW,GAAG;AACtB,WAAK,KAAK,MAAM;AAAA,IAClB,OAAO;AACL,YAAM,MAAM,SAAS,CAAC,EAAE,QAAQ,SAAS,KAAK,MAAM;AAAA,IACtD;AAEA,UAAM,KAAK,EAAE,SAAS,QAAQ,OAAO,EAAE,MAAM,CAAC;AAAA,EAChD;AAEA,SAAO;AACT;AAEO,MAAM,YAA6B;AAAA,EACxC,MAAM;AAAA,EACN,YAAY,CAAC,MAAM;AAAA,EAEnB,MAAM,SAAiB,WAAgC;AACrD,UAAM,WAAW,gBAAgB,OAAO;AACxC,UAAM,WAAW,eAAe,UAAU,OAAO;AACjD,WAAO,EAAE,UAAU,QAAQ,MAAM;AAAA,EACnC;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var plaintext_exports = {};
20
+ __export(plaintext_exports, {
21
+ plaintextParser: () => plaintextParser
22
+ });
23
+ module.exports = __toCommonJS(plaintext_exports);
24
+ function isAllCaps(line) {
25
+ const trimmed = line.trim();
26
+ if (trimmed.length < 3) return false;
27
+ return /[A-Z]/.test(trimmed) && trimmed === trimmed.toUpperCase() && /^[A-Z\s\d\-_:]+$/.test(trimmed);
28
+ }
29
+ function isDashUnderline(line) {
30
+ const trimmed = line.trim();
31
+ return trimmed.length >= 3 && /^[-=~]+$/.test(trimmed);
32
+ }
33
+ function extractHeadings(content) {
34
+ const lines = content.split("\n");
35
+ const headings = [];
36
+ let byteOffset = 0;
37
+ for (let i = 0; i < lines.length; i++) {
38
+ const line = lines[i];
39
+ const lineBytes = Buffer.byteLength(line, "utf8") + 1;
40
+ const trimmed = line.trim();
41
+ if (isAllCaps(trimmed) && (i === 0 || lines[i - 1].trim() === "")) {
42
+ headings.push({
43
+ title: trimmed,
44
+ level: 1,
45
+ byteOffset
46
+ });
47
+ byteOffset += lineBytes;
48
+ continue;
49
+ }
50
+ if (trimmed.length > 0 && i + 1 < lines.length && isDashUnderline(lines[i + 1])) {
51
+ const underlineChar = lines[i + 1].trim()[0];
52
+ headings.push({
53
+ title: trimmed,
54
+ level: underlineChar === "=" ? 1 : 2,
55
+ byteOffset
56
+ });
57
+ byteOffset += lineBytes;
58
+ continue;
59
+ }
60
+ byteOffset += lineBytes;
61
+ }
62
+ return headings;
63
+ }
64
+ function buildHierarchy(headings, content) {
65
+ const contentBytes = Buffer.byteLength(content, "utf8");
66
+ if (headings.length === 0) {
67
+ return [{
68
+ title: "(document)",
69
+ level: 0,
70
+ byteStart: 0,
71
+ byteEnd: contentBytes,
72
+ content,
73
+ children: []
74
+ }];
75
+ }
76
+ const sections = [];
77
+ for (let i = 0; i < headings.length; i++) {
78
+ const start = headings[i].byteOffset;
79
+ const end = i + 1 < headings.length ? headings[i + 1].byteOffset : contentBytes;
80
+ const sectionContent = Buffer.from(content, "utf8").slice(start, end).toString("utf8");
81
+ sections.push({ ...headings[i], byteEnd: end, content: sectionContent });
82
+ }
83
+ const root = [];
84
+ const stack = [];
85
+ for (const s of sections) {
86
+ const parsed = {
87
+ title: s.title,
88
+ level: s.level,
89
+ byteStart: s.byteOffset,
90
+ byteEnd: s.byteEnd,
91
+ content: s.content,
92
+ children: []
93
+ };
94
+ while (stack.length > 0 && stack[stack.length - 1].level >= s.level) {
95
+ stack.pop();
96
+ }
97
+ if (stack.length === 0) {
98
+ root.push(parsed);
99
+ } else {
100
+ stack[stack.length - 1].section.children.push(parsed);
101
+ }
102
+ stack.push({ section: parsed, level: s.level });
103
+ }
104
+ return root;
105
+ }
106
+ const plaintextParser = {
107
+ name: "plaintext",
108
+ extensions: [".txt"],
109
+ parse(content, _filePath) {
110
+ const headings = extractHeadings(content);
111
+ const sections = buildHierarchy(headings, content);
112
+ return { sections, format: "plaintext" };
113
+ }
114
+ };
115
+ // Annotate the CommonJS export names for ESM import in node:
116
+ 0 && (module.exports = {
117
+ plaintextParser
118
+ });
119
+ //# sourceMappingURL=plaintext.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/docs/formats/plaintext.ts"],
4
+ "sourcesContent": ["/**\n * Plain Text Section Parser\n *\n * Handles: .txt\n * Parsing strategy: Paragraph-block splitting.\n * Treats blank-line-separated blocks as sections.\n * Lines that are ALL CAPS or followed by a line of dashes are treated as headings.\n */\n\nimport type { DocFormatParser, ParseResult, ParsedSection } from '../types';\n\ninterface RawHeading {\n title: string;\n level: number;\n byteOffset: number;\n}\n\nfunction isAllCaps(line: string): boolean {\n const trimmed = line.trim();\n if (trimmed.length < 3) return false;\n // Must have at least some letters and be all uppercase\n return /[A-Z]/.test(trimmed) && trimmed === trimmed.toUpperCase() && /^[A-Z\\s\\d\\-_:]+$/.test(trimmed);\n}\n\nfunction isDashUnderline(line: string): boolean {\n const trimmed = line.trim();\n return trimmed.length >= 3 && /^[-=~]+$/.test(trimmed);\n}\n\nfunction extractHeadings(content: string): RawHeading[] {\n const lines = content.split('\\n');\n const headings: RawHeading[] = [];\n let byteOffset = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineBytes = Buffer.byteLength(line, 'utf8') + 1;\n const trimmed = line.trim();\n\n // Pattern 1: ALL CAPS line preceded by blank line (or first line)\n if (isAllCaps(trimmed) && (i === 0 || lines[i - 1].trim() === '')) {\n headings.push({\n title: trimmed,\n level: 1,\n byteOffset,\n });\n byteOffset += lineBytes;\n continue;\n }\n\n // Pattern 2: Line followed by dash/equals underline\n if (trimmed.length > 0 && i + 1 < lines.length && isDashUnderline(lines[i + 1])) {\n const underlineChar = lines[i + 1].trim()[0];\n headings.push({\n title: trimmed,\n level: underlineChar === '=' ? 1 : 2,\n byteOffset,\n });\n byteOffset += lineBytes;\n continue;\n }\n\n byteOffset += lineBytes;\n }\n\n return headings;\n}\n\nfunction buildHierarchy(headings: RawHeading[], content: string): ParsedSection[] {\n const contentBytes = Buffer.byteLength(content, 'utf8');\n\n if (headings.length === 0) {\n // No headings detected \u2014 treat as single section\n return [{\n title: '(document)',\n level: 0,\n byteStart: 0,\n byteEnd: contentBytes,\n content,\n children: [],\n }];\n }\n\n const sections: Array<RawHeading & { byteEnd: number; content: string }> = [];\n for (let i = 0; i < headings.length; i++) {\n const start = headings[i].byteOffset;\n const end = i + 1 < headings.length ? headings[i + 1].byteOffset : contentBytes;\n const sectionContent = Buffer.from(content, 'utf8').slice(start, end).toString('utf8');\n sections.push({ ...headings[i], byteEnd: end, content: sectionContent });\n }\n\n const root: ParsedSection[] = [];\n const stack: Array<{ section: ParsedSection; level: number }> = [];\n\n for (const s of sections) {\n const parsed: ParsedSection = {\n title: s.title,\n level: s.level,\n byteStart: s.byteOffset,\n byteEnd: s.byteEnd,\n content: s.content,\n children: [],\n };\n\n while (stack.length > 0 && stack[stack.length - 1].level >= s.level) {\n stack.pop();\n }\n\n if (stack.length === 0) {\n root.push(parsed);\n } else {\n stack[stack.length - 1].section.children.push(parsed);\n }\n\n stack.push({ section: parsed, level: s.level });\n }\n\n return root;\n}\n\nexport const plaintextParser: DocFormatParser = {\n name: 'plaintext',\n extensions: ['.txt'],\n\n parse(content: string, _filePath: string): ParseResult {\n const headings = extractHeadings(content);\n const sections = buildHierarchy(headings, content);\n return { sections, format: 'plaintext' };\n },\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var rdoc_exports = {};
20
+ __export(rdoc_exports, {
21
+ rdocParser: () => rdocParser
22
+ });
23
+ module.exports = __toCommonJS(rdoc_exports);
24
+ const HEADING_RE = /^(={1,6})\s+(.+)$/;
25
+ function extractHeadings(content) {
26
+ const lines = content.split("\n");
27
+ const headings = [];
28
+ let byteOffset = 0;
29
+ let inVerbatim = false;
30
+ for (let i = 0; i < lines.length; i++) {
31
+ const line = lines[i];
32
+ const lineBytes = Buffer.byteLength(line, "utf8") + 1;
33
+ if (line.startsWith(" ") && line.trim().length > 0) {
34
+ byteOffset += lineBytes;
35
+ continue;
36
+ }
37
+ const match = line.match(HEADING_RE);
38
+ if (match) {
39
+ headings.push({
40
+ title: match[2].trim(),
41
+ level: match[1].length,
42
+ lineIndex: i,
43
+ byteOffset
44
+ });
45
+ }
46
+ byteOffset += lineBytes;
47
+ }
48
+ return headings;
49
+ }
50
+ function buildHierarchy(headings, content) {
51
+ const contentBytes = Buffer.byteLength(content, "utf8");
52
+ if (headings.length === 0) {
53
+ return [{
54
+ title: "(document)",
55
+ level: 0,
56
+ byteStart: 0,
57
+ byteEnd: contentBytes,
58
+ content,
59
+ children: []
60
+ }];
61
+ }
62
+ const sections = [];
63
+ for (let i = 0; i < headings.length; i++) {
64
+ const start = headings[i].byteOffset;
65
+ const end = i + 1 < headings.length ? headings[i + 1].byteOffset : contentBytes;
66
+ const sectionContent = Buffer.from(content, "utf8").slice(start, end).toString("utf8");
67
+ sections.push({ ...headings[i], byteEnd: end, content: sectionContent });
68
+ }
69
+ const root = [];
70
+ const stack = [];
71
+ for (const s of sections) {
72
+ const parsed = {
73
+ title: s.title,
74
+ level: s.level,
75
+ byteStart: s.byteOffset,
76
+ byteEnd: s.byteEnd,
77
+ content: s.content,
78
+ children: []
79
+ };
80
+ while (stack.length > 0 && stack[stack.length - 1].level >= s.level) {
81
+ stack.pop();
82
+ }
83
+ if (stack.length === 0) {
84
+ root.push(parsed);
85
+ } else {
86
+ stack[stack.length - 1].section.children.push(parsed);
87
+ }
88
+ stack.push({ section: parsed, level: s.level });
89
+ }
90
+ return root;
91
+ }
92
+ const rdocParser = {
93
+ name: "rdoc",
94
+ extensions: [".rdoc"],
95
+ parse(content, _filePath) {
96
+ const headings = extractHeadings(content);
97
+ const sections = buildHierarchy(headings, content);
98
+ return { sections, format: "rdoc" };
99
+ }
100
+ };
101
+ // Annotate the CommonJS export names for ESM import in node:
102
+ 0 && (module.exports = {
103
+ rdocParser
104
+ });
105
+ //# sourceMappingURL=rdoc.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/docs/formats/rdoc.ts"],
4
+ "sourcesContent": ["/**\n * RDoc Section Parser\n *\n * Handles: .rdoc (Ruby documentation format)\n * Parsing strategy: = heading hierarchy (= Title, == Section, === Subsection)\n * Similar to AsciiDoc but with Ruby-specific conventions.\n */\n\nimport type { DocFormatParser, ParseResult, ParsedSection } from '../types';\n\nconst HEADING_RE = /^(={1,6})\\s+(.+)$/;\n\ninterface RawHeading {\n title: string;\n level: number;\n lineIndex: number;\n byteOffset: number;\n}\n\nfunction extractHeadings(content: string): RawHeading[] {\n const lines = content.split('\\n');\n const headings: RawHeading[] = [];\n let byteOffset = 0;\n let inVerbatim = false;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineBytes = Buffer.byteLength(line, 'utf8') + 1;\n\n // Track verbatim blocks (indented by 2+ spaces in RDoc)\n // Skip lines starting with spaces (code blocks in RDoc)\n if (line.startsWith(' ') && line.trim().length > 0) {\n byteOffset += lineBytes;\n continue;\n }\n\n const match = line.match(HEADING_RE);\n if (match) {\n headings.push({\n title: match[2].trim(),\n level: match[1].length,\n lineIndex: i,\n byteOffset,\n });\n }\n\n byteOffset += lineBytes;\n }\n\n return headings;\n}\n\nfunction buildHierarchy(headings: RawHeading[], content: string): ParsedSection[] {\n const contentBytes = Buffer.byteLength(content, 'utf8');\n\n if (headings.length === 0) {\n return [{\n title: '(document)',\n level: 0,\n byteStart: 0,\n byteEnd: contentBytes,\n content,\n children: [],\n }];\n }\n\n const sections: Array<RawHeading & { byteEnd: number; content: string }> = [];\n for (let i = 0; i < headings.length; i++) {\n const start = headings[i].byteOffset;\n const end = i + 1 < headings.length ? headings[i + 1].byteOffset : contentBytes;\n const sectionContent = Buffer.from(content, 'utf8').slice(start, end).toString('utf8');\n sections.push({ ...headings[i], byteEnd: end, content: sectionContent });\n }\n\n const root: ParsedSection[] = [];\n const stack: Array<{ section: ParsedSection; level: number }> = [];\n\n for (const s of sections) {\n const parsed: ParsedSection = {\n title: s.title,\n level: s.level,\n byteStart: s.byteOffset,\n byteEnd: s.byteEnd,\n content: s.content,\n children: [],\n };\n\n while (stack.length > 0 && stack[stack.length - 1].level >= s.level) {\n stack.pop();\n }\n\n if (stack.length === 0) {\n root.push(parsed);\n } else {\n stack[stack.length - 1].section.children.push(parsed);\n }\n\n stack.push({ section: parsed, level: s.level });\n }\n\n return root;\n}\n\nexport const rdocParser: DocFormatParser = {\n name: 'rdoc',\n extensions: ['.rdoc'],\n\n parse(content: string, _filePath: string): ParseResult {\n const headings = extractHeadings(content);\n const sections = buildHierarchy(headings, content);\n return { sections, format: 'rdoc' };\n },\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA,MAAM,aAAa;AASnB,SAAS,gBAAgB,SAA+B;AACtD,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAM,WAAyB,CAAC;AAChC,MAAI,aAAa;AACjB,MAAI,aAAa;AAEjB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,YAAY,OAAO,WAAW,MAAM,MAAM,IAAI;AAIpD,QAAI,KAAK,WAAW,IAAI,KAAK,KAAK,KAAK,EAAE,SAAS,GAAG;AACnD,oBAAc;AACd;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,MAAM,UAAU;AACnC,QAAI,OAAO;AACT,eAAS,KAAK;AAAA,QACZ,OAAO,MAAM,CAAC,EAAE,KAAK;AAAA,QACrB,OAAO,MAAM,CAAC,EAAE;AAAA,QAChB,WAAW;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH;AAEA,kBAAc;AAAA,EAChB;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,UAAwB,SAAkC;AAChF,QAAM,eAAe,OAAO,WAAW,SAAS,MAAM;AAEtD,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,CAAC;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW;AAAA,MACX,SAAS;AAAA,MACT;AAAA,MACA,UAAU,CAAC;AAAA,IACb,CAAC;AAAA,EACH;AAEA,QAAM,WAAqE,CAAC;AAC5E,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,QAAQ,SAAS,CAAC,EAAE;AAC1B,UAAM,MAAM,IAAI,IAAI,SAAS,SAAS,SAAS,IAAI,CAAC,EAAE,aAAa;AACnE,UAAM,iBAAiB,OAAO,KAAK,SAAS,MAAM,EAAE,MAAM,OAAO,GAAG,EAAE,SAAS,MAAM;AACrF,aAAS,KAAK,EAAE,GAAG,SAAS,CAAC,GAAG,SAAS,KAAK,SAAS,eAAe,CAAC;AAAA,EACzE;AAEA,QAAM,OAAwB,CAAC;AAC/B,QAAM,QAA0D,CAAC;AAEjE,aAAW,KAAK,UAAU;AACxB,UAAM,SAAwB;AAAA,MAC5B,OAAO,EAAE;AAAA,MACT,OAAO,EAAE;AAAA,MACT,WAAW,EAAE;AAAA,MACb,SAAS,EAAE;AAAA,MACX,SAAS,EAAE;AAAA,MACX,UAAU,CAAC;AAAA,IACb;AAEA,WAAO,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO;AACnE,YAAM,IAAI;AAAA,IACZ;AAEA,QAAI,MAAM,WAAW,GAAG;AACtB,WAAK,KAAK,MAAM;AAAA,IAClB,OAAO;AACL,YAAM,MAAM,SAAS,CAAC,EAAE,QAAQ,SAAS,KAAK,MAAM;AAAA,IACtD;AAEA,UAAM,KAAK,EAAE,SAAS,QAAQ,OAAO,EAAE,MAAM,CAAC;AAAA,EAChD;AAEA,SAAO;AACT;AAEO,MAAM,aAA8B;AAAA,EACzC,MAAM;AAAA,EACN,YAAY,CAAC,OAAO;AAAA,EAEpB,MAAM,SAAiB,WAAgC;AACrD,UAAM,WAAW,gBAAgB,OAAO;AACxC,UAAM,WAAW,eAAe,UAAU,OAAO;AACjD,WAAO,EAAE,UAAU,QAAQ,OAAO;AAAA,EACpC;AACF;",
6
+ "names": []
7
+ }