@ai-agent-context/core 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 (236) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +285 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/adapters/filesystem/fs-adapter.d.ts +50 -0
  5. package/dist/adapters/filesystem/fs-adapter.d.ts.map +1 -0
  6. package/dist/adapters/filesystem/fs-adapter.js +168 -0
  7. package/dist/adapters/filesystem/fs-adapter.js.map +1 -0
  8. package/dist/adapters/filesystem/sensitive.d.ts +26 -0
  9. package/dist/adapters/filesystem/sensitive.d.ts.map +1 -0
  10. package/dist/adapters/filesystem/sensitive.js +67 -0
  11. package/dist/adapters/filesystem/sensitive.js.map +1 -0
  12. package/dist/adapters/git/git-adapter.d.ts +47 -0
  13. package/dist/adapters/git/git-adapter.d.ts.map +1 -0
  14. package/dist/adapters/git/git-adapter.js +109 -0
  15. package/dist/adapters/git/git-adapter.js.map +1 -0
  16. package/dist/adapters/language/json/adapter.d.ts +24 -0
  17. package/dist/adapters/language/json/adapter.d.ts.map +1 -0
  18. package/dist/adapters/language/json/adapter.js +54 -0
  19. package/dist/adapters/language/json/adapter.js.map +1 -0
  20. package/dist/adapters/language/markdown/adapter.d.ts +41 -0
  21. package/dist/adapters/language/markdown/adapter.d.ts.map +1 -0
  22. package/dist/adapters/language/markdown/adapter.js +124 -0
  23. package/dist/adapters/language/markdown/adapter.js.map +1 -0
  24. package/dist/adapters/language/package-json/adapter.d.ts +47 -0
  25. package/dist/adapters/language/package-json/adapter.d.ts.map +1 -0
  26. package/dist/adapters/language/package-json/adapter.js +153 -0
  27. package/dist/adapters/language/package-json/adapter.js.map +1 -0
  28. package/dist/adapters/language/registry.d.ts +35 -0
  29. package/dist/adapters/language/registry.d.ts.map +1 -0
  30. package/dist/adapters/language/registry.js +79 -0
  31. package/dist/adapters/language/registry.js.map +1 -0
  32. package/dist/adapters/language/ts-js/adapter.d.ts +14 -0
  33. package/dist/adapters/language/ts-js/adapter.d.ts.map +1 -0
  34. package/dist/adapters/language/ts-js/adapter.js +59 -0
  35. package/dist/adapters/language/ts-js/adapter.js.map +1 -0
  36. package/dist/adapters/language/ts-js/extractor.d.ts +21 -0
  37. package/dist/adapters/language/ts-js/extractor.d.ts.map +1 -0
  38. package/dist/adapters/language/ts-js/extractor.js +779 -0
  39. package/dist/adapters/language/ts-js/extractor.js.map +1 -0
  40. package/dist/adapters/language/ts-js/lexer.d.ts +30 -0
  41. package/dist/adapters/language/ts-js/lexer.d.ts.map +1 -0
  42. package/dist/adapters/language/ts-js/lexer.js +446 -0
  43. package/dist/adapters/language/ts-js/lexer.js.map +1 -0
  44. package/dist/adapters/language/ts-js/package-signals.d.ts +5 -0
  45. package/dist/adapters/language/ts-js/package-signals.d.ts.map +1 -0
  46. package/dist/adapters/language/ts-js/package-signals.js +113 -0
  47. package/dist/adapters/language/ts-js/package-signals.js.map +1 -0
  48. package/dist/adapters/language/tsconfig/adapter.d.ts +38 -0
  49. package/dist/adapters/language/tsconfig/adapter.d.ts.map +1 -0
  50. package/dist/adapters/language/tsconfig/adapter.js +130 -0
  51. package/dist/adapters/language/tsconfig/adapter.js.map +1 -0
  52. package/dist/adapters/language/types.d.ts +152 -0
  53. package/dist/adapters/language/types.d.ts.map +1 -0
  54. package/dist/adapters/language/types.js +51 -0
  55. package/dist/adapters/language/types.js.map +1 -0
  56. package/dist/agent-context.d.ts +122 -0
  57. package/dist/agent-context.d.ts.map +1 -0
  58. package/dist/agent-context.js +243 -0
  59. package/dist/agent-context.js.map +1 -0
  60. package/dist/config/defaults.d.ts +13 -0
  61. package/dist/config/defaults.d.ts.map +1 -0
  62. package/dist/config/defaults.js +98 -0
  63. package/dist/config/defaults.js.map +1 -0
  64. package/dist/config/load.d.ts +25 -0
  65. package/dist/config/load.d.ts.map +1 -0
  66. package/dist/config/load.js +106 -0
  67. package/dist/config/load.js.map +1 -0
  68. package/dist/config/types.d.ts +95 -0
  69. package/dist/config/types.d.ts.map +1 -0
  70. package/dist/config/types.js +8 -0
  71. package/dist/config/types.js.map +1 -0
  72. package/dist/config/validate.d.ts +15 -0
  73. package/dist/config/validate.d.ts.map +1 -0
  74. package/dist/config/validate.js +202 -0
  75. package/dist/config/validate.js.map +1 -0
  76. package/dist/core/architecture/detector.d.ts +10 -0
  77. package/dist/core/architecture/detector.d.ts.map +1 -0
  78. package/dist/core/architecture/detector.js +37 -0
  79. package/dist/core/architecture/detector.js.map +1 -0
  80. package/dist/core/architecture/entry-points.d.ts +20 -0
  81. package/dist/core/architecture/entry-points.d.ts.map +1 -0
  82. package/dist/core/architecture/entry-points.js +190 -0
  83. package/dist/core/architecture/entry-points.js.map +1 -0
  84. package/dist/core/architecture/role-detector.d.ts +32 -0
  85. package/dist/core/architecture/role-detector.d.ts.map +1 -0
  86. package/dist/core/architecture/role-detector.js +240 -0
  87. package/dist/core/architecture/role-detector.js.map +1 -0
  88. package/dist/core/context/explain.d.ts +36 -0
  89. package/dist/core/context/explain.d.ts.map +1 -0
  90. package/dist/core/context/explain.js +199 -0
  91. package/dist/core/context/explain.js.map +1 -0
  92. package/dist/core/context/repository-context.d.ts +16 -0
  93. package/dist/core/context/repository-context.d.ts.map +1 -0
  94. package/dist/core/context/repository-context.js +134 -0
  95. package/dist/core/context/repository-context.js.map +1 -0
  96. package/dist/core/context/types.d.ts +94 -0
  97. package/dist/core/context/types.d.ts.map +1 -0
  98. package/dist/core/context/types.js +2 -0
  99. package/dist/core/context/types.js.map +1 -0
  100. package/dist/core/conventions/detector.d.ts +55 -0
  101. package/dist/core/conventions/detector.d.ts.map +1 -0
  102. package/dist/core/conventions/detector.js +438 -0
  103. package/dist/core/conventions/detector.js.map +1 -0
  104. package/dist/core/conventions/renderer.d.ts +16 -0
  105. package/dist/core/conventions/renderer.d.ts.map +1 -0
  106. package/dist/core/conventions/renderer.js +42 -0
  107. package/dist/core/conventions/renderer.js.map +1 -0
  108. package/dist/core/decisions/detector.d.ts +45 -0
  109. package/dist/core/decisions/detector.d.ts.map +1 -0
  110. package/dist/core/decisions/detector.js +256 -0
  111. package/dist/core/decisions/detector.js.map +1 -0
  112. package/dist/core/diff/differ.d.ts +26 -0
  113. package/dist/core/diff/differ.d.ts.map +1 -0
  114. package/dist/core/diff/differ.js +159 -0
  115. package/dist/core/diff/differ.js.map +1 -0
  116. package/dist/core/git-analysis/activity.d.ts +35 -0
  117. package/dist/core/git-analysis/activity.d.ts.map +1 -0
  118. package/dist/core/git-analysis/activity.js +123 -0
  119. package/dist/core/git-analysis/activity.js.map +1 -0
  120. package/dist/core/graph/aliases.d.ts +20 -0
  121. package/dist/core/graph/aliases.d.ts.map +1 -0
  122. package/dist/core/graph/aliases.js +99 -0
  123. package/dist/core/graph/aliases.js.map +1 -0
  124. package/dist/core/graph/knowledge-graph.d.ts +91 -0
  125. package/dist/core/graph/knowledge-graph.d.ts.map +1 -0
  126. package/dist/core/graph/knowledge-graph.js +572 -0
  127. package/dist/core/graph/knowledge-graph.js.map +1 -0
  128. package/dist/core/graph/modules.d.ts +28 -0
  129. package/dist/core/graph/modules.d.ts.map +1 -0
  130. package/dist/core/graph/modules.js +139 -0
  131. package/dist/core/graph/modules.js.map +1 -0
  132. package/dist/core/graph/resolver.d.ts +50 -0
  133. package/dist/core/graph/resolver.d.ts.map +1 -0
  134. package/dist/core/graph/resolver.js +180 -0
  135. package/dist/core/graph/resolver.js.map +1 -0
  136. package/dist/core/scanner/cache.d.ts +49 -0
  137. package/dist/core/scanner/cache.d.ts.map +1 -0
  138. package/dist/core/scanner/cache.js +101 -0
  139. package/dist/core/scanner/cache.js.map +1 -0
  140. package/dist/core/scanner/scanner.d.ts +60 -0
  141. package/dist/core/scanner/scanner.d.ts.map +1 -0
  142. package/dist/core/scanner/scanner.js +304 -0
  143. package/dist/core/scanner/scanner.js.map +1 -0
  144. package/dist/core/scanner/types.d.ts +47 -0
  145. package/dist/core/scanner/types.d.ts.map +1 -0
  146. package/dist/core/scanner/types.js +18 -0
  147. package/dist/core/scanner/types.js.map +1 -0
  148. package/dist/core/search/analyzer.d.ts +16 -0
  149. package/dist/core/search/analyzer.d.ts.map +1 -0
  150. package/dist/core/search/analyzer.js +165 -0
  151. package/dist/core/search/analyzer.js.map +1 -0
  152. package/dist/core/search/bm25.d.ts +21 -0
  153. package/dist/core/search/bm25.d.ts.map +1 -0
  154. package/dist/core/search/bm25.js +108 -0
  155. package/dist/core/search/bm25.js.map +1 -0
  156. package/dist/core/search/documents.d.ts +20 -0
  157. package/dist/core/search/documents.d.ts.map +1 -0
  158. package/dist/core/search/documents.js +106 -0
  159. package/dist/core/search/documents.js.map +1 -0
  160. package/dist/core/search/service.d.ts +30 -0
  161. package/dist/core/search/service.d.ts.map +1 -0
  162. package/dist/core/search/service.js +54 -0
  163. package/dist/core/search/service.js.map +1 -0
  164. package/dist/core/search/types.d.ts +44 -0
  165. package/dist/core/search/types.d.ts.map +1 -0
  166. package/dist/core/search/types.js +2 -0
  167. package/dist/core/search/types.js.map +1 -0
  168. package/dist/core/serialization/documents.d.ts +26 -0
  169. package/dist/core/serialization/documents.d.ts.map +1 -0
  170. package/dist/core/serialization/documents.js +224 -0
  171. package/dist/core/serialization/documents.js.map +1 -0
  172. package/dist/core/serialization/reader.d.ts +22 -0
  173. package/dist/core/serialization/reader.d.ts.map +1 -0
  174. package/dist/core/serialization/reader.js +65 -0
  175. package/dist/core/serialization/reader.js.map +1 -0
  176. package/dist/core/serialization/types.d.ts +184 -0
  177. package/dist/core/serialization/types.d.ts.map +1 -0
  178. package/dist/core/serialization/types.js +2 -0
  179. package/dist/core/serialization/types.js.map +1 -0
  180. package/dist/core/serialization/writer.d.ts +17 -0
  181. package/dist/core/serialization/writer.d.ts.map +1 -0
  182. package/dist/core/serialization/writer.js +64 -0
  183. package/dist/core/serialization/writer.js.map +1 -0
  184. package/dist/core/workspace/package-facts.d.ts +12 -0
  185. package/dist/core/workspace/package-facts.d.ts.map +1 -0
  186. package/dist/core/workspace/package-facts.js +50 -0
  187. package/dist/core/workspace/package-facts.js.map +1 -0
  188. package/dist/core/workspace/workspace.d.ts +32 -0
  189. package/dist/core/workspace/workspace.d.ts.map +1 -0
  190. package/dist/core/workspace/workspace.js +167 -0
  191. package/dist/core/workspace/workspace.js.map +1 -0
  192. package/dist/errors.d.ts +50 -0
  193. package/dist/errors.d.ts.map +1 -0
  194. package/dist/errors.js +64 -0
  195. package/dist/errors.js.map +1 -0
  196. package/dist/index.d.ts +80 -0
  197. package/dist/index.d.ts.map +1 -0
  198. package/dist/index.js +66 -0
  199. package/dist/index.js.map +1 -0
  200. package/dist/logging/diagnostics.d.ts +64 -0
  201. package/dist/logging/diagnostics.d.ts.map +1 -0
  202. package/dist/logging/diagnostics.js +92 -0
  203. package/dist/logging/diagnostics.js.map +1 -0
  204. package/dist/model/canonical.d.ts +24 -0
  205. package/dist/model/canonical.d.ts.map +1 -0
  206. package/dist/model/canonical.js +69 -0
  207. package/dist/model/canonical.js.map +1 -0
  208. package/dist/model/schema.d.ts +37 -0
  209. package/dist/model/schema.d.ts.map +1 -0
  210. package/dist/model/schema.js +42 -0
  211. package/dist/model/schema.js.map +1 -0
  212. package/dist/model/types.d.ts +402 -0
  213. package/dist/model/types.d.ts.map +1 -0
  214. package/dist/model/types.js +10 -0
  215. package/dist/model/types.js.map +1 -0
  216. package/dist/pipeline/scan-pipeline.d.ts +69 -0
  217. package/dist/pipeline/scan-pipeline.d.ts.map +1 -0
  218. package/dist/pipeline/scan-pipeline.js +270 -0
  219. package/dist/pipeline/scan-pipeline.js.map +1 -0
  220. package/dist/util/concurrency.d.ts +17 -0
  221. package/dist/util/concurrency.d.ts.map +1 -0
  222. package/dist/util/concurrency.js +46 -0
  223. package/dist/util/concurrency.js.map +1 -0
  224. package/dist/util/glob.d.ts +26 -0
  225. package/dist/util/glob.d.ts.map +1 -0
  226. package/dist/util/glob.js +198 -0
  227. package/dist/util/glob.js.map +1 -0
  228. package/dist/util/paths.d.ts +23 -0
  229. package/dist/util/paths.d.ts.map +1 -0
  230. package/dist/util/paths.js +115 -0
  231. package/dist/util/paths.js.map +1 -0
  232. package/dist/util/text.d.ts +22 -0
  233. package/dist/util/text.d.ts.map +1 -0
  234. package/dist/util/text.js +66 -0
  235. package/dist/util/text.js.map +1 -0
  236. package/package.json +52 -0
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Markdown adapter.
3
+ *
4
+ * Markdown is where repositories already document their conventions, decisions
5
+ * and architecture. The adapter extracts structure (headings, links, section
6
+ * positions) so that the decision and convention detectors can attach evidence
7
+ * to real documents instead of guessing.
8
+ */
9
+ import { createParsedFile } from "../types.js";
10
+ export function extractHeadings(contents) {
11
+ const headings = [];
12
+ const lines = contents.split('\n');
13
+ let inFence = false;
14
+ for (let index = 0; index < lines.length; index += 1) {
15
+ const line = lines[index];
16
+ if (/^\s*(```|~~~)/.test(line)) {
17
+ inFence = !inFence;
18
+ continue;
19
+ }
20
+ if (inFence)
21
+ continue;
22
+ const match = /^(#{1,6})\s+(.*)$/.exec(line);
23
+ if (match === null)
24
+ continue;
25
+ const title = match[2].replace(/[#\s]+$/, '').trim();
26
+ headings.push({
27
+ level: match[1].length,
28
+ title,
29
+ line: index + 1,
30
+ normalized: title.toLowerCase(),
31
+ });
32
+ }
33
+ return headings;
34
+ }
35
+ export function extractMarkdownLinks(contents) {
36
+ const links = [];
37
+ const lines = contents.split('\n');
38
+ for (let index = 0; index < lines.length; index += 1) {
39
+ const line = lines[index];
40
+ const pattern = /\[([^\]]{0,120})\]\(([^)\s]{1,400})\)/g;
41
+ let match = pattern.exec(line);
42
+ while (match !== null) {
43
+ links.push({ text: match[1], target: match[2], line: index + 1 });
44
+ match = pattern.exec(line);
45
+ }
46
+ }
47
+ return links;
48
+ }
49
+ /** First non-empty paragraph after the front matter, used as a short excerpt. */
50
+ export function firstParagraph(contents) {
51
+ const body = stripFrontMatter(contents);
52
+ const lines = body.split('\n');
53
+ const collected = [];
54
+ for (const line of lines) {
55
+ const trimmed = line.trim();
56
+ if (trimmed.startsWith('#') || trimmed.startsWith('---') || trimmed.startsWith('|')) {
57
+ if (collected.length > 0)
58
+ break;
59
+ continue;
60
+ }
61
+ if (trimmed.length === 0) {
62
+ if (collected.length > 0)
63
+ break;
64
+ continue;
65
+ }
66
+ collected.push(trimmed);
67
+ }
68
+ return collected.join(' ').slice(0, 480);
69
+ }
70
+ /** Removes a YAML front matter block, when present. */
71
+ export function stripFrontMatter(contents) {
72
+ if (!contents.startsWith('---'))
73
+ return contents;
74
+ const end = contents.indexOf('\n---', 3);
75
+ if (end === -1)
76
+ return contents;
77
+ return contents.slice(end + 4);
78
+ }
79
+ export function extractFrontMatter(contents) {
80
+ const result = {};
81
+ if (!contents.startsWith('---'))
82
+ return result;
83
+ const end = contents.indexOf('\n---', 3);
84
+ if (end === -1)
85
+ return result;
86
+ const block = contents.slice(3, end);
87
+ for (const line of block.split('\n')) {
88
+ const match = /^([A-Za-z0-9_-]+)\s*:\s*(.*)$/.exec(line.trim());
89
+ if (match === null)
90
+ continue;
91
+ result[match[1].toLowerCase()] = match[2].trim().replace(/^["']|["']$/g, '');
92
+ }
93
+ return result;
94
+ }
95
+ export class MarkdownAdapter {
96
+ id = 'markdown';
97
+ displayName = 'Markdown';
98
+ languageIds = ['markdown', 'md'];
99
+ alwaysEnabled = true;
100
+ handles(file) {
101
+ return file.extension === '.md' || file.extension === '.mdx' || file.extension === '.markdown';
102
+ }
103
+ parse(input) {
104
+ const headings = extractHeadings(input.contents);
105
+ const links = extractMarkdownLinks(input.contents);
106
+ const frontMatter = extractFrontMatter(input.contents);
107
+ const documentLinks = links
108
+ .map((link) => link.target)
109
+ .filter((target) => target.endsWith('.md') && !/^https?:/i.test(target));
110
+ return createParsedFile(input.path, 'markdown', {
111
+ signals: headings.some((heading) => /decision|architecture|adr/.test(heading.normalized)) ? ['docs:decisions'] : [],
112
+ metadata: {
113
+ 'markdown.headings': headings.map((heading) => heading.title),
114
+ 'markdown.headingDetails': headings,
115
+ 'markdown.title': headings[0]?.title ?? '',
116
+ 'markdown.documentLinks': [...new Set(documentLinks)].sort(),
117
+ 'markdown.frontMatter': frontMatter,
118
+ 'markdown.firstParagraph': firstParagraph(input.contents),
119
+ 'markdown.lineCount': input.contents.split('\n').length,
120
+ },
121
+ });
122
+ }
123
+ }
124
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../src/adapters/language/markdown/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * `package.json` adapter — declared structural facts.
3
+ *
4
+ * Everything extracted here is *declared by the repository*, not inferred, so it
5
+ * is reported with the high `declared` confidence: entry fields, scripts, runtime
6
+ * and development dependencies, workspaces, module format.
7
+ */
8
+ import { type FileDescriptor, type LanguageAdapter, type ParsedFile } from '../types.ts';
9
+ export interface PackageEntryField {
10
+ field: 'main' | 'module' | 'types' | 'browser' | 'exports' | 'bin';
11
+ value: string;
12
+ }
13
+ export interface PackageFacts {
14
+ name: string | null;
15
+ version: string | null;
16
+ private: boolean;
17
+ type: 'module' | 'commonjs' | null;
18
+ scripts: Record<string, string>;
19
+ dependencies: string[];
20
+ devDependencies: string[];
21
+ peerDependencies: string[];
22
+ workspaces: string[];
23
+ entries: PackageEntryField[];
24
+ packageManager: string | null;
25
+ }
26
+ /**
27
+ * Flattens the `exports` field into string paths.
28
+ *
29
+ * Only shapes that map to files are kept (`".": "./dist/index.js"`, condition
30
+ * maps, wildcard subpaths) — they still describe a published boundary.
31
+ */
32
+ export declare function flattenExports(value: unknown): string[];
33
+ export declare class PackageJsonAdapter implements LanguageAdapter {
34
+ readonly id = "package-json";
35
+ readonly displayName = "package.json";
36
+ readonly languageIds: readonly string[];
37
+ readonly alwaysEnabled = true;
38
+ handles(file: FileDescriptor): boolean;
39
+ parse(input: {
40
+ path: string;
41
+ language: string;
42
+ contents: string;
43
+ }): ParsedFile;
44
+ }
45
+ /** Normalizes a raw package.json object into {@link PackageFacts}. */
46
+ export declare function readPackageFacts(raw: Record<string, unknown>): PackageFacts;
47
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/adapters/language/package-json/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAoB,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAI3G,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,KAAK,CAAC;IACnE,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,IAAI,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAgBD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAiBvD;AAED,qBAAa,kBAAmB,YAAW,eAAe;IACxD,QAAQ,CAAC,EAAE,kBAAkB;IAC7B,QAAQ,CAAC,WAAW,kBAAkB;IACtC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAY;IACnD,QAAQ,CAAC,aAAa,QAAQ;IAE9B,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO;IAItC,KAAK,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,UAAU;CAuC/E;AAED,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CA+C3E"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * `package.json` adapter — declared structural facts.
3
+ *
4
+ * Everything extracted here is *declared by the repository*, not inferred, so it
5
+ * is reported with the high `declared` confidence: entry fields, scripts, runtime
6
+ * and development dependencies, workspaces, module format.
7
+ */
8
+ import { createParsedFile } from "../types.js";
9
+ import { isPlainObject, stripJsonPreamble } from "../json/adapter.js";
10
+ import { PACKAGE_ENTRY_FIELDS } from "../../../config/defaults.js";
11
+ function stringRecord(value) {
12
+ if (!isPlainObject(value))
13
+ return {};
14
+ const result = {};
15
+ for (const [key, entry] of Object.entries(value)) {
16
+ if (typeof entry === 'string')
17
+ result[key] = entry;
18
+ }
19
+ return result;
20
+ }
21
+ function dependencyNames(value) {
22
+ if (!isPlainObject(value))
23
+ return [];
24
+ return Object.keys(value).sort();
25
+ }
26
+ /**
27
+ * Flattens the `exports` field into string paths.
28
+ *
29
+ * Only shapes that map to files are kept (`".": "./dist/index.js"`, condition
30
+ * maps, wildcard subpaths) — they still describe a published boundary.
31
+ */
32
+ export function flattenExports(value) {
33
+ const result = [];
34
+ const visit = (node) => {
35
+ if (typeof node === 'string') {
36
+ result.push(node);
37
+ return;
38
+ }
39
+ if (Array.isArray(node)) {
40
+ for (const entry of node)
41
+ visit(entry);
42
+ return;
43
+ }
44
+ if (isPlainObject(node)) {
45
+ for (const key of Object.keys(node).sort())
46
+ visit(node[key]);
47
+ }
48
+ };
49
+ visit(value);
50
+ return [...new Set(result)];
51
+ }
52
+ export class PackageJsonAdapter {
53
+ id = 'package-json';
54
+ displayName = 'package.json';
55
+ languageIds = ['json'];
56
+ alwaysEnabled = true;
57
+ handles(file) {
58
+ return file.basename === 'package.json';
59
+ }
60
+ parse(input) {
61
+ let raw;
62
+ try {
63
+ const parsed = JSON.parse(stripJsonPreamble(input.contents));
64
+ if (!isPlainObject(parsed))
65
+ throw new Error('package.json must contain a JSON object');
66
+ raw = parsed;
67
+ }
68
+ catch (error) {
69
+ const message = error instanceof Error ? error.message : String(error);
70
+ return createParsedFile(input.path, 'package-json', {
71
+ parseStatus: 'failed',
72
+ diagnostics: [
73
+ {
74
+ code: 'WARN_PACKAGE_JSON_INVALID',
75
+ severity: 'warning',
76
+ message: `failed to parse ${input.path}`,
77
+ source: input.path,
78
+ hint: `${message}. Run: agent-context status`,
79
+ },
80
+ ],
81
+ });
82
+ }
83
+ const facts = readPackageFacts(raw);
84
+ return createParsedFile(input.path, 'package-json', {
85
+ metadata: {
86
+ 'package.name': facts.name,
87
+ 'package.version': facts.version,
88
+ 'package.private': facts.private,
89
+ 'package.type': facts.type,
90
+ 'package.scripts': facts.scripts,
91
+ 'package.dependencies': facts.dependencies,
92
+ 'package.devDependencies': facts.devDependencies,
93
+ 'package.peerDependencies': facts.peerDependencies,
94
+ 'package.workspaces': facts.workspaces,
95
+ 'package.entries': facts.entries,
96
+ 'package.packageManagerField': facts.packageManager,
97
+ },
98
+ });
99
+ }
100
+ }
101
+ /** Normalizes a raw package.json object into {@link PackageFacts}. */
102
+ export function readPackageFacts(raw) {
103
+ const entries = [];
104
+ for (const field of PACKAGE_ENTRY_FIELDS) {
105
+ const value = raw[field];
106
+ if (value === undefined)
107
+ continue;
108
+ if (field === 'exports') {
109
+ for (const exported of flattenExports(value))
110
+ entries.push({ field: 'exports', value: exported });
111
+ continue;
112
+ }
113
+ if (field === 'bin') {
114
+ if (typeof value === 'string') {
115
+ entries.push({ field: 'bin', value });
116
+ continue;
117
+ }
118
+ if (isPlainObject(value)) {
119
+ for (const key of Object.keys(value).sort()) {
120
+ const target = value[key];
121
+ if (typeof target === 'string')
122
+ entries.push({ field: 'bin', value: target });
123
+ }
124
+ }
125
+ continue;
126
+ }
127
+ if (typeof value === 'string')
128
+ entries.push({ field, value });
129
+ }
130
+ const workspacesValue = raw.workspaces;
131
+ let workspaces = [];
132
+ if (Array.isArray(workspacesValue)) {
133
+ workspaces = workspacesValue.filter((entry) => typeof entry === 'string').sort();
134
+ }
135
+ else if (isPlainObject(workspacesValue) && Array.isArray(workspacesValue.packages)) {
136
+ workspaces = workspacesValue.packages.filter((entry) => typeof entry === 'string').sort();
137
+ }
138
+ const typeValue = raw.type;
139
+ return {
140
+ name: typeof raw.name === 'string' ? raw.name : null,
141
+ version: typeof raw.version === 'string' ? raw.version : null,
142
+ private: raw.private === true,
143
+ type: typeValue === 'module' ? 'module' : typeValue === 'commonjs' ? 'commonjs' : null,
144
+ scripts: stringRecord(raw.scripts),
145
+ dependencies: dependencyNames(raw.dependencies),
146
+ devDependencies: dependencyNames(raw.devDependencies),
147
+ peerDependencies: dependencyNames(raw.peerDependencies),
148
+ workspaces,
149
+ entries: entries.sort((a, b) => (a.field === b.field ? (a.value < b.value ? -1 : 1) : a.field < b.field ? -1 : 1)),
150
+ packageManager: typeof raw.packageManager === 'string' ? raw.packageManager : null,
151
+ };
152
+ }
153
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../src/adapters/language/package-json/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,gBAAgB,EAA8D,MAAM,aAAa,CAAC;AAC3G,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAqBnE,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACrD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AACnC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,CAAC,IAAa,EAAQ,EAAE;QACpC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,KAAK,MAAM,KAAK,IAAI,IAAI;gBAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QACD,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,CAAC;IACF,KAAK,CAAC,KAAK,CAAC,CAAC;IACb,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,OAAO,kBAAkB;IACpB,EAAE,GAAG,cAAc,CAAC;IACpB,WAAW,GAAG,cAAc,CAAC;IAC7B,WAAW,GAAsB,CAAC,MAAM,CAAC,CAAC;IAC1C,aAAa,GAAG,IAAI,CAAC;IAE9B,OAAO,CAAC,IAAoB;QAC1B,OAAO,IAAI,CAAC,QAAQ,KAAK,cAAc,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,KAA2D;QAC/D,IAAI,GAA4B,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YACvF,GAAG,GAAG,MAAM,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,EAAE;gBAClD,WAAW,EAAE,QAAQ;gBACrB,WAAW,EAAE;oBACX;wBACE,IAAI,EAAE,2BAA2B;wBACjC,QAAQ,EAAE,SAAS;wBACnB,OAAO,EAAE,mBAAmB,KAAK,CAAC,IAAI,EAAE;wBACxC,MAAM,EAAE,KAAK,CAAC,IAAI;wBAClB,IAAI,EAAE,GAAG,OAAO,6BAA6B;qBAC9C;iBACF;aACF,CAAC,CAAC;QACL,CAAC;QAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,EAAE;YAClD,QAAQ,EAAE;gBACR,cAAc,EAAE,KAAK,CAAC,IAAI;gBAC1B,iBAAiB,EAAE,KAAK,CAAC,OAAO;gBAChC,iBAAiB,EAAE,KAAK,CAAC,OAAO;gBAChC,cAAc,EAAE,KAAK,CAAC,IAAI;gBAC1B,iBAAiB,EAAE,KAAK,CAAC,OAAO;gBAChC,sBAAsB,EAAE,KAAK,CAAC,YAAY;gBAC1C,yBAAyB,EAAE,KAAK,CAAC,eAAe;gBAChD,0BAA0B,EAAE,KAAK,CAAC,gBAAgB;gBAClD,oBAAoB,EAAE,KAAK,CAAC,UAAU;gBACtC,iBAAiB,EAAE,KAAK,CAAC,OAAO;gBAChC,6BAA6B,EAAE,KAAK,CAAC,cAAc;aACpD;SACF,CAAC,CAAC;IACL,CAAC;CACF;AAED,sEAAsE;AACtE,MAAM,UAAU,gBAAgB,CAAC,GAA4B;IAC3D,MAAM,OAAO,GAAwB,EAAE,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,oBAAoB,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,MAAM,QAAQ,IAAI,cAAc,CAAC,KAAK,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClG,SAAS;QACX,CAAC;QACD,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YACpB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;gBACtC,SAAS;YACX,CAAC;YACD,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;oBAC1B,IAAI,OAAO,MAAM,KAAK,QAAQ;wBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBAChF,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,eAAe,GAAG,GAAG,CAAC,UAAU,CAAC;IACvC,IAAI,UAAU,GAAa,EAAE,CAAC;IAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QACnC,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IACpG,CAAC;SAAM,IAAI,aAAa,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrF,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7G,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC;IAC3B,OAAO;QACL,IAAI,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;QACpD,OAAO,EAAE,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;QAC7D,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,IAAI;QAC7B,IAAI,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;QACtF,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;QAClC,YAAY,EAAE,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC;QAC/C,eAAe,EAAE,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC;QACrD,gBAAgB,EAAE,eAAe,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACvD,UAAU;QACV,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClH,cAAc,EAAE,OAAO,GAAG,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI;KACnF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Extension point for language support.
3
+ *
4
+ * Third-party code can add a language adapter without touching the core:
5
+ *
6
+ * ```ts
7
+ * const registry = createDefaultRegistry();
8
+ * registry.register(myPythonAdapter);
9
+ * const context = await AgentContext.load({ root, languageRegistry: registry });
10
+ * ```
11
+ *
12
+ * Resolution order: adapters that match by file name (`package.json`,
13
+ * `tsconfig.json`) win over extension based adapters.
14
+ */
15
+ import type { FileDescriptor, LanguageAdapter, ParsedFile } from './types.ts';
16
+ export declare class LanguageRegistry {
17
+ private readonly adapters;
18
+ constructor(adapters?: readonly LanguageAdapter[]);
19
+ register(adapter: LanguageAdapter): this;
20
+ list(): LanguageAdapter[];
21
+ get(id: string): LanguageAdapter | undefined;
22
+ /**
23
+ * Picks the adapter for a file.
24
+ *
25
+ * @param file file descriptor (path/basename/extension)
26
+ * @param enabledLanguages language ids enabled through configuration
27
+ */
28
+ resolve(file: FileDescriptor, enabledLanguages: readonly string[]): LanguageAdapter | null;
29
+ /** Parses content with the appropriate adapter, never throwing. */
30
+ parseFile(path: string, contents: string, enabledLanguages: readonly string[]): ParsedFile;
31
+ }
32
+ /** Registry with the built-in adapters (TypeScript/JavaScript, JSON, Markdown). */
33
+ export declare function createDefaultRegistry(): LanguageRegistry;
34
+ export type { LanguageAdapter, ParsedFile, FileDescriptor } from './types.ts';
35
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/adapters/language/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAS9E,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;gBAEtC,QAAQ,GAAE,SAAS,eAAe,EAAO;IAIrD,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAKxC,IAAI,IAAI,eAAe,EAAE;IAIzB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI5C;;;;;OAKG;IACH,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAAG,eAAe,GAAG,IAAI;IAU1F,mEAAmE;IACnE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU;CAwB3F;AAED,mFAAmF;AACnF,wBAAgB,qBAAqB,IAAI,gBAAgB,CAQxD;AAED,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,79 @@
1
+ import { createParsedFile } from "./types.js";
2
+ import { TsJsAdapter } from "./ts-js/adapter.js";
3
+ import { JsonAdapter } from "./json/adapter.js";
4
+ import { MarkdownAdapter } from "./markdown/adapter.js";
5
+ import { PackageJsonAdapter } from "./package-json/adapter.js";
6
+ import { TsConfigAdapter } from "./tsconfig/adapter.js";
7
+ import { extname, basename } from "../../util/paths.js";
8
+ export class LanguageRegistry {
9
+ adapters = [];
10
+ constructor(adapters = []) {
11
+ for (const adapter of adapters)
12
+ this.register(adapter);
13
+ }
14
+ register(adapter) {
15
+ this.adapters.push(adapter);
16
+ return this;
17
+ }
18
+ list() {
19
+ return [...this.adapters];
20
+ }
21
+ get(id) {
22
+ return this.adapters.find((adapter) => adapter.id === id);
23
+ }
24
+ /**
25
+ * Picks the adapter for a file.
26
+ *
27
+ * @param file file descriptor (path/basename/extension)
28
+ * @param enabledLanguages language ids enabled through configuration
29
+ */
30
+ resolve(file, enabledLanguages) {
31
+ const enabled = new Set(enabledLanguages.map((language) => language.toLowerCase()));
32
+ for (const adapter of this.adapters) {
33
+ if (!adapter.handles(file))
34
+ continue;
35
+ if (adapter.alwaysEnabled)
36
+ return adapter;
37
+ if (adapter.languageIds.some((id) => enabled.has(id)))
38
+ return adapter;
39
+ }
40
+ return null;
41
+ }
42
+ /** Parses content with the appropriate adapter, never throwing. */
43
+ parseFile(path, contents, enabledLanguages) {
44
+ const descriptor = { path, basename: basename(path), extension: extname(path).toLowerCase() };
45
+ const adapter = this.resolve(descriptor, enabledLanguages);
46
+ if (adapter === null) {
47
+ return createParsedFile(path, 'unknown', { parseStatus: 'skipped' });
48
+ }
49
+ try {
50
+ return adapter.parse({ path, language: adapter.languageIds[0] ?? adapter.id, contents });
51
+ }
52
+ catch (error) {
53
+ const message = error instanceof Error ? error.message : String(error);
54
+ return createParsedFile(path, adapter.id, {
55
+ parseStatus: 'failed',
56
+ diagnostics: [
57
+ {
58
+ code: 'WARN_PARSE_FAILED',
59
+ severity: 'warning',
60
+ message: `failed to parse ${path}`,
61
+ source: path,
62
+ hint: message,
63
+ },
64
+ ],
65
+ });
66
+ }
67
+ }
68
+ }
69
+ /** Registry with the built-in adapters (TypeScript/JavaScript, JSON, Markdown). */
70
+ export function createDefaultRegistry() {
71
+ return new LanguageRegistry([
72
+ new PackageJsonAdapter(),
73
+ new TsConfigAdapter(),
74
+ new JsonAdapter(),
75
+ new MarkdownAdapter(),
76
+ new TsJsAdapter(),
77
+ ]);
78
+ }
79
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/adapters/language/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type FileDescriptor, type LanguageAdapter, type ParsedFile } from '../types.ts';
2
+ export declare class TsJsAdapter implements LanguageAdapter {
3
+ readonly id = "typescript";
4
+ readonly displayName = "TypeScript / JavaScript";
5
+ readonly languageIds: readonly string[];
6
+ readonly alwaysEnabled = false;
7
+ handles(file: FileDescriptor): boolean;
8
+ parse(input: {
9
+ path: string;
10
+ language: string;
11
+ contents: string;
12
+ }): ParsedFile;
13
+ }
14
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/adapters/language/ts-js/adapter.ts"],"names":[],"mappings":"AAUA,OAAO,EAAsC,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAM7H,qBAAa,WAAY,YAAW,eAAe;IACjD,QAAQ,CAAC,EAAE,gBAAgB;IAC3B,QAAQ,CAAC,WAAW,6BAA6B;IACjD,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAgC;IACvE,QAAQ,CAAC,aAAa,SAAS;IAE/B,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO;IAItC,KAAK,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,UAAU;CAmC/E"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * TypeScript / JavaScript language adapter.
3
+ *
4
+ * Produces the language-agnostic IR used by the whole pipeline. All TypeScript
5
+ * specific knowledge (lexing, `import type`, `export =`, decorators, JSX) stops
6
+ * at this module.
7
+ */
8
+ import { extractModuleFacts } from "./extractor.js";
9
+ import { signalsForSpecifier } from "./package-signals.js";
10
+ import { createParsedFile, normalizeSignals } from "../types.js";
11
+ const TS_JS_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.mts', '.cts', '.mjs', '.cjs']);
12
+ const JAVASCRIPT_EXTENSIONS = new Set(['.js', '.jsx', '.mjs', '.cjs']);
13
+ const JSX_EXTENSIONS = new Set(['.tsx', '.jsx']);
14
+ export class TsJsAdapter {
15
+ id = 'typescript';
16
+ displayName = 'TypeScript / JavaScript';
17
+ languageIds = ['typescript', 'javascript'];
18
+ alwaysEnabled = false;
19
+ handles(file) {
20
+ return TS_JS_EXTENSIONS.has(file.extension);
21
+ }
22
+ parse(input) {
23
+ const extension = input.path.slice(input.path.lastIndexOf('.')).toLowerCase();
24
+ const language = JAVASCRIPT_EXTENSIONS.has(extension) ? 'javascript' : 'typescript';
25
+ const extraction = extractModuleFacts(input.contents);
26
+ const signals = [...extraction.signals];
27
+ if (JSX_EXTENSIONS.has(extension))
28
+ signals.push('jsx:present');
29
+ for (const record of extraction.imports) {
30
+ signals.push(...signalsForSpecifier(record.specifier));
31
+ }
32
+ const diagnostics = [];
33
+ if (extraction.parseStatus === 'partial') {
34
+ diagnostics.push({
35
+ code: 'WARN_PARSE_PARTIAL',
36
+ severity: 'warning',
37
+ message: `failed to fully parse ${input.path}`,
38
+ source: input.path,
39
+ hint: 'The file contains unbalanced braces or unterminated literals; recovered facts are still used.',
40
+ });
41
+ }
42
+ return createParsedFile(input.path, language, {
43
+ parseStatus: extraction.parseStatus,
44
+ imports: extraction.imports,
45
+ exports: extraction.exports,
46
+ symbols: extraction.symbols,
47
+ calls: extraction.calls,
48
+ routes: extraction.routes,
49
+ signals: normalizeSignals(signals),
50
+ metadata: {
51
+ 'ts.moduleFormat': extraction.usesEsmSyntax ? 'esm' : extraction.usesCommonJs ? 'commonjs' : 'unknown',
52
+ 'ts.symbolCount': extraction.symbols.length,
53
+ 'ts.exportCount': extraction.exports.length,
54
+ },
55
+ diagnostics,
56
+ });
57
+ }
58
+ }
59
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../src/adapters/language/ts-js/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { CallRecord, ExportRecord, ImportRecord, RouteRecord, SymbolRecord } from '../types.ts';
2
+ import type { ParseStatus } from '../../../model/types.ts';
3
+ export interface ExtractionResult {
4
+ imports: ImportRecord[];
5
+ exports: ExportRecord[];
6
+ symbols: SymbolRecord[];
7
+ calls: CallRecord[];
8
+ routes: RouteRecord[];
9
+ signals: string[];
10
+ parseStatus: ParseStatus;
11
+ usesEsmSyntax: boolean;
12
+ usesCommonJs: boolean;
13
+ }
14
+ /**
15
+ * Extracts imports, exports, symbols, calls, routes and signals from TS/JS source.
16
+ *
17
+ * The function never throws: malformed input yields `parseStatus: 'partial'`
18
+ * together with the facts that could still be recovered.
19
+ */
20
+ export declare function extractModuleFacts(source: string): ExtractionResult;
21
+ //# sourceMappingURL=extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../../../src/adapters/language/ts-js/extractor.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAErG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;CACvB;AA6rBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CA0EnE"}