@know-graph/core 0.4.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 (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +47 -0
  3. package/dist/connectors/cache.d.ts +25 -0
  4. package/dist/connectors/cache.d.ts.map +1 -0
  5. package/dist/connectors/cache.js +73 -0
  6. package/dist/connectors/cache.js.map +1 -0
  7. package/dist/connectors/index.d.ts +12 -0
  8. package/dist/connectors/index.d.ts.map +1 -0
  9. package/dist/connectors/index.js +7 -0
  10. package/dist/connectors/index.js.map +1 -0
  11. package/dist/connectors/jira-connector.d.ts +26 -0
  12. package/dist/connectors/jira-connector.d.ts.map +1 -0
  13. package/dist/connectors/jira-connector.js +234 -0
  14. package/dist/connectors/jira-connector.js.map +1 -0
  15. package/dist/connectors/notion-connector.d.ts +24 -0
  16. package/dist/connectors/notion-connector.d.ts.map +1 -0
  17. package/dist/connectors/notion-connector.js +246 -0
  18. package/dist/connectors/notion-connector.js.map +1 -0
  19. package/dist/connectors/rate-limiter.d.ts +23 -0
  20. package/dist/connectors/rate-limiter.d.ts.map +1 -0
  21. package/dist/connectors/rate-limiter.js +54 -0
  22. package/dist/connectors/rate-limiter.js.map +1 -0
  23. package/dist/connectors/registry.d.ts +15 -0
  24. package/dist/connectors/registry.d.ts.map +1 -0
  25. package/dist/connectors/registry.js +72 -0
  26. package/dist/connectors/registry.js.map +1 -0
  27. package/dist/connectors/types.d.ts +142 -0
  28. package/dist/connectors/types.d.ts.map +1 -0
  29. package/dist/connectors/types.js +35 -0
  30. package/dist/connectors/types.js.map +1 -0
  31. package/dist/coverage/__tests__/fixtures/mixed-project/annotated.d.ts +9 -0
  32. package/dist/coverage/__tests__/fixtures/mixed-project/annotated.d.ts.map +1 -0
  33. package/dist/coverage/__tests__/fixtures/mixed-project/annotated.js +11 -0
  34. package/dist/coverage/__tests__/fixtures/mixed-project/annotated.js.map +1 -0
  35. package/dist/coverage/__tests__/fixtures/mixed-project/unannotated.d.ts +2 -0
  36. package/dist/coverage/__tests__/fixtures/mixed-project/unannotated.d.ts.map +1 -0
  37. package/dist/coverage/__tests__/fixtures/mixed-project/unannotated.js +4 -0
  38. package/dist/coverage/__tests__/fixtures/mixed-project/unannotated.js.map +1 -0
  39. package/dist/coverage/coverage-calculator.d.ts +3 -0
  40. package/dist/coverage/coverage-calculator.d.ts.map +1 -0
  41. package/dist/coverage/coverage-calculator.js +204 -0
  42. package/dist/coverage/coverage-calculator.js.map +1 -0
  43. package/dist/coverage/index.d.ts +3 -0
  44. package/dist/coverage/index.d.ts.map +1 -0
  45. package/dist/coverage/index.js +2 -0
  46. package/dist/coverage/index.js.map +1 -0
  47. package/dist/coverage/types.d.ts +38 -0
  48. package/dist/coverage/types.d.ts.map +1 -0
  49. package/dist/coverage/types.js +13 -0
  50. package/dist/coverage/types.js.map +1 -0
  51. package/dist/index.d.ts +17 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +16 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/indexer/database.d.ts +32 -0
  56. package/dist/indexer/database.d.ts.map +1 -0
  57. package/dist/indexer/database.js +242 -0
  58. package/dist/indexer/database.js.map +1 -0
  59. package/dist/indexer/index.d.ts +7 -0
  60. package/dist/indexer/index.d.ts.map +1 -0
  61. package/dist/indexer/index.js +4 -0
  62. package/dist/indexer/index.js.map +1 -0
  63. package/dist/indexer/indexer.d.ts +12 -0
  64. package/dist/indexer/indexer.d.ts.map +1 -0
  65. package/dist/indexer/indexer.js +145 -0
  66. package/dist/indexer/indexer.js.map +1 -0
  67. package/dist/indexer/schema.d.ts +21 -0
  68. package/dist/indexer/schema.d.ts.map +1 -0
  69. package/dist/indexer/schema.js +122 -0
  70. package/dist/indexer/schema.js.map +1 -0
  71. package/dist/indexer/types.d.ts +85 -0
  72. package/dist/indexer/types.d.ts.map +1 -0
  73. package/dist/indexer/types.js +2 -0
  74. package/dist/indexer/types.js.map +1 -0
  75. package/dist/parsers/generic-parser.d.ts +3 -0
  76. package/dist/parsers/generic-parser.d.ts.map +1 -0
  77. package/dist/parsers/generic-parser.js +150 -0
  78. package/dist/parsers/generic-parser.js.map +1 -0
  79. package/dist/parsers/go-parser.d.ts +3 -0
  80. package/dist/parsers/go-parser.d.ts.map +1 -0
  81. package/dist/parsers/go-parser.js +437 -0
  82. package/dist/parsers/go-parser.js.map +1 -0
  83. package/dist/parsers/index.d.ts +10 -0
  84. package/dist/parsers/index.d.ts.map +1 -0
  85. package/dist/parsers/index.js +8 -0
  86. package/dist/parsers/index.js.map +1 -0
  87. package/dist/parsers/java-parser.d.ts +3 -0
  88. package/dist/parsers/java-parser.d.ts.map +1 -0
  89. package/dist/parsers/java-parser.js +321 -0
  90. package/dist/parsers/java-parser.js.map +1 -0
  91. package/dist/parsers/metadata-extractor.d.ts +25 -0
  92. package/dist/parsers/metadata-extractor.d.ts.map +1 -0
  93. package/dist/parsers/metadata-extractor.js +137 -0
  94. package/dist/parsers/metadata-extractor.js.map +1 -0
  95. package/dist/parsers/python-parser.d.ts +3 -0
  96. package/dist/parsers/python-parser.d.ts.map +1 -0
  97. package/dist/parsers/python-parser.js +226 -0
  98. package/dist/parsers/python-parser.js.map +1 -0
  99. package/dist/parsers/registry.d.ts +3 -0
  100. package/dist/parsers/registry.d.ts.map +1 -0
  101. package/dist/parsers/registry.js +41 -0
  102. package/dist/parsers/registry.js.map +1 -0
  103. package/dist/parsers/types.d.ts +23 -0
  104. package/dist/parsers/types.d.ts.map +1 -0
  105. package/dist/parsers/types.js +2 -0
  106. package/dist/parsers/types.js.map +1 -0
  107. package/dist/parsers/typescript-parser.d.ts +3 -0
  108. package/dist/parsers/typescript-parser.d.ts.map +1 -0
  109. package/dist/parsers/typescript-parser.js +321 -0
  110. package/dist/parsers/typescript-parser.js.map +1 -0
  111. package/dist/query/index.d.ts +3 -0
  112. package/dist/query/index.d.ts.map +1 -0
  113. package/dist/query/index.js +2 -0
  114. package/dist/query/index.js.map +1 -0
  115. package/dist/query/query-engine.d.ts +40 -0
  116. package/dist/query/query-engine.d.ts.map +1 -0
  117. package/dist/query/query-engine.js +126 -0
  118. package/dist/query/query-engine.js.map +1 -0
  119. package/dist/suggest/index.d.ts +3 -0
  120. package/dist/suggest/index.d.ts.map +1 -0
  121. package/dist/suggest/index.js +2 -0
  122. package/dist/suggest/index.js.map +1 -0
  123. package/dist/suggest/suggestion-engine.d.ts +7 -0
  124. package/dist/suggest/suggestion-engine.d.ts.map +1 -0
  125. package/dist/suggest/suggestion-engine.js +239 -0
  126. package/dist/suggest/suggestion-engine.js.map +1 -0
  127. package/dist/suggest/types.d.ts +29 -0
  128. package/dist/suggest/types.d.ts.map +1 -0
  129. package/dist/suggest/types.js +13 -0
  130. package/dist/suggest/types.js.map +1 -0
  131. package/dist/types/entity.d.ts +336 -0
  132. package/dist/types/entity.d.ts.map +1 -0
  133. package/dist/types/entity.js +99 -0
  134. package/dist/types/entity.js.map +1 -0
  135. package/dist/types/index.d.ts +6 -0
  136. package/dist/types/index.d.ts.map +1 -0
  137. package/dist/types/index.js +3 -0
  138. package/dist/types/index.js.map +1 -0
  139. package/dist/types/manifest.d.ts +488 -0
  140. package/dist/types/manifest.d.ts.map +1 -0
  141. package/dist/types/manifest.js +66 -0
  142. package/dist/types/manifest.js.map +1 -0
  143. package/dist/types/parse-result.d.ts +25 -0
  144. package/dist/types/parse-result.d.ts.map +1 -0
  145. package/dist/types/parse-result.js +2 -0
  146. package/dist/types/parse-result.js.map +1 -0
  147. package/dist/validation/index.d.ts +5 -0
  148. package/dist/validation/index.d.ts.map +1 -0
  149. package/dist/validation/index.js +3 -0
  150. package/dist/validation/index.js.map +1 -0
  151. package/dist/validation/rules.d.ts +9 -0
  152. package/dist/validation/rules.d.ts.map +1 -0
  153. package/dist/validation/rules.js +119 -0
  154. package/dist/validation/rules.js.map +1 -0
  155. package/dist/validation/types.d.ts +34 -0
  156. package/dist/validation/types.d.ts.map +1 -0
  157. package/dist/validation/types.js +2 -0
  158. package/dist/validation/types.js.map +1 -0
  159. package/dist/validation/validator.d.ts +10 -0
  160. package/dist/validation/validator.d.ts.map +1 -0
  161. package/dist/validation/validator.js +111 -0
  162. package/dist/validation/validator.js.map +1 -0
  163. package/package.json +58 -0
@@ -0,0 +1,7 @@
1
+ export { CREATE_TABLES_SQL } from './schema.js';
2
+ export { createDatabaseManager, generateEntityId } from './database.js';
3
+ export type { DatabaseManager } from './database.js';
4
+ export { createIndexer } from './indexer.js';
5
+ export type { ParserRegistry, ParserFn } from './indexer.js';
6
+ export type { StoredEntity, EntityInsert, IndexStats, IndexerOptions, IndexProgress, IndexResult, IndexError, } from './types.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/indexer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACxE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7D,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,cAAc,EACd,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { CREATE_TABLES_SQL } from './schema.js';
2
+ export { createDatabaseManager, generateEntityId } from './database.js';
3
+ export { createIndexer } from './indexer.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/indexer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAExE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ParseResult } from '../types/index.js';
2
+ import { type DatabaseManager } from './database.js';
3
+ import type { IndexerOptions, IndexResult } from './types.js';
4
+ export type ParserFn = (filePath: string, content: string) => readonly ParseResult[];
5
+ export interface ParserRegistry {
6
+ readonly parse: (filePath: string, content: string) => readonly ParseResult[];
7
+ readonly canParse: (filePath: string) => boolean;
8
+ }
9
+ export declare function createIndexer(parserRegistry: ParserRegistry, dbManager: DatabaseManager): {
10
+ readonly index: (options: IndexerOptions) => IndexResult;
11
+ };
12
+ //# sourceMappingURL=indexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../../src/indexer/indexer.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAc,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE1E,MAAM,MAAM,QAAQ,GAAG,CACrB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,KACZ,SAAS,WAAW,EAAE,CAAC;AAE5B,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,SAAS,WAAW,EAAE,CAAC;IAC9E,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;CAClD;AAoCD,wBAAgB,aAAa,CAC3B,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,eAAe,GACzB;IACD,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,WAAW,CAAC;CAC1D,CAwHA"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * @knowgraph
3
+ * type: module
4
+ * description: File system scanner and indexer with incremental updates and .gitignore support
5
+ * owner: knowgraph-core
6
+ * status: stable
7
+ * tags: [indexer, scanner, incremental, filesystem]
8
+ * context:
9
+ * business_goal: Efficiently scan and index codebases with minimal re-processing
10
+ * domain: indexer-engine
11
+ */
12
+ import { createHash } from 'node:crypto';
13
+ import { readFileSync } from 'node:fs';
14
+ import { join } from 'node:path';
15
+ import { globSync } from 'glob';
16
+ import ignore from 'ignore';
17
+ function computeFileHash(content) {
18
+ return createHash('md5').update(content).digest('hex');
19
+ }
20
+ function loadGitignorePatterns(rootDir) {
21
+ const ig = ignore();
22
+ try {
23
+ const gitignoreContent = readFileSync(join(rootDir, '.gitignore'), 'utf-8');
24
+ ig.add(gitignoreContent);
25
+ }
26
+ catch {
27
+ // No .gitignore file, that's fine
28
+ }
29
+ return ig;
30
+ }
31
+ function collectFiles(rootDir, excludePatterns) {
32
+ const ig = loadGitignorePatterns(rootDir);
33
+ for (const pattern of excludePatterns) {
34
+ ig.add(pattern);
35
+ }
36
+ const allFiles = globSync('**/*', {
37
+ cwd: rootDir,
38
+ nodir: true,
39
+ dot: false,
40
+ absolute: false,
41
+ });
42
+ return allFiles.filter((f) => !ig.ignores(f));
43
+ }
44
+ export function createIndexer(parserRegistry, dbManager) {
45
+ function index(options) {
46
+ const { rootDir, exclude = ['node_modules', '.git', 'dist', 'build'], incremental = false, onProgress, } = options;
47
+ const startTime = Date.now();
48
+ const errors = [];
49
+ let totalEntities = 0;
50
+ let totalRelationships = 0;
51
+ const files = collectFiles(rootDir, exclude);
52
+ const parsableFiles = files.filter((f) => parserRegistry.canParse(f));
53
+ for (let i = 0; i < parsableFiles.length; i++) {
54
+ const relPath = parsableFiles[i];
55
+ const absPath = join(rootDir, relPath);
56
+ if (onProgress) {
57
+ onProgress({
58
+ totalFiles: parsableFiles.length,
59
+ processedFiles: i,
60
+ currentFile: relPath,
61
+ entitiesFound: totalEntities,
62
+ });
63
+ }
64
+ try {
65
+ const content = readFileSync(absPath, 'utf-8');
66
+ const fileHash = computeFileHash(content);
67
+ if (incremental) {
68
+ const existingHash = dbManager.getFileHash(relPath);
69
+ if (existingHash === fileHash) {
70
+ continue;
71
+ }
72
+ }
73
+ // Remove old entities for this file path
74
+ dbManager.deleteEntitiesByFilePath(relPath);
75
+ const results = parserRegistry.parse(absPath, content);
76
+ for (const result of results) {
77
+ const entityId = dbManager.insertEntity({
78
+ filePath: relPath,
79
+ name: result.name,
80
+ entityType: result.entityType,
81
+ description: result.metadata.description,
82
+ rawDocstring: result.rawDocstring,
83
+ signature: result.signature,
84
+ parent: result.parent,
85
+ language: result.language,
86
+ line: result.line,
87
+ column: result.column,
88
+ owner: result.metadata.owner,
89
+ status: result.metadata.status,
90
+ metadata: result.metadata,
91
+ tags: result.metadata.tags,
92
+ links: result.metadata.links,
93
+ fileHash,
94
+ });
95
+ // Handle dependency relationships from extended metadata
96
+ if ('dependencies' in result.metadata &&
97
+ result.metadata.dependencies) {
98
+ const deps = result.metadata.dependencies;
99
+ const allDeps = [
100
+ ...(deps.services ?? []),
101
+ ...(deps.external_apis ?? []),
102
+ ...(deps.databases ?? []),
103
+ ];
104
+ for (const dep of allDeps) {
105
+ // Store relationship by name - target may not exist yet
106
+ try {
107
+ dbManager.insertRelationship(entityId, dep, 'depends_on');
108
+ }
109
+ catch {
110
+ // Target may not exist, skip
111
+ }
112
+ }
113
+ totalRelationships += allDeps.length;
114
+ }
115
+ totalEntities++;
116
+ }
117
+ }
118
+ catch (err) {
119
+ errors.push({
120
+ filePath: relPath,
121
+ message: err instanceof Error ? err.message : String(err),
122
+ error: err,
123
+ });
124
+ }
125
+ }
126
+ if (onProgress) {
127
+ onProgress({
128
+ totalFiles: parsableFiles.length,
129
+ processedFiles: parsableFiles.length,
130
+ currentFile: '',
131
+ entitiesFound: totalEntities,
132
+ });
133
+ }
134
+ const duration = Date.now() - startTime;
135
+ return {
136
+ totalFiles: parsableFiles.length,
137
+ totalEntities,
138
+ totalRelationships,
139
+ errors,
140
+ duration,
141
+ };
142
+ }
143
+ return { index };
144
+ }
145
+ //# sourceMappingURL=indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../src/indexer/indexer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAe5B,SAAS,eAAe,CAAC,OAAe;IACtC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAe;IAC5C,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,gBAAgB,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;QAC5E,EAAE,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,YAAY,CACnB,OAAe,EACf,eAAkC;IAElC,MAAM,EAAE,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC1C,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE;QAChC,GAAG,EAAE,OAAO;QACZ,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,KAAK;QACV,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,cAA8B,EAC9B,SAA0B;IAI1B,SAAS,KAAK,CAAC,OAAuB;QACpC,MAAM,EACJ,OAAO,EACP,OAAO,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EACnD,WAAW,GAAG,KAAK,EACnB,UAAU,GACX,GAAG,OAAO,CAAC;QAEZ,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,kBAAkB,GAAG,CAAC,CAAC;QAE3B,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAEvC,IAAI,UAAU,EAAE,CAAC;gBACf,UAAU,CAAC;oBACT,UAAU,EAAE,aAAa,CAAC,MAAM;oBAChC,cAAc,EAAE,CAAC;oBACjB,WAAW,EAAE,OAAO;oBACpB,aAAa,EAAE,aAAa;iBAC7B,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC/C,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;gBAE1C,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,YAAY,GAAG,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;oBACpD,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;wBAC9B,SAAS;oBACX,CAAC;gBACH,CAAC;gBAED,yCAAyC;gBACzC,SAAS,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;gBAE5C,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAEvD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC7B,MAAM,QAAQ,GAAG,SAAS,CAAC,YAAY,CAAC;wBACtC,QAAQ,EAAE,OAAO;wBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,UAAU,EAAE,MAAM,CAAC,UAAU;wBAC7B,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;wBACxC,YAAY,EAAE,MAAM,CAAC,YAAY;wBACjC,SAAS,EAAE,MAAM,CAAC,SAAS;wBAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACzB,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK;wBAC5B,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;wBAC9B,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACzB,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;wBAC1B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK;wBAC5B,QAAQ;qBACT,CAAC,CAAC;oBAEH,yDAAyD;oBACzD,IACE,cAAc,IAAI,MAAM,CAAC,QAAQ;wBACjC,MAAM,CAAC,QAAQ,CAAC,YAAY,EAC5B,CAAC;wBACD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;wBAC1C,MAAM,OAAO,GAAG;4BACd,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;4BACxB,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;4BAC7B,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;yBAC1B,CAAC;wBACF,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;4BAC1B,wDAAwD;4BACxD,IAAI,CAAC;gCACH,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;4BAC5D,CAAC;4BAAC,MAAM,CAAC;gCACP,6BAA6B;4BAC/B,CAAC;wBACH,CAAC;wBACD,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;oBACvC,CAAC;oBAED,aAAa,EAAE,CAAC;gBAClB,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;oBACzD,KAAK,EAAE,GAAG;iBACX,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC;gBACT,UAAU,EAAE,aAAa,CAAC,MAAM;gBAChC,cAAc,EAAE,aAAa,CAAC,MAAM;gBACpC,WAAW,EAAE,EAAE;gBACf,aAAa,EAAE,aAAa;aAC7B,CAAC,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAExC,OAAO;YACL,UAAU,EAAE,aAAa,CAAC,MAAM;YAChC,aAAa;YACb,kBAAkB;YAClB,MAAM;YACN,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @knowgraph
3
+ * type: module
4
+ * description: SQLite schema definitions with FTS5 full-text search and relationship tables
5
+ * owner: knowgraph-core
6
+ * status: stable
7
+ * tags: [database, schema, sqlite, fts5]
8
+ * context:
9
+ * business_goal: Provide persistent storage schema for the code knowledge graph
10
+ * domain: indexer-engine
11
+ */
12
+ export declare const CREATE_TABLES_SQL = "\n CREATE TABLE IF NOT EXISTS entities (\n id TEXT PRIMARY KEY,\n file_path TEXT NOT NULL,\n name TEXT NOT NULL,\n entity_type TEXT NOT NULL,\n description TEXT NOT NULL,\n raw_docstring TEXT,\n signature TEXT,\n parent TEXT,\n language TEXT NOT NULL,\n line INTEGER NOT NULL,\n column_num INTEGER NOT NULL DEFAULT 0,\n owner TEXT,\n status TEXT,\n metadata_json TEXT NOT NULL,\n file_hash TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n\n CREATE TABLE IF NOT EXISTS relationships (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n source_id TEXT NOT NULL REFERENCES entities(id) ON DELETE CASCADE,\n target_id TEXT NOT NULL REFERENCES entities(id) ON DELETE CASCADE,\n relationship_type TEXT NOT NULL,\n UNIQUE(source_id, target_id, relationship_type)\n );\n\n CREATE TABLE IF NOT EXISTS tags (\n entity_id TEXT NOT NULL REFERENCES entities(id) ON DELETE CASCADE,\n tag TEXT NOT NULL,\n PRIMARY KEY (entity_id, tag)\n );\n\n CREATE TABLE IF NOT EXISTS links (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n entity_id TEXT NOT NULL REFERENCES entities(id) ON DELETE CASCADE,\n link_type TEXT,\n url TEXT NOT NULL,\n title TEXT\n );\n\n CREATE VIRTUAL TABLE IF NOT EXISTS entities_fts USING fts5(\n entity_id UNINDEXED,\n name, description, tags_text, owner\n );\n\n CREATE INDEX IF NOT EXISTS idx_entities_file_path ON entities(file_path);\n CREATE INDEX IF NOT EXISTS idx_entities_type ON entities(entity_type);\n CREATE INDEX IF NOT EXISTS idx_entities_owner ON entities(owner);\n CREATE INDEX IF NOT EXISTS idx_entities_status ON entities(status);\n CREATE INDEX IF NOT EXISTS idx_tags_tag ON tags(tag);\n CREATE INDEX IF NOT EXISTS idx_links_entity ON links(entity_id);\n CREATE INDEX IF NOT EXISTS idx_relationships_source ON relationships(source_id);\n CREATE INDEX IF NOT EXISTS idx_relationships_target ON relationships(target_id);\n";
13
+ export declare const INSERT_ENTITY_SQL = "\n INSERT INTO entities (\n id, file_path, name, entity_type, description, raw_docstring,\n signature, parent, language, line, column_num, owner, status,\n metadata_json, file_hash\n ) VALUES (\n @id, @file_path, @name, @entity_type, @description, @raw_docstring,\n @signature, @parent, @language, @line, @column_num, @owner, @status,\n @metadata_json, @file_hash\n )\n";
14
+ export declare const UPDATE_ENTITY_SQL = "\n UPDATE entities SET\n file_path = @file_path,\n name = @name,\n entity_type = @entity_type,\n description = @description,\n raw_docstring = @raw_docstring,\n signature = @signature,\n parent = @parent,\n language = @language,\n line = @line,\n column_num = @column_num,\n owner = @owner,\n status = @status,\n metadata_json = @metadata_json,\n file_hash = @file_hash,\n updated_at = datetime('now')\n WHERE id = @id\n";
15
+ export declare const INSERT_FTS_SQL = "\n INSERT INTO entities_fts (entity_id, name, description, tags_text, owner)\n VALUES (@entity_id, @name, @description, @tags_text, @owner)\n";
16
+ export declare const DELETE_FTS_BY_ENTITY_SQL = "\n DELETE FROM entities_fts WHERE entity_id = @entity_id\n";
17
+ export declare const DELETE_FTS_BY_FILE_SQL = "\n DELETE FROM entities_fts WHERE entity_id IN (\n SELECT id FROM entities WHERE file_path = @file_path\n )\n";
18
+ export declare const INSERT_RELATIONSHIP_SQL = "\n INSERT OR IGNORE INTO relationships (source_id, target_id, relationship_type)\n VALUES (@source_id, @target_id, @relationship_type)\n";
19
+ export declare const INSERT_TAG_SQL = "\n INSERT OR IGNORE INTO tags (entity_id, tag) VALUES (@entity_id, @tag)\n";
20
+ export declare const INSERT_LINK_SQL = "\n INSERT INTO links (entity_id, link_type, url, title)\n VALUES (@entity_id, @link_type, @url, @title)\n";
21
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/indexer/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iBAAiB,o+DAwD7B,CAAC;AAEF,eAAO,MAAM,iBAAiB,2YAU7B,CAAC;AAEF,eAAO,MAAM,iBAAiB,wdAkB7B,CAAC;AAEF,eAAO,MAAM,cAAc,oJAG1B,CAAC;AAEF,eAAO,MAAM,wBAAwB,gEAEpC,CAAC;AAEF,eAAO,MAAM,sBAAsB,uHAIlC,CAAC;AAEF,eAAO,MAAM,uBAAuB,+IAGnC,CAAC;AAEF,eAAO,MAAM,cAAc,gFAE1B,CAAC;AAEF,eAAO,MAAM,eAAe,gHAG3B,CAAC"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * @knowgraph
3
+ * type: module
4
+ * description: SQLite schema definitions with FTS5 full-text search and relationship tables
5
+ * owner: knowgraph-core
6
+ * status: stable
7
+ * tags: [database, schema, sqlite, fts5]
8
+ * context:
9
+ * business_goal: Provide persistent storage schema for the code knowledge graph
10
+ * domain: indexer-engine
11
+ */
12
+ export const CREATE_TABLES_SQL = `
13
+ CREATE TABLE IF NOT EXISTS entities (
14
+ id TEXT PRIMARY KEY,
15
+ file_path TEXT NOT NULL,
16
+ name TEXT NOT NULL,
17
+ entity_type TEXT NOT NULL,
18
+ description TEXT NOT NULL,
19
+ raw_docstring TEXT,
20
+ signature TEXT,
21
+ parent TEXT,
22
+ language TEXT NOT NULL,
23
+ line INTEGER NOT NULL,
24
+ column_num INTEGER NOT NULL DEFAULT 0,
25
+ owner TEXT,
26
+ status TEXT,
27
+ metadata_json TEXT NOT NULL,
28
+ file_hash TEXT,
29
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
30
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
31
+ );
32
+
33
+ CREATE TABLE IF NOT EXISTS relationships (
34
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
35
+ source_id TEXT NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
36
+ target_id TEXT NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
37
+ relationship_type TEXT NOT NULL,
38
+ UNIQUE(source_id, target_id, relationship_type)
39
+ );
40
+
41
+ CREATE TABLE IF NOT EXISTS tags (
42
+ entity_id TEXT NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
43
+ tag TEXT NOT NULL,
44
+ PRIMARY KEY (entity_id, tag)
45
+ );
46
+
47
+ CREATE TABLE IF NOT EXISTS links (
48
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
49
+ entity_id TEXT NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
50
+ link_type TEXT,
51
+ url TEXT NOT NULL,
52
+ title TEXT
53
+ );
54
+
55
+ CREATE VIRTUAL TABLE IF NOT EXISTS entities_fts USING fts5(
56
+ entity_id UNINDEXED,
57
+ name, description, tags_text, owner
58
+ );
59
+
60
+ CREATE INDEX IF NOT EXISTS idx_entities_file_path ON entities(file_path);
61
+ CREATE INDEX IF NOT EXISTS idx_entities_type ON entities(entity_type);
62
+ CREATE INDEX IF NOT EXISTS idx_entities_owner ON entities(owner);
63
+ CREATE INDEX IF NOT EXISTS idx_entities_status ON entities(status);
64
+ CREATE INDEX IF NOT EXISTS idx_tags_tag ON tags(tag);
65
+ CREATE INDEX IF NOT EXISTS idx_links_entity ON links(entity_id);
66
+ CREATE INDEX IF NOT EXISTS idx_relationships_source ON relationships(source_id);
67
+ CREATE INDEX IF NOT EXISTS idx_relationships_target ON relationships(target_id);
68
+ `;
69
+ export const INSERT_ENTITY_SQL = `
70
+ INSERT INTO entities (
71
+ id, file_path, name, entity_type, description, raw_docstring,
72
+ signature, parent, language, line, column_num, owner, status,
73
+ metadata_json, file_hash
74
+ ) VALUES (
75
+ @id, @file_path, @name, @entity_type, @description, @raw_docstring,
76
+ @signature, @parent, @language, @line, @column_num, @owner, @status,
77
+ @metadata_json, @file_hash
78
+ )
79
+ `;
80
+ export const UPDATE_ENTITY_SQL = `
81
+ UPDATE entities SET
82
+ file_path = @file_path,
83
+ name = @name,
84
+ entity_type = @entity_type,
85
+ description = @description,
86
+ raw_docstring = @raw_docstring,
87
+ signature = @signature,
88
+ parent = @parent,
89
+ language = @language,
90
+ line = @line,
91
+ column_num = @column_num,
92
+ owner = @owner,
93
+ status = @status,
94
+ metadata_json = @metadata_json,
95
+ file_hash = @file_hash,
96
+ updated_at = datetime('now')
97
+ WHERE id = @id
98
+ `;
99
+ export const INSERT_FTS_SQL = `
100
+ INSERT INTO entities_fts (entity_id, name, description, tags_text, owner)
101
+ VALUES (@entity_id, @name, @description, @tags_text, @owner)
102
+ `;
103
+ export const DELETE_FTS_BY_ENTITY_SQL = `
104
+ DELETE FROM entities_fts WHERE entity_id = @entity_id
105
+ `;
106
+ export const DELETE_FTS_BY_FILE_SQL = `
107
+ DELETE FROM entities_fts WHERE entity_id IN (
108
+ SELECT id FROM entities WHERE file_path = @file_path
109
+ )
110
+ `;
111
+ export const INSERT_RELATIONSHIP_SQL = `
112
+ INSERT OR IGNORE INTO relationships (source_id, target_id, relationship_type)
113
+ VALUES (@source_id, @target_id, @relationship_type)
114
+ `;
115
+ export const INSERT_TAG_SQL = `
116
+ INSERT OR IGNORE INTO tags (entity_id, tag) VALUES (@entity_id, @tag)
117
+ `;
118
+ export const INSERT_LINK_SQL = `
119
+ INSERT INTO links (entity_id, link_type, url, title)
120
+ VALUES (@entity_id, @link_type, @url, @title)
121
+ `;
122
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/indexer/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwDhC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;CAUhC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;CAkBhC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG;;;CAG7B,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG;;CAEvC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;CAIrC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG;;;CAGtC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG;;CAE7B,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG;;;CAG9B,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * @knowgraph
3
+ * type: interface
4
+ * description: Type definitions for stored entities, index operations, and progress tracking
5
+ * owner: knowgraph-core
6
+ * status: stable
7
+ * tags: [indexer, types, interface, storage]
8
+ * context:
9
+ * business_goal: Define contracts for the indexing and storage layer
10
+ * domain: indexer-engine
11
+ */
12
+ import type { CoreMetadata, EntityType, ExtendedMetadata, Link, Status } from '../types/index.js';
13
+ export interface StoredEntity {
14
+ readonly id: string;
15
+ readonly filePath: string;
16
+ readonly name: string;
17
+ readonly entityType: EntityType;
18
+ readonly description: string;
19
+ readonly rawDocstring: string | null;
20
+ readonly signature: string | null;
21
+ readonly parent: string | null;
22
+ readonly language: string;
23
+ readonly line: number;
24
+ readonly column: number;
25
+ readonly owner: string | null;
26
+ readonly status: Status | null;
27
+ readonly metadata: CoreMetadata | ExtendedMetadata;
28
+ readonly tags: readonly string[];
29
+ readonly links: readonly Link[];
30
+ readonly fileHash: string | null;
31
+ readonly createdAt: string;
32
+ readonly updatedAt: string;
33
+ }
34
+ export interface EntityInsert {
35
+ readonly filePath: string;
36
+ readonly name: string;
37
+ readonly entityType: EntityType;
38
+ readonly description: string;
39
+ readonly rawDocstring?: string;
40
+ readonly signature?: string;
41
+ readonly parent?: string;
42
+ readonly language: string;
43
+ readonly line: number;
44
+ readonly column: number;
45
+ readonly owner?: string;
46
+ readonly status?: Status;
47
+ readonly metadata: CoreMetadata | ExtendedMetadata;
48
+ readonly tags?: readonly string[];
49
+ readonly links?: readonly Link[];
50
+ readonly fileHash?: string;
51
+ }
52
+ export interface IndexStats {
53
+ readonly totalEntities: number;
54
+ readonly totalRelationships: number;
55
+ readonly totalTags: number;
56
+ readonly totalLinks: number;
57
+ readonly entitiesByType: Readonly<Record<string, number>>;
58
+ readonly entitiesByLanguage: Readonly<Record<string, number>>;
59
+ }
60
+ export interface IndexerOptions {
61
+ readonly rootDir: string;
62
+ readonly outputDir?: string;
63
+ readonly exclude?: readonly string[];
64
+ readonly incremental?: boolean;
65
+ readonly onProgress?: (progress: IndexProgress) => void;
66
+ }
67
+ export interface IndexProgress {
68
+ readonly totalFiles: number;
69
+ readonly processedFiles: number;
70
+ readonly currentFile: string;
71
+ readonly entitiesFound: number;
72
+ }
73
+ export interface IndexResult {
74
+ readonly totalFiles: number;
75
+ readonly totalEntities: number;
76
+ readonly totalRelationships: number;
77
+ readonly errors: readonly IndexError[];
78
+ readonly duration: number;
79
+ }
80
+ export interface IndexError {
81
+ readonly filePath: string;
82
+ readonly message: string;
83
+ readonly error?: unknown;
84
+ }
85
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/indexer/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/indexer/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { Parser } from './types.js';
2
+ export declare function createGenericParser(): Parser;
3
+ //# sourceMappingURL=generic-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/generic-parser.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAsGzC,wBAAgB,mBAAmB,IAAI,MAAM,CA0E5C"}
@@ -0,0 +1,150 @@
1
+ import { extractMetadata } from './metadata-extractor.js';
2
+ /**
3
+ * Regex for block comments: /* ... * / or """ ... """
4
+ */
5
+ const BLOCK_COMMENT_REGEX = /\/\*[\s\S]*?\*\/|"""[\s\S]*?"""|'''[\s\S]*?'''/g;
6
+ /**
7
+ * Regex for consecutive single-line comments (# or //)
8
+ */
9
+ const SINGLE_LINE_COMMENT_GROUP_REGEX = /(?:^[ \t]*(?:\/\/|#).*\n?)+/gm;
10
+ function getLineNumber(source, charIndex) {
11
+ let line = 1;
12
+ for (let i = 0; i < charIndex && i < source.length; i++) {
13
+ if (source[i] === '\n') {
14
+ line++;
15
+ }
16
+ }
17
+ return line;
18
+ }
19
+ function stripBlockComment(raw) {
20
+ // Handle /* ... */
21
+ if (raw.startsWith('/*') && raw.endsWith('*/')) {
22
+ const inner = raw.slice(2, -2);
23
+ return inner
24
+ .split('\n')
25
+ .map((line) => line.replace(/^\s*\*\s?/, ''))
26
+ .join('\n')
27
+ .trim();
28
+ }
29
+ // Handle """ ... """ or ''' ... '''
30
+ if ((raw.startsWith('"""') && raw.endsWith('"""')) ||
31
+ (raw.startsWith("'''") && raw.endsWith("'''"))) {
32
+ return raw.slice(3, -3).trim();
33
+ }
34
+ return raw;
35
+ }
36
+ function stripLineComments(raw) {
37
+ return raw
38
+ .split('\n')
39
+ .map((line) => {
40
+ const trimmed = line.trimStart();
41
+ if (trimmed.startsWith('//')) {
42
+ return trimmed.slice(2).trimStart();
43
+ }
44
+ if (trimmed.startsWith('#')) {
45
+ return trimmed.slice(1).trimStart();
46
+ }
47
+ return trimmed;
48
+ })
49
+ .join('\n')
50
+ .trim();
51
+ }
52
+ function getModuleName(filePath) {
53
+ const parts = filePath.split('/');
54
+ const fileName = parts[parts.length - 1] ?? '';
55
+ // Remove any extension
56
+ const dotIndex = fileName.lastIndexOf('.');
57
+ return dotIndex > 0 ? fileName.slice(0, dotIndex) : fileName;
58
+ }
59
+ function getLanguageFromPath(filePath) {
60
+ const ext = filePath.slice(filePath.lastIndexOf('.'));
61
+ const languageMap = {
62
+ '.py': 'python',
63
+ '.pyi': 'python',
64
+ '.ts': 'typescript',
65
+ '.tsx': 'typescript',
66
+ '.js': 'javascript',
67
+ '.jsx': 'javascript',
68
+ '.rb': 'ruby',
69
+ '.go': 'go',
70
+ '.rs': 'rust',
71
+ '.java': 'java',
72
+ '.kt': 'kotlin',
73
+ '.swift': 'swift',
74
+ '.c': 'c',
75
+ '.cpp': 'cpp',
76
+ '.h': 'c',
77
+ '.hpp': 'cpp',
78
+ '.cs': 'csharp',
79
+ '.php': 'php',
80
+ '.sh': 'shell',
81
+ '.bash': 'shell',
82
+ '.zsh': 'shell',
83
+ '.lua': 'lua',
84
+ '.r': 'r',
85
+ '.R': 'r',
86
+ '.scala': 'scala',
87
+ '.ex': 'elixir',
88
+ '.exs': 'elixir',
89
+ };
90
+ return languageMap[ext] ?? 'unknown';
91
+ }
92
+ export function createGenericParser() {
93
+ return {
94
+ name: 'generic',
95
+ supportedExtensions: [],
96
+ parse(content, filePath) {
97
+ const results = [];
98
+ const language = getLanguageFromPath(filePath);
99
+ // Find block comments
100
+ const blockRegex = new RegExp(BLOCK_COMMENT_REGEX.source, 'g');
101
+ let match;
102
+ while ((match = blockRegex.exec(content)) !== null) {
103
+ const stripped = stripBlockComment(match[0]);
104
+ if (!stripped.includes('@knowgraph') &&
105
+ !stripped.includes('knowgraph:')) {
106
+ continue;
107
+ }
108
+ const startLine = getLineNumber(content, match.index);
109
+ const extraction = extractMetadata(stripped, startLine);
110
+ if (extraction.metadata) {
111
+ results.push({
112
+ name: getModuleName(filePath),
113
+ filePath,
114
+ line: startLine,
115
+ column: 1,
116
+ language,
117
+ entityType: extraction.metadata.type,
118
+ metadata: extraction.metadata,
119
+ rawDocstring: stripped,
120
+ });
121
+ }
122
+ }
123
+ // Find groups of single-line comments
124
+ const lineRegex = new RegExp(SINGLE_LINE_COMMENT_GROUP_REGEX.source, 'gm');
125
+ while ((match = lineRegex.exec(content)) !== null) {
126
+ const stripped = stripLineComments(match[0]);
127
+ if (!stripped.includes('@knowgraph') &&
128
+ !stripped.includes('knowgraph:')) {
129
+ continue;
130
+ }
131
+ const startLine = getLineNumber(content, match.index);
132
+ const extraction = extractMetadata(stripped, startLine);
133
+ if (extraction.metadata) {
134
+ results.push({
135
+ name: getModuleName(filePath),
136
+ filePath,
137
+ line: startLine,
138
+ column: 1,
139
+ language,
140
+ entityType: extraction.metadata.type,
141
+ metadata: extraction.metadata,
142
+ rawDocstring: stripped,
143
+ });
144
+ }
145
+ }
146
+ return results;
147
+ },
148
+ };
149
+ }
150
+ //# sourceMappingURL=generic-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic-parser.js","sourceRoot":"","sources":["../../src/parsers/generic-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Parser } from './types.js';
2
+ export declare function createGoParser(): Parser;
3
+ //# sourceMappingURL=go-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/go-parser.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAyTzC,wBAAgB,cAAc,IAAI,MAAM,CAuOvC"}