codesift-mcp 0.1.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 (177) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +241 -0
  3. package/dist/cli/args.d.ts +13 -0
  4. package/dist/cli/args.d.ts.map +1 -0
  5. package/dist/cli/args.js +79 -0
  6. package/dist/cli/args.js.map +1 -0
  7. package/dist/cli/commands.d.ts +4 -0
  8. package/dist/cli/commands.d.ts.map +1 -0
  9. package/dist/cli/commands.js +336 -0
  10. package/dist/cli/commands.js.map +1 -0
  11. package/dist/cli/help.d.ts +3 -0
  12. package/dist/cli/help.d.ts.map +1 -0
  13. package/dist/cli/help.js +271 -0
  14. package/dist/cli/help.js.map +1 -0
  15. package/dist/cli.d.ts +3 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +80 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/config.d.ts +23 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +49 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/parser/extractors/go.d.ts +4 -0
  24. package/dist/parser/extractors/go.d.ts.map +1 -0
  25. package/dist/parser/extractors/go.js +185 -0
  26. package/dist/parser/extractors/go.js.map +1 -0
  27. package/dist/parser/extractors/javascript.d.ts +9 -0
  28. package/dist/parser/extractors/javascript.d.ts.map +1 -0
  29. package/dist/parser/extractors/javascript.js +10 -0
  30. package/dist/parser/extractors/javascript.js.map +1 -0
  31. package/dist/parser/extractors/markdown.d.ts +15 -0
  32. package/dist/parser/extractors/markdown.d.ts.map +1 -0
  33. package/dist/parser/extractors/markdown.js +217 -0
  34. package/dist/parser/extractors/markdown.js.map +1 -0
  35. package/dist/parser/extractors/prisma.d.ts +17 -0
  36. package/dist/parser/extractors/prisma.d.ts.map +1 -0
  37. package/dist/parser/extractors/prisma.js +121 -0
  38. package/dist/parser/extractors/prisma.js.map +1 -0
  39. package/dist/parser/extractors/python.d.ts +4 -0
  40. package/dist/parser/extractors/python.d.ts.map +1 -0
  41. package/dist/parser/extractors/python.js +203 -0
  42. package/dist/parser/extractors/python.js.map +1 -0
  43. package/dist/parser/extractors/rust.d.ts +4 -0
  44. package/dist/parser/extractors/rust.d.ts.map +1 -0
  45. package/dist/parser/extractors/rust.js +178 -0
  46. package/dist/parser/extractors/rust.js.map +1 -0
  47. package/dist/parser/extractors/typescript.d.ts +4 -0
  48. package/dist/parser/extractors/typescript.d.ts.map +1 -0
  49. package/dist/parser/extractors/typescript.js +296 -0
  50. package/dist/parser/extractors/typescript.js.map +1 -0
  51. package/dist/parser/languages/tree-sitter-css.wasm +0 -0
  52. package/dist/parser/languages/tree-sitter-go.wasm +0 -0
  53. package/dist/parser/languages/tree-sitter-java.wasm +0 -0
  54. package/dist/parser/languages/tree-sitter-javascript.wasm +0 -0
  55. package/dist/parser/languages/tree-sitter-json.wasm +0 -0
  56. package/dist/parser/languages/tree-sitter-php.wasm +0 -0
  57. package/dist/parser/languages/tree-sitter-python.wasm +0 -0
  58. package/dist/parser/languages/tree-sitter-ruby.wasm +0 -0
  59. package/dist/parser/languages/tree-sitter-rust.wasm +0 -0
  60. package/dist/parser/languages/tree-sitter-tsx.wasm +0 -0
  61. package/dist/parser/languages/tree-sitter-typescript.wasm +0 -0
  62. package/dist/parser/parser-manager.d.ts +6 -0
  63. package/dist/parser/parser-manager.d.ts.map +1 -0
  64. package/dist/parser/parser-manager.js +60 -0
  65. package/dist/parser/parser-manager.js.map +1 -0
  66. package/dist/parser/symbol-extractor.d.ts +22 -0
  67. package/dist/parser/symbol-extractor.d.ts.map +1 -0
  68. package/dist/parser/symbol-extractor.js +115 -0
  69. package/dist/parser/symbol-extractor.js.map +1 -0
  70. package/dist/retrieval/codebase-retrieval.d.ts +27 -0
  71. package/dist/retrieval/codebase-retrieval.d.ts.map +1 -0
  72. package/dist/retrieval/codebase-retrieval.js +472 -0
  73. package/dist/retrieval/codebase-retrieval.js.map +1 -0
  74. package/dist/search/bm25.d.ts +22 -0
  75. package/dist/search/bm25.d.ts.map +1 -0
  76. package/dist/search/bm25.js +179 -0
  77. package/dist/search/bm25.js.map +1 -0
  78. package/dist/search/chunker.d.ts +9 -0
  79. package/dist/search/chunker.d.ts.map +1 -0
  80. package/dist/search/chunker.js +91 -0
  81. package/dist/search/chunker.js.map +1 -0
  82. package/dist/search/hybrid.d.ts +16 -0
  83. package/dist/search/hybrid.d.ts.map +1 -0
  84. package/dist/search/hybrid.js +51 -0
  85. package/dist/search/hybrid.js.map +1 -0
  86. package/dist/search/semantic.d.ts +44 -0
  87. package/dist/search/semantic.d.ts.map +1 -0
  88. package/dist/search/semantic.js +194 -0
  89. package/dist/search/semantic.js.map +1 -0
  90. package/dist/server.d.ts +2 -0
  91. package/dist/server.d.ts.map +1 -0
  92. package/dist/server.js +285 -0
  93. package/dist/server.js.map +1 -0
  94. package/dist/storage/chunk-store.d.ts +32 -0
  95. package/dist/storage/chunk-store.d.ts.map +1 -0
  96. package/dist/storage/chunk-store.js +144 -0
  97. package/dist/storage/chunk-store.js.map +1 -0
  98. package/dist/storage/embedding-store.d.ts +41 -0
  99. package/dist/storage/embedding-store.d.ts.map +1 -0
  100. package/dist/storage/embedding-store.js +149 -0
  101. package/dist/storage/embedding-store.js.map +1 -0
  102. package/dist/storage/index-store.d.ts +23 -0
  103. package/dist/storage/index-store.d.ts.map +1 -0
  104. package/dist/storage/index-store.js +95 -0
  105. package/dist/storage/index-store.js.map +1 -0
  106. package/dist/storage/registry.d.ts +35 -0
  107. package/dist/storage/registry.d.ts.map +1 -0
  108. package/dist/storage/registry.js +99 -0
  109. package/dist/storage/registry.js.map +1 -0
  110. package/dist/storage/usage-stats.d.ts +32 -0
  111. package/dist/storage/usage-stats.d.ts.map +1 -0
  112. package/dist/storage/usage-stats.js +180 -0
  113. package/dist/storage/usage-stats.js.map +1 -0
  114. package/dist/storage/usage-tracker.d.ts +35 -0
  115. package/dist/storage/usage-tracker.d.ts.map +1 -0
  116. package/dist/storage/usage-tracker.js +245 -0
  117. package/dist/storage/usage-tracker.js.map +1 -0
  118. package/dist/storage/watcher.d.ts +12 -0
  119. package/dist/storage/watcher.d.ts.map +1 -0
  120. package/dist/storage/watcher.js +66 -0
  121. package/dist/storage/watcher.js.map +1 -0
  122. package/dist/tools/context-tools.d.ts +31 -0
  123. package/dist/tools/context-tools.d.ts.map +1 -0
  124. package/dist/tools/context-tools.js +219 -0
  125. package/dist/tools/context-tools.js.map +1 -0
  126. package/dist/tools/diff-tools.d.ts +22 -0
  127. package/dist/tools/diff-tools.d.ts.map +1 -0
  128. package/dist/tools/diff-tools.js +165 -0
  129. package/dist/tools/diff-tools.js.map +1 -0
  130. package/dist/tools/generate-tools.d.ts +11 -0
  131. package/dist/tools/generate-tools.d.ts.map +1 -0
  132. package/dist/tools/generate-tools.js +135 -0
  133. package/dist/tools/generate-tools.js.map +1 -0
  134. package/dist/tools/graph-tools.d.ts +60 -0
  135. package/dist/tools/graph-tools.d.ts.map +1 -0
  136. package/dist/tools/graph-tools.js +313 -0
  137. package/dist/tools/graph-tools.js.map +1 -0
  138. package/dist/tools/index-tools.d.ts +39 -0
  139. package/dist/tools/index-tools.d.ts.map +1 -0
  140. package/dist/tools/index-tools.js +451 -0
  141. package/dist/tools/index-tools.js.map +1 -0
  142. package/dist/tools/outline-tools.d.ts +59 -0
  143. package/dist/tools/outline-tools.d.ts.map +1 -0
  144. package/dist/tools/outline-tools.js +342 -0
  145. package/dist/tools/outline-tools.js.map +1 -0
  146. package/dist/tools/search-tools.d.ts +29 -0
  147. package/dist/tools/search-tools.d.ts.map +1 -0
  148. package/dist/tools/search-tools.js +309 -0
  149. package/dist/tools/search-tools.js.map +1 -0
  150. package/dist/tools/symbol-tools.d.ts +24 -0
  151. package/dist/tools/symbol-tools.d.ts.map +1 -0
  152. package/dist/tools/symbol-tools.js +172 -0
  153. package/dist/tools/symbol-tools.js.map +1 -0
  154. package/dist/types.d.ts +91 -0
  155. package/dist/types.d.ts.map +1 -0
  156. package/dist/types.js +3 -0
  157. package/dist/types.js.map +1 -0
  158. package/dist/utils/git-validation.d.ts +11 -0
  159. package/dist/utils/git-validation.d.ts.map +1 -0
  160. package/dist/utils/git-validation.js +19 -0
  161. package/dist/utils/git-validation.js.map +1 -0
  162. package/dist/utils/test-file.d.ts +11 -0
  163. package/dist/utils/test-file.d.ts.map +1 -0
  164. package/dist/utils/test-file.js +27 -0
  165. package/dist/utils/test-file.js.map +1 -0
  166. package/package.json +62 -0
  167. package/src/parser/languages/tree-sitter-css.wasm +0 -0
  168. package/src/parser/languages/tree-sitter-go.wasm +0 -0
  169. package/src/parser/languages/tree-sitter-java.wasm +0 -0
  170. package/src/parser/languages/tree-sitter-javascript.wasm +0 -0
  171. package/src/parser/languages/tree-sitter-json.wasm +0 -0
  172. package/src/parser/languages/tree-sitter-php.wasm +0 -0
  173. package/src/parser/languages/tree-sitter-python.wasm +0 -0
  174. package/src/parser/languages/tree-sitter-ruby.wasm +0 -0
  175. package/src/parser/languages/tree-sitter-rust.wasm +0 -0
  176. package/src/parser/languages/tree-sitter-tsx.wasm +0 -0
  177. package/src/parser/languages/tree-sitter-typescript.wasm +0 -0
package/dist/cli.js ADDED
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env node
2
+ import { readFile } from "node:fs/promises";
3
+ import { join, dirname } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { loadConfig } from "./config.js";
6
+ import { parseArgs, getBoolFlag, die } from "./cli/args.js";
7
+ import { MAIN_HELP, COMMAND_HELP } from "./cli/help.js";
8
+ import { COMMAND_MAP } from "./cli/commands.js";
9
+ // ---------------------------------------------------------------------------
10
+ // Version
11
+ // ---------------------------------------------------------------------------
12
+ async function getVersion() {
13
+ try {
14
+ const thisDir = dirname(fileURLToPath(import.meta.url));
15
+ // Try dist/../package.json first, then src/../package.json
16
+ for (const base of [join(thisDir, ".."), join(thisDir, "..", "..")]) {
17
+ try {
18
+ const raw = await readFile(join(base, "package.json"), "utf-8");
19
+ const pkg = JSON.parse(raw);
20
+ if (typeof pkg === "object" && pkg !== null && "version" in pkg) {
21
+ return String(pkg["version"]);
22
+ }
23
+ }
24
+ catch {
25
+ continue;
26
+ }
27
+ }
28
+ }
29
+ catch {
30
+ // fall through
31
+ }
32
+ return "unknown";
33
+ }
34
+ // ---------------------------------------------------------------------------
35
+ // Main dispatch
36
+ // ---------------------------------------------------------------------------
37
+ async function main() {
38
+ const rawArgs = process.argv.slice(2);
39
+ const { positional, flags } = parseArgs(rawArgs);
40
+ const command = positional[0];
41
+ const commandArgs = positional.slice(1);
42
+ // Handle top-level flags
43
+ if (getBoolFlag(flags, "version") || command === "--version") {
44
+ const version = await getVersion();
45
+ process.stdout.write(`codesift ${version}\n`);
46
+ return;
47
+ }
48
+ if (getBoolFlag(flags, "help") && !command) {
49
+ process.stdout.write(MAIN_HELP);
50
+ return;
51
+ }
52
+ if (!command) {
53
+ process.stdout.write(MAIN_HELP);
54
+ return;
55
+ }
56
+ // Per-command help
57
+ if (getBoolFlag(flags, "help")) {
58
+ const help = COMMAND_HELP[command];
59
+ if (help) {
60
+ process.stdout.write(help + "\n");
61
+ }
62
+ else {
63
+ die(`Unknown command: ${command}. Run 'codesift --help' for available commands.`);
64
+ }
65
+ return;
66
+ }
67
+ // Initialize config before running any command
68
+ loadConfig();
69
+ const handler = COMMAND_MAP[command];
70
+ if (!handler) {
71
+ die(`Unknown command: ${command}. Run 'codesift --help' for available commands.`);
72
+ }
73
+ await handler(commandArgs, flags);
74
+ }
75
+ main().catch((err) => {
76
+ const message = err instanceof Error ? err.message : String(err);
77
+ process.stderr.write(`Error: ${message}\n`);
78
+ process.exit(1);
79
+ });
80
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export type EmbeddingProvider = "voyage" | "openai" | "ollama" | null;
2
+ export interface Config {
3
+ dataDir: string;
4
+ registryPath: string;
5
+ watchDebounceMs: number;
6
+ bm25FieldWeights: {
7
+ name: number;
8
+ signature: number;
9
+ docstring: number;
10
+ body: number;
11
+ };
12
+ embeddingProvider: EmbeddingProvider;
13
+ voyageApiKey: string | null;
14
+ openaiApiKey: string | null;
15
+ ollamaUrl: string | null;
16
+ embeddingBatchSize: number;
17
+ defaultTokenBudget: number;
18
+ defaultTopK: number;
19
+ }
20
+ export declare function loadConfig(): Config;
21
+ /** Reset cached config — for testing only. */
22
+ export declare function resetConfigCache(): void;
23
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;AAEtE,MAAM,WAAW,MAAM;IAErB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IAGrB,eAAe,EAAE,MAAM,CAAC;IAGxB,gBAAgB,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IAGF,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAG3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,wBAAgB,UAAU,IAAI,MAAM,CAoCnC;AAED,8CAA8C;AAC9C,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
package/dist/config.js ADDED
@@ -0,0 +1,49 @@
1
+ import { homedir } from "node:os";
2
+ import { join } from "node:path";
3
+ let cachedConfig = null;
4
+ export function loadConfig() {
5
+ if (cachedConfig)
6
+ return cachedConfig;
7
+ const dataDir = process.env["CODESIFT_DATA_DIR"] ?? join(homedir(), ".codesift");
8
+ const voyageApiKey = process.env["CODESIFT_VOYAGE_API_KEY"] ?? null;
9
+ const openaiApiKey = process.env["CODESIFT_OPENAI_API_KEY"] ?? null;
10
+ const ollamaUrl = process.env["CODESIFT_OLLAMA_URL"] ?? null;
11
+ let embeddingProvider = null;
12
+ if (voyageApiKey)
13
+ embeddingProvider = "voyage";
14
+ else if (openaiApiKey)
15
+ embeddingProvider = "openai";
16
+ else if (ollamaUrl)
17
+ embeddingProvider = "ollama";
18
+ cachedConfig = {
19
+ dataDir,
20
+ registryPath: join(dataDir, "registry.json"),
21
+ watchDebounceMs: parseIntEnv("CODESIFT_WATCH_DEBOUNCE_MS", 500),
22
+ bm25FieldWeights: {
23
+ name: 5.0,
24
+ signature: 2.5,
25
+ docstring: 1.5,
26
+ body: 0.5,
27
+ },
28
+ embeddingProvider,
29
+ voyageApiKey,
30
+ openaiApiKey,
31
+ ollamaUrl,
32
+ embeddingBatchSize: parseIntEnv("CODESIFT_EMBEDDING_BATCH_SIZE", 128),
33
+ defaultTokenBudget: parseIntEnv("CODESIFT_DEFAULT_TOKEN_BUDGET", 8000),
34
+ defaultTopK: parseIntEnv("CODESIFT_DEFAULT_TOP_K", 50),
35
+ };
36
+ return cachedConfig;
37
+ }
38
+ /** Reset cached config — for testing only. */
39
+ export function resetConfigCache() {
40
+ cachedConfig = null;
41
+ }
42
+ function parseIntEnv(name, defaultValue) {
43
+ const raw = process.env[name];
44
+ if (!raw)
45
+ return defaultValue;
46
+ const parsed = parseInt(raw, 10);
47
+ return isNaN(parsed) ? defaultValue : parsed;
48
+ }
49
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAgCjC,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC,MAAM,UAAU,UAAU;IACxB,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;IAEjF,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,IAAI,IAAI,CAAC;IACpE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,IAAI,IAAI,CAAC;IACpE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,IAAI,CAAC;IAE7D,IAAI,iBAAiB,GAAsB,IAAI,CAAC;IAChD,IAAI,YAAY;QAAE,iBAAiB,GAAG,QAAQ,CAAC;SAC1C,IAAI,YAAY;QAAE,iBAAiB,GAAG,QAAQ,CAAC;SAC/C,IAAI,SAAS;QAAE,iBAAiB,GAAG,QAAQ,CAAC;IAEjD,YAAY,GAAG;QACb,OAAO;QACP,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC;QAE5C,eAAe,EAAE,WAAW,CAAC,4BAA4B,EAAE,GAAG,CAAC;QAE/D,gBAAgB,EAAE;YAChB,IAAI,EAAE,GAAG;YACT,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,IAAI,EAAE,GAAG;SACV;QAED,iBAAiB;QACjB,YAAY;QACZ,YAAY;QACZ,SAAS;QACT,kBAAkB,EAAE,WAAW,CAAC,+BAA+B,EAAE,GAAG,CAAC;QAErE,kBAAkB,EAAE,WAAW,CAAC,+BAA+B,EAAE,IAAI,CAAC;QACtE,WAAW,EAAE,WAAW,CAAC,wBAAwB,EAAE,EAAE,CAAC;KACvD,CAAC;IACF,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,gBAAgB;IAC9B,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,YAAoB;IACrD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG;QAAE,OAAO,YAAY,CAAC;IAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type Parser from "web-tree-sitter";
2
+ import type { CodeSymbol } from "../../types.js";
3
+ export declare function extractGoSymbols(tree: Parser.Tree, filePath: string, source: string, repo: string): CodeSymbol[];
4
+ //# sourceMappingURL=go.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go.d.ts","sourceRoot":"","sources":["../../../src/parser/extractors/go.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,gBAAgB,CAAC;AAuH7D,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,UAAU,EAAE,CA4Gd"}
@@ -0,0 +1,185 @@
1
+ import { tokenizeIdentifier, makeSymbolId } from "../symbol-extractor.js";
2
+ const MAX_SOURCE_LENGTH = 5000;
3
+ // --- Helpers ---
4
+ function getNodeName(node) {
5
+ const nameNode = node.childForFieldName("name");
6
+ return nameNode?.text ?? null;
7
+ }
8
+ /**
9
+ * Collects contiguous // comment lines immediately preceding a declaration.
10
+ * Go convention uses // line comments for documentation (no block comment docs).
11
+ */
12
+ function getDocstring(node, source) {
13
+ const comments = [];
14
+ let prev = node.previousNamedSibling;
15
+ // Walk backwards collecting contiguous comment nodes
16
+ while (prev && prev.type === "comment") {
17
+ const text = source.slice(prev.startIndex, prev.endIndex);
18
+ comments.unshift(text);
19
+ // Check if there's another comment directly above (contiguous)
20
+ const nextPrev = prev.previousNamedSibling;
21
+ if (nextPrev &&
22
+ nextPrev.type === "comment" &&
23
+ nextPrev.endPosition.row === prev.startPosition.row - 1) {
24
+ prev = nextPrev;
25
+ }
26
+ else {
27
+ break;
28
+ }
29
+ }
30
+ if (comments.length === 0)
31
+ return undefined;
32
+ return comments.join("\n");
33
+ }
34
+ /**
35
+ * Extracts function/method signature: parameter list + return type.
36
+ * For Go functions: `(ctx context.Context, id string) (Order, error)`
37
+ * For Go methods: includes receiver in signature.
38
+ */
39
+ function getSignature(node, source) {
40
+ const params = node.childForFieldName("parameters");
41
+ if (!params)
42
+ return undefined;
43
+ let sig = "";
44
+ // Include receiver for methods: func (s *Server) Handle(...)
45
+ const receiver = node.childForFieldName("receiver");
46
+ if (receiver) {
47
+ sig += source.slice(receiver.startIndex, receiver.endIndex) + " ";
48
+ }
49
+ sig += source.slice(params.startIndex, params.endIndex);
50
+ const result = node.childForFieldName("result");
51
+ if (result) {
52
+ sig += " " + source.slice(result.startIndex, result.endIndex);
53
+ }
54
+ return sig;
55
+ }
56
+ function extractNodeSource(node, source) {
57
+ const text = source.slice(node.startIndex, node.endIndex);
58
+ if (text.length > MAX_SOURCE_LENGTH) {
59
+ return text.slice(0, MAX_SOURCE_LENGTH) + "...";
60
+ }
61
+ return text;
62
+ }
63
+ function makeSymbol(node, name, kind, filePath, source, repo, parentId) {
64
+ const startLine = node.startPosition.row + 1;
65
+ const endLine = node.endPosition.row + 1;
66
+ const docstring = getDocstring(node, source);
67
+ const sym = {
68
+ id: makeSymbolId(repo, filePath, name, startLine),
69
+ repo,
70
+ name,
71
+ kind,
72
+ file: filePath,
73
+ start_line: startLine,
74
+ end_line: endLine,
75
+ source: extractNodeSource(node, source),
76
+ tokens: tokenizeIdentifier(name),
77
+ };
78
+ if (docstring)
79
+ sym.docstring = docstring;
80
+ if (parentId)
81
+ sym.parent = parentId;
82
+ return sym;
83
+ }
84
+ // --- Main extractor ---
85
+ export function extractGoSymbols(tree, filePath, source, repo) {
86
+ const symbols = [];
87
+ function walk(node, parentId) {
88
+ switch (node.type) {
89
+ case "function_declaration": {
90
+ const name = getNodeName(node);
91
+ if (name) {
92
+ const sym = makeSymbol(node, name, "function", filePath, source, repo, parentId);
93
+ const sig = getSignature(node, source);
94
+ if (sig)
95
+ sym.signature = sig;
96
+ symbols.push(sym);
97
+ }
98
+ break;
99
+ }
100
+ case "method_declaration": {
101
+ const name = getNodeName(node);
102
+ if (name) {
103
+ const sym = makeSymbol(node, name, "method", filePath, source, repo, parentId);
104
+ const sig = getSignature(node, source);
105
+ if (sig)
106
+ sym.signature = sig;
107
+ symbols.push(sym);
108
+ }
109
+ break;
110
+ }
111
+ case "type_declaration": {
112
+ // type_declaration contains one or more type_spec children
113
+ for (const child of node.namedChildren) {
114
+ if (child.type !== "type_spec")
115
+ continue;
116
+ const name = getNodeName(child);
117
+ if (!name)
118
+ continue;
119
+ // Determine kind from the type body
120
+ const typeBody = child.childForFieldName("type");
121
+ let kind = "type";
122
+ if (typeBody) {
123
+ switch (typeBody.type) {
124
+ case "struct_type":
125
+ kind = "class";
126
+ break;
127
+ case "interface_type":
128
+ kind = "interface";
129
+ break;
130
+ default:
131
+ kind = "type";
132
+ break;
133
+ }
134
+ }
135
+ // Use the parent type_declaration node for source/position
136
+ // so the full `type Foo struct { ... }` is captured
137
+ const sym = makeSymbol(node, name, kind, filePath, source, repo, parentId);
138
+ symbols.push(sym);
139
+ // For structs, walk fields as children
140
+ if (kind === "class" && typeBody) {
141
+ for (const field of typeBody.namedChildren) {
142
+ if (field.type === "field_declaration_list") {
143
+ for (const fieldDecl of field.namedChildren) {
144
+ if (fieldDecl.type === "field_declaration") {
145
+ const fieldName = getNodeName(fieldDecl);
146
+ if (fieldName) {
147
+ const fieldSym = makeSymbol(fieldDecl, fieldName, "field", filePath, source, repo, sym.id);
148
+ symbols.push(fieldSym);
149
+ }
150
+ }
151
+ }
152
+ }
153
+ }
154
+ }
155
+ }
156
+ return;
157
+ }
158
+ case "const_declaration":
159
+ case "var_declaration": {
160
+ // Package-level const/var: only at top level (no parent)
161
+ if (parentId)
162
+ break;
163
+ for (const child of node.namedChildren) {
164
+ if (child.type === "const_spec" || child.type === "var_spec") {
165
+ const name = getNodeName(child);
166
+ if (name) {
167
+ const sym = makeSymbol(node, name, "variable", filePath, source, repo);
168
+ symbols.push(sym);
169
+ }
170
+ }
171
+ }
172
+ return;
173
+ }
174
+ default:
175
+ break;
176
+ }
177
+ // Default: walk children
178
+ for (const child of node.namedChildren) {
179
+ walk(child, parentId);
180
+ }
181
+ }
182
+ walk(tree.rootNode);
183
+ return symbols;
184
+ }
185
+ //# sourceMappingURL=go.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go.js","sourceRoot":"","sources":["../../../src/parser/extractors/go.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE1E,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAE/B,kBAAkB;AAElB,SAAS,WAAW,CAAC,IAAuB;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAChD,OAAO,QAAQ,EAAE,IAAI,IAAI,IAAI,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CACnB,IAAuB,EACvB,MAAc;IAEd,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC;IAErC,qDAAqD;IACrD,OAAO,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1D,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEvB,+DAA+D;QAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC;QAC3C,IACE,QAAQ;YACR,QAAQ,CAAC,IAAI,KAAK,SAAS;YAC3B,QAAQ,CAAC,WAAW,CAAC,GAAG,KAAK,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,EACvD,CAAC;YACD,IAAI,GAAG,QAAQ,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CACnB,IAAuB,EACvB,MAAc;IAEd,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE9B,IAAI,GAAG,GAAG,EAAE,CAAC;IAEb,6DAA6D;IAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,QAAQ,EAAE,CAAC;QACb,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC;IACpE,CAAC;IAED,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAExD,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAChD,IAAI,MAAM,EAAE,CAAC;QACX,GAAG,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CACxB,IAAuB,EACvB,MAAc;IAEd,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1D,IAAI,IAAI,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,GAAG,KAAK,CAAC;IAClD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CACjB,IAAuB,EACvB,IAAY,EACZ,IAAgB,EAChB,QAAgB,EAChB,MAAc,EACd,IAAY,EACZ,QAAiB;IAEjB,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAE7C,MAAM,GAAG,GAAe;QACtB,EAAE,EAAE,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC;QACjD,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,SAAS;QACrB,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC;QACvC,MAAM,EAAE,kBAAkB,CAAC,IAAI,CAAC;KACjC,CAAC;IAEF,IAAI,SAAS;QAAE,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;IACzC,IAAI,QAAQ;QAAE,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC;IAEpC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,yBAAyB;AAEzB,MAAM,UAAU,gBAAgB,CAC9B,IAAiB,EACjB,QAAgB,EAChB,MAAc,EACd,IAAY;IAEZ,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,SAAS,IAAI,CAAC,IAAuB,EAAE,QAAiB;QACtD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,sBAAsB,CAAC,CAAC,CAAC;gBAC5B,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC/B,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;oBACjF,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;oBACvC,IAAI,GAAG;wBAAE,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;oBAC7B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpB,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,oBAAoB,CAAC,CAAC,CAAC;gBAC1B,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC/B,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;oBAC/E,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;oBACvC,IAAI,GAAG;wBAAE,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;oBAC7B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpB,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,2DAA2D;gBAC3D,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;oBACvC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;wBAAE,SAAS;oBAEzC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;oBAChC,IAAI,CAAC,IAAI;wBAAE,SAAS;oBAEpB,oCAAoC;oBACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;oBACjD,IAAI,IAAI,GAAe,MAAM,CAAC;oBAC9B,IAAI,QAAQ,EAAE,CAAC;wBACb,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;4BACtB,KAAK,aAAa;gCAChB,IAAI,GAAG,OAAO,CAAC;gCACf,MAAM;4BACR,KAAK,gBAAgB;gCACnB,IAAI,GAAG,WAAW,CAAC;gCACnB,MAAM;4BACR;gCACE,IAAI,GAAG,MAAM,CAAC;gCACd,MAAM;wBACV,CAAC;oBACH,CAAC;oBAED,2DAA2D;oBAC3D,oDAAoD;oBACpD,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;oBAC3E,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAElB,uCAAuC;oBACvC,IAAI,IAAI,KAAK,OAAO,IAAI,QAAQ,EAAE,CAAC;wBACjC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;4BAC3C,IAAI,KAAK,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;gCAC5C,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;oCAC5C,IAAI,SAAS,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;wCAC3C,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;wCACzC,IAAI,SAAS,EAAE,CAAC;4CACd,MAAM,QAAQ,GAAG,UAAU,CACzB,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,CAC9D,CAAC;4CACF,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wCACzB,CAAC;oCACH,CAAC;gCACH,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,OAAO;YACT,CAAC;YAED,KAAK,mBAAmB,CAAC;YACzB,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,yDAAyD;gBACzD,IAAI,QAAQ;oBAAE,MAAM;gBAEpB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;oBACvC,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;wBAC7D,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;wBAChC,IAAI,IAAI,EAAE,CAAC;4BACT,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;4BACvE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBACpB,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,OAAO;YACT,CAAC;YAED;gBACE,MAAM;QACV,CAAC;QAED,yBAAyB;QACzB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpB,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type Parser from "web-tree-sitter";
2
+ import type { CodeSymbol } from "../../types.js";
3
+ /**
4
+ * JavaScript extractor — reuses the TypeScript extractor since
5
+ * tree-sitter JavaScript and TypeScript grammars share node types
6
+ * for functions, classes, arrow functions, etc.
7
+ */
8
+ export declare function extractJavaScriptSymbols(tree: Parser.Tree, filePath: string, source: string, repo: string): CodeSymbol[];
9
+ //# sourceMappingURL=javascript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript.d.ts","sourceRoot":"","sources":["../../../src/parser/extractors/javascript.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,UAAU,EAAE,CAEd"}
@@ -0,0 +1,10 @@
1
+ import { extractTypeScriptSymbols } from "./typescript.js";
2
+ /**
3
+ * JavaScript extractor — reuses the TypeScript extractor since
4
+ * tree-sitter JavaScript and TypeScript grammars share node types
5
+ * for functions, classes, arrow functions, etc.
6
+ */
7
+ export function extractJavaScriptSymbols(tree, filePath, source, repo) {
8
+ return extractTypeScriptSymbols(tree, filePath, source, repo);
9
+ }
10
+ //# sourceMappingURL=javascript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript.js","sourceRoot":"","sources":["../../../src/parser/extractors/javascript.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CACtC,IAAiB,EACjB,QAAgB,EAChB,MAAc,EACd,IAAY;IAEZ,OAAO,wBAAwB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Markdown symbol extractor — custom parser (no tree-sitter).
3
+ *
4
+ * Extracts:
5
+ * - Headings (# ... ######) as "section" kind with hierarchical parent refs
6
+ * - YAML frontmatter (--- delimited) as "metadata" kind
7
+ *
8
+ * Section boundaries span from heading to next heading of same/higher level (or EOF).
9
+ */
10
+ import type { CodeSymbol } from "../../types.js";
11
+ /**
12
+ * Extract symbols from a markdown file without tree-sitter.
13
+ */
14
+ export declare function extractMarkdownSymbols(source: string, filePath: string, repo: string): CodeSymbol[];
15
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../src/parser/extractors/markdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAQjD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,UAAU,EAAE,CAkJd"}
@@ -0,0 +1,217 @@
1
+ /**
2
+ * Markdown symbol extractor — custom parser (no tree-sitter).
3
+ *
4
+ * Extracts:
5
+ * - Headings (# ... ######) as "section" kind with hierarchical parent refs
6
+ * - YAML frontmatter (--- delimited) as "metadata" kind
7
+ *
8
+ * Section boundaries span from heading to next heading of same/higher level (or EOF).
9
+ */
10
+ import { tokenizeIdentifier, makeSymbolId } from "../symbol-extractor.js";
11
+ const MAX_SOURCE_LENGTH = 5000;
12
+ const HEADING_RE = /^(#{1,6})\s+(.+)$/;
13
+ const FENCE_RE = /^(`{3,}|~{3,})/;
14
+ /**
15
+ * Extract symbols from a markdown file without tree-sitter.
16
+ */
17
+ export function extractMarkdownSymbols(source, filePath, repo) {
18
+ const symbols = [];
19
+ const lines = source.split("\n");
20
+ const totalLines = lines.length;
21
+ // --- Frontmatter extraction ---
22
+ let frontmatterEndLine = -1; // -1 = no frontmatter
23
+ if (totalLines > 0 && lines[0].trim() === "---") {
24
+ for (let i = 1; i < totalLines; i++) {
25
+ if (lines[i].trim() === "---") {
26
+ frontmatterEndLine = i; // 0-indexed
27
+ break;
28
+ }
29
+ }
30
+ }
31
+ if (frontmatterEndLine > 0) {
32
+ const fmLines = lines.slice(0, frontmatterEndLine + 1);
33
+ const fmSource = fmLines.join("\n");
34
+ const contentLines = lines.slice(1, frontmatterEndLine);
35
+ const summary = contentLines
36
+ .map((ln) => ln.trim())
37
+ .filter(Boolean)
38
+ .join("; ")
39
+ .slice(0, 150);
40
+ const sym = {
41
+ id: makeSymbolId(repo, filePath, "frontmatter", 1),
42
+ repo,
43
+ name: "frontmatter",
44
+ kind: "metadata",
45
+ file: filePath,
46
+ start_line: 1,
47
+ end_line: frontmatterEndLine + 1, // 1-based
48
+ source: fmSource.length > MAX_SOURCE_LENGTH
49
+ ? fmSource.slice(0, MAX_SOURCE_LENGTH) + "..."
50
+ : fmSource,
51
+ tokens: ["frontmatter"],
52
+ };
53
+ if (summary)
54
+ sym.docstring = summary;
55
+ symbols.push(sym);
56
+ }
57
+ // --- Collect headings, skipping fenced code blocks ---
58
+ const headings = [];
59
+ let inFencedBlock = false;
60
+ for (let i = 0; i < totalLines; i++) {
61
+ const line = lines[i];
62
+ const trimmed = line.trim();
63
+ if (FENCE_RE.test(trimmed)) {
64
+ inFencedBlock = !inFencedBlock;
65
+ continue;
66
+ }
67
+ if (inFencedBlock)
68
+ continue;
69
+ const match = HEADING_RE.exec(line);
70
+ if (match) {
71
+ headings.push({
72
+ lineIdx: i,
73
+ level: match[1].length,
74
+ text: match[2].trim(),
75
+ });
76
+ }
77
+ }
78
+ if (headings.length === 0)
79
+ return symbols;
80
+ // --- Compute section end lines (0-indexed, inclusive) ---
81
+ const headingEndLines = [];
82
+ for (let idx = 0; idx < headings.length; idx++) {
83
+ const { level } = headings[idx];
84
+ let end = totalLines - 1; // default: EOF
85
+ for (let nextIdx = idx + 1; nextIdx < headings.length; nextIdx++) {
86
+ if (headings[nextIdx].level <= level) {
87
+ end = headings[nextIdx].lineIdx - 1;
88
+ break;
89
+ }
90
+ }
91
+ headingEndLines.push(end);
92
+ }
93
+ // --- Build parent stack for hierarchy ---
94
+ // Stack: Array of { level, qualifiedName, symbolId }
95
+ const parentStack = [];
96
+ for (let idx = 0; idx < headings.length; idx++) {
97
+ const { lineIdx, level, text } = headings[idx];
98
+ const endLineIdx = headingEndLines[idx];
99
+ // Pop stack until we find a parent with lower level (higher heading)
100
+ while (parentStack.length > 0 && parentStack[parentStack.length - 1].level >= level) {
101
+ parentStack.pop();
102
+ }
103
+ // Build qualified name (hierarchical path)
104
+ let qualifiedName;
105
+ let parentId;
106
+ if (parentStack.length > 0) {
107
+ const parent = parentStack[parentStack.length - 1];
108
+ qualifiedName = `${parent.qualifiedName}/${text}`;
109
+ parentId = parent.symbolId;
110
+ }
111
+ else {
112
+ qualifiedName = text;
113
+ parentId = undefined;
114
+ }
115
+ // Extract section source
116
+ const sectionLines = lines.slice(lineIdx, endLineIdx + 1);
117
+ const sectionSource = sectionLines.join("\n");
118
+ // Build summary from first content after heading
119
+ const summary = buildSectionSummary(lines, lineIdx, endLineIdx);
120
+ const startLine = lineIdx + 1; // 1-based
121
+ const endLine = endLineIdx + 1; // 1-based
122
+ const symId = makeSymbolId(repo, filePath, qualifiedName, startLine);
123
+ const sym = {
124
+ id: symId,
125
+ repo,
126
+ name: text,
127
+ kind: "section",
128
+ file: filePath,
129
+ start_line: startLine,
130
+ end_line: endLine,
131
+ signature: `${"#".repeat(level)} ${text}`,
132
+ source: sectionSource.length > MAX_SOURCE_LENGTH
133
+ ? sectionSource.slice(0, MAX_SOURCE_LENGTH) + "..."
134
+ : sectionSource,
135
+ tokens: tokenizeIdentifier(text.replace(/[^a-zA-Z0-9_]/g, " ").replace(/\s+/g, "_")),
136
+ };
137
+ if (summary)
138
+ sym.docstring = summary;
139
+ if (parentId)
140
+ sym.parent = parentId;
141
+ symbols.push(sym);
142
+ // Push onto stack for child headings
143
+ parentStack.push({ level, qualifiedName, symbolId: symId });
144
+ }
145
+ return symbols;
146
+ }
147
+ /**
148
+ * Build a summary for a markdown section.
149
+ *
150
+ * Rules:
151
+ * - Table (starts with |) → "Table: N rows"
152
+ * - Code block (``` or ~~~) → "Code: language, N lines"
153
+ * - Otherwise → first non-empty paragraph, truncated to 150 chars
154
+ */
155
+ function buildSectionSummary(lines, headingLineIdx, endLineIdx) {
156
+ const contentStart = headingLineIdx + 1;
157
+ if (contentStart > endLineIdx)
158
+ return "";
159
+ // Skip blank lines after heading
160
+ let firstContent = contentStart;
161
+ while (firstContent <= endLineIdx && !lines[firstContent].trim()) {
162
+ firstContent++;
163
+ }
164
+ if (firstContent > endLineIdx)
165
+ return "";
166
+ const firstLine = lines[firstContent].trim();
167
+ // Check for table
168
+ if (firstLine.startsWith("|")) {
169
+ let tableRows = 0;
170
+ for (let j = firstContent; j <= endLineIdx; j++) {
171
+ const stripped = lines[j].trim();
172
+ if (stripped.startsWith("|")) {
173
+ // Skip separator rows (|---|---|)
174
+ if (!/^\|[\s\-:|]+\|$/.test(stripped)) {
175
+ tableRows++;
176
+ }
177
+ }
178
+ else if (!stripped) {
179
+ continue;
180
+ }
181
+ else {
182
+ break;
183
+ }
184
+ }
185
+ return `Table: ${tableRows} rows`;
186
+ }
187
+ // Check for code block
188
+ const codeMatch = FENCE_RE.exec(firstLine);
189
+ if (codeMatch) {
190
+ const langMatch = /^(?:`{3,}|~{3,})\s*([\w+-]*)/.exec(firstLine);
191
+ const lang = langMatch?.[1] || "text";
192
+ let codeLines = 0;
193
+ const fenceChar = codeMatch[1].slice(0, 3);
194
+ for (let j = firstContent + 1; j <= endLineIdx; j++) {
195
+ if (lines[j].trim().startsWith(fenceChar))
196
+ break;
197
+ codeLines++;
198
+ }
199
+ return `Code: ${lang}, ${codeLines} lines`;
200
+ }
201
+ // Default: first non-empty paragraph
202
+ const paraLines = [];
203
+ for (let j = firstContent; j <= endLineIdx; j++) {
204
+ const stripped = lines[j].trim();
205
+ if (stripped && !stripped.startsWith("#")) {
206
+ paraLines.push(stripped);
207
+ }
208
+ else if (!stripped && paraLines.length > 0) {
209
+ break;
210
+ }
211
+ else if (stripped.startsWith("#")) {
212
+ break;
213
+ }
214
+ }
215
+ return paraLines.join(" ").slice(0, 150);
216
+ }
217
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/parser/extractors/markdown.ts"],"names":[],"mappings":"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"}