@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,438 @@
1
+ import { clampConfidence, compareStrings, shortHash } from "../../model/canonical.js";
2
+ import { classifyIdentifierCase, ratio, splitIdentifier } from "../../util/text.js";
3
+ import { basename, stem } from "../../util/paths.js";
4
+ /** Minimum sample sizes below which a convention is not reported. */
5
+ export const MIN_SAMPLE = {
6
+ fileNaming: 6,
7
+ symbols: 4,
8
+ imports: 4,
9
+ tests: 2,
10
+ exports: 4,
11
+ };
12
+ export function makeConvention(category, statement, confidence, evidence, origin = 'observed') {
13
+ return {
14
+ id: `${category.toLowerCase()}:${shortHash(statement, 8)}`,
15
+ category,
16
+ statement,
17
+ confidence: clampConfidence(confidence),
18
+ evidence: evidence.slice(0, 4),
19
+ origin,
20
+ };
21
+ }
22
+ function tallyCases(values) {
23
+ const cases = new Map();
24
+ const examples = new Map();
25
+ for (const entry of values) {
26
+ const classification = classifyIdentifierCase(entry.key);
27
+ if (classification === 'other')
28
+ continue;
29
+ cases.set(classification, (cases.get(classification) ?? 0) + 1);
30
+ const list = examples.get(classification) ?? [];
31
+ if (list.length < 3)
32
+ list.push(entry.sample);
33
+ examples.set(classification, list);
34
+ }
35
+ const total = [...cases.values()].reduce((sum, count) => sum + count, 0);
36
+ return { cases, total, examples };
37
+ }
38
+ /** Returns the dominant case when it passes the threshold, otherwise `null`. */
39
+ function dominantCase(tally, minimumSample, threshold) {
40
+ if (tally.total < minimumSample)
41
+ return null;
42
+ const entries = [...tally.cases.entries()].sort((a, b) => (b[1] === a[1] ? compareStrings(a[0], b[0]) : b[1] - a[1]));
43
+ const top = entries[0];
44
+ if (top === undefined)
45
+ return null;
46
+ if (ratio(top[1], tally.total) < threshold)
47
+ return null;
48
+ return { value: top[0], count: top[1], total: tally.total, examples: tally.examples.get(top[0]) ?? [] };
49
+ }
50
+ const CASE_PHRASE = {
51
+ PascalCase: 'PascalCase',
52
+ camelCase: 'camelCase',
53
+ 'kebab-case': 'kebab-case',
54
+ snake_case: 'snake_case',
55
+ SCREAMING_SNAKE_CASE: 'SCREAMING_SNAKE_CASE',
56
+ other: 'mixed',
57
+ };
58
+ export function detectFileNaming(conventions, repository) {
59
+ const sourceFiles = repository.files.filter((file) => (file.kind === 'source' || file.kind === 'test') &&
60
+ (file.language === 'typescript' || file.language === 'javascript'));
61
+ const tally = tallyCases(sourceFiles
62
+ .filter((file) => !basename(file.path).startsWith('index.'))
63
+ .map((file) => ({ key: stem(file.path), sample: file.path })));
64
+ const dominant = dominantCase(tally, MIN_SAMPLE.fileNaming, 0.7);
65
+ if (dominant === null)
66
+ return;
67
+ conventions.push(makeConvention('Naming', `Source files use ${CASE_PHRASE[dominant.value]} (${dominant.count}/${dominant.total} files).`, 0.75 + 0.2 * ratio(dominant.count, dominant.total), dominant.examples.map((example) => ({
68
+ source: example,
69
+ detail: `file name uses ${CASE_PHRASE[dominant.value]}`,
70
+ }))));
71
+ }
72
+ export function detectSymbolNaming(conventions, repository) {
73
+ const byKind = new Map();
74
+ for (const symbol of repository.symbols) {
75
+ if (symbol.name.length < 2 || splitIdentifier(symbol.name).length === 0)
76
+ continue;
77
+ const list = byKind.get(symbol.kind) ?? [];
78
+ list.push({ key: symbol.name, sample: symbol.id });
79
+ byKind.set(symbol.kind, list);
80
+ }
81
+ const expectations = [
82
+ { kind: 'class', expected: 'PascalCase', minimum: MIN_SAMPLE.symbols, statement: 'Classes use PascalCase' },
83
+ { kind: 'interface', expected: 'PascalCase', minimum: 3, statement: 'TypeScript interfaces use PascalCase' },
84
+ { kind: 'type', expected: 'PascalCase', minimum: 3, statement: 'Type aliases use PascalCase' },
85
+ { kind: 'function', expected: 'camelCase', minimum: 5, statement: 'Functions use camelCase' },
86
+ { kind: 'const', expected: 'camelCase', minimum: 5, statement: 'Module level constants use camelCase' },
87
+ ];
88
+ for (const expectation of expectations) {
89
+ const entries = byKind.get(expectation.kind) ?? [];
90
+ if (entries.length < expectation.minimum)
91
+ continue;
92
+ const tally = tallyCases(entries);
93
+ const matching = tally.cases.get(expectation.expected) ?? 0;
94
+ if (ratio(matching, tally.total) < 0.85)
95
+ continue;
96
+ conventions.push(makeConvention('Naming', `${expectation.statement} (${matching}/${tally.total} declarations).`, 0.8 + 0.15 * ratio(matching, tally.total), (tally.examples.get(expectation.expected) ?? []).map((example) => ({
97
+ source: example.split('#')[0],
98
+ detail: `${expectation.kind} "${example.split('#')[1]}" uses ${CASE_PHRASE[expectation.expected]}`,
99
+ }))));
100
+ }
101
+ }
102
+ /** Counts import styles across the repository. */
103
+ export function collectImportStatistics(parsed, aliases) {
104
+ const aliasPatterns = aliases.map((alias) => alias.pattern.replace('*', ''));
105
+ const statistics = {
106
+ filesWithImports: 0,
107
+ relative: 0,
108
+ alias: 0,
109
+ workspace: 0,
110
+ external: 0,
111
+ requireCalls: 0,
112
+ typeOnlyFiles: 0,
113
+ explicitJsExtensions: 0,
114
+ externalFirstFiles: 0,
115
+ orderedFiles: 0,
116
+ };
117
+ for (const file of parsed.values()) {
118
+ if (file.language !== 'typescript' && file.language !== 'javascript')
119
+ continue;
120
+ if (file.imports.length > 0)
121
+ statistics.filesWithImports += 1;
122
+ if (file.imports.some((record) => record.typeOnly))
123
+ statistics.typeOnlyFiles += 1;
124
+ let hasExternal = false;
125
+ let hasInternal = false;
126
+ let externalFirst = true;
127
+ let seenInternal = false;
128
+ const ordered = [];
129
+ for (const record of file.imports) {
130
+ const specifier = record.specifier;
131
+ if (record.syntax === 'require')
132
+ statistics.requireCalls += 1;
133
+ if (record.syntax === 'require' || record.typeOnly) {
134
+ // still classified below for ordering purposes
135
+ }
136
+ if (record.syntax === 'require' && !record.specifier.startsWith('.')) {
137
+ hasExternal = true;
138
+ continue;
139
+ }
140
+ if (record.specifier.startsWith('.')) {
141
+ hasInternal = true;
142
+ statistics.relative += 1;
143
+ if (/\.(js|mjs|cjs)$/.test(record.specifier))
144
+ statistics.explicitJsExtensions += 1;
145
+ }
146
+ else if (aliasPatterns.some((pattern) => pattern.length > 1 && specifier.startsWith(pattern))) {
147
+ hasInternal = true;
148
+ statistics.alias += 1;
149
+ }
150
+ else if (specifier.startsWith('node:')) {
151
+ hasExternal = true;
152
+ }
153
+ else {
154
+ hasExternal = true;
155
+ statistics.external += 1;
156
+ }
157
+ if (hasExternal && !hasInternal)
158
+ externalFirst = !hasInternal;
159
+ if (hasInternal)
160
+ seenInternal = true;
161
+ ordered.push({ line: record.line, external: !hasInternal || !record.specifier.startsWith('.') });
162
+ }
163
+ if (hasExternal && hasInternal) {
164
+ statistics.orderedFiles += 1;
165
+ const firstInternalLine = ordered.find((entry) => !entry.external)?.line ?? Number.POSITIVE_INFINITY;
166
+ const lastExternalLine = [...ordered].filter((entry) => entry.external).pop()?.line ?? Number.NEGATIVE_INFINITY;
167
+ if (lastExternalLine < firstInternalLine)
168
+ statistics.externalFirstFiles += 1;
169
+ void seenInternal;
170
+ void externalFirst;
171
+ }
172
+ }
173
+ return statistics;
174
+ }
175
+ export function detectImportConventions(conventions, repository, parsed, aliases) {
176
+ const statistics = collectImportStatistics(parsed, aliases);
177
+ if (statistics.filesWithImports === 0)
178
+ return;
179
+ const internalImports = statistics.relative + statistics.alias + statistics.workspace;
180
+ if (statistics.alias >= 3 && ratio(statistics.alias, Math.max(1, internalImports)) >= 0.2 && aliases.length > 0) {
181
+ conventions.push(makeConvention('Imports', `Internal imports use tsconfig path aliases (${statistics.alias} aliased imports).`, 0.85, aliases.slice(0, 3).map((alias) => ({
182
+ source: alias.source,
183
+ detail: `alias "${alias.pattern}" → ${alias.targets.join(', ')}`,
184
+ }))));
185
+ }
186
+ if (statistics.explicitJsExtensions >= 3 && ratio(statistics.explicitJsExtensions, Math.max(1, statistics.relative)) >= 0.4) {
187
+ conventions.push(makeConvention('Imports', `Relative imports use explicit .js extensions (${statistics.explicitJsExtensions}/${statistics.relative} relative imports).`, 0.8, [{ source: '<repository>', detail: 'import specifiers end with .js while sources are .ts (ESM/NodeNext style)' }]));
188
+ }
189
+ if (statistics.orderedFiles >= MIN_SAMPLE.imports && ratio(statistics.externalFirstFiles, statistics.orderedFiles) >= 0.7) {
190
+ conventions.push(makeConvention('Imports', `External dependencies are imported before internal modules (${statistics.externalFirstFiles}/${statistics.orderedFiles} files).`, 0.75, [{ source: '<repository>', detail: 'import order observed across files that import both kinds of modules' }]));
191
+ }
192
+ if (statistics.typeOnlyFiles >= 3 && ratio(statistics.typeOnlyFiles, statistics.filesWithImports) >= 0.25) {
193
+ conventions.push(makeConvention('Imports', `Type-only dependencies use \`import type\` (${statistics.typeOnlyFiles}/${statistics.filesWithImports} files).`, 0.8, [{ source: '<repository>', detail: 'import type / export type statements detected' }]));
194
+ }
195
+ if (statistics.requireCalls > 0 && ratio(statistics.requireCalls, statistics.requireCalls + statistics.filesWithImports) >= 0.3) {
196
+ conventions.push(makeConvention('Imports', `CommonJS \`require()\` is used for module loading (${statistics.requireCalls} calls).`, 0.7, [{ source: '<repository>', detail: 'require() calls detected in source files' }]));
197
+ }
198
+ void repository;
199
+ }
200
+ export function detectTestConventions(conventions, repository, parsed) {
201
+ const testFiles = repository.files.filter((file) => file.kind === 'test');
202
+ if (testFiles.length >= MIN_SAMPLE.tests) {
203
+ const suffixCounts = new Map();
204
+ for (const file of testFiles) {
205
+ const match = /\.(test|spec)\.[cm]?[jt]sx?$/.exec(file.path);
206
+ const key = match !== null ? `*.${match[1]}.ts` : file.path.includes('__tests__/') ? '__tests__' : 'other';
207
+ const list = suffixCounts.get(key) ?? [];
208
+ if (list.length < 3)
209
+ list.push(file.path);
210
+ suffixCounts.set(key, list);
211
+ }
212
+ const sorted = [...suffixCounts.entries()].sort((a, b) => b[1].length === a[1].length ? compareStrings(a[0], b[0]) : b[1].length - a[1].length);
213
+ const dominant = sorted[0];
214
+ if (dominant !== undefined && ratio(dominant[1].length, testFiles.length) >= 0.5) {
215
+ conventions.push(makeConvention('Tests', `Tests use the \`${dominant[0]}\` pattern.`, 0.85, dominant[1].slice(0, 3).map((example) => ({ source: example, detail: 'test file naming pattern' }))));
216
+ }
217
+ const colocated = testFiles.filter((file) => {
218
+ const directory = file.path.slice(0, file.path.lastIndexOf('/'));
219
+ return repository.files.some((candidate) => candidate.kind === 'source' &&
220
+ candidate.path.startsWith(`${directory}/`) &&
221
+ !candidate.path.slice(directory.length + 1).includes('/'));
222
+ }).length;
223
+ const centralized = testFiles.filter((file) => /(^|\/)(tests?|__tests__|e2e)\//.test(file.path)).length;
224
+ if (ratio(colocated, testFiles.length) >= 0.6) {
225
+ conventions.push(makeConvention('Tests', `Tests are colocated with the code they cover (${colocated}/${testFiles.length} test files).`, 0.8, testFiles.slice(0, 2).map((file) => ({ source: file.path, detail: 'test lives next to its source module' }))));
226
+ }
227
+ else if (centralized >= MIN_SAMPLE.tests && ratio(centralized, testFiles.length) >= 0.6) {
228
+ conventions.push(makeConvention('Tests', `Tests live in a dedicated test directory (${centralized}/${testFiles.length} test files).`, 0.8, testFiles
229
+ .filter((file) => /(^|\/)(tests?|__tests__|e2e)\//.test(file.path))
230
+ .slice(0, 2)
231
+ .map((file) => ({ source: file.path, detail: 'test located in a central tests directory' }))));
232
+ }
233
+ }
234
+ const runners = new Set();
235
+ const runnerEvidence = [];
236
+ for (const workspacePackage of repository.workspace.packages) {
237
+ for (const name of workspacePackage.developmentDependencies) {
238
+ if (['vitest', 'jest', 'mocha', 'ava'].includes(name)) {
239
+ runners.add(name);
240
+ runnerEvidence.push({ source: 'package.json', detail: `${name} declared in devDependencies` });
241
+ }
242
+ }
243
+ for (const [scriptName, command] of Object.entries(workspacePackage.scripts)) {
244
+ if (scriptName !== 'test')
245
+ continue;
246
+ if (command.includes('node --test')) {
247
+ runners.add('node:test');
248
+ runnerEvidence.push({ source: 'package.json', detail: `npm script "test" runs \`${command}\`` });
249
+ }
250
+ }
251
+ }
252
+ if (runners.size > 0) {
253
+ conventions.push(makeConvention('Tests', `Tests run with ${[...runners].sort(compareStrings).join(', ')}.`, 0.9, runnerEvidence));
254
+ }
255
+ void parsed;
256
+ }
257
+ export function detectErrorConventions(conventions, repository) {
258
+ const errorClasses = repository.symbols.filter((symbol) => symbol.extends.includes('Error'));
259
+ if (errorClasses.length === 0)
260
+ return;
261
+ conventions.push(makeConvention('Error handling', `Domain errors are declared as classes extending the built-in \`Error\` (${errorClasses.length} classes).`, 0.85, errorClasses.slice(0, 3).map((symbol) => ({
262
+ source: symbol.file,
263
+ detail: `class ${symbol.name} extends Error (line ${symbol.line})`,
264
+ }))));
265
+ }
266
+ export function detectExportConventions(conventions, repository) {
267
+ const exported = repository.symbols.filter((symbol) => symbol.exported);
268
+ if (exported.length < MIN_SAMPLE.exports)
269
+ return;
270
+ const defaults = exported.filter((symbol) => symbol.isDefault).length;
271
+ const named = exported.length - defaults;
272
+ if (ratio(defaults, exported.length) <= 0.15) {
273
+ conventions.push(makeConvention('Exports', `Modules use named exports rather than default exports (${named}/${exported.length} exported symbols are named).`, 0.85, exported.slice(0, 3).map((symbol) => ({ source: symbol.file, detail: `exports ${symbol.name}` }))));
274
+ }
275
+ else if (ratio(defaults, exported.length) >= 0.5) {
276
+ conventions.push(makeConvention('Exports', `Modules primarily use default exports (${defaults}/${exported.length} exported symbols are default).`, 0.75, exported
277
+ .filter((symbol) => symbol.isDefault)
278
+ .slice(0, 3)
279
+ .map((symbol) => ({ source: symbol.file, detail: `default export at line ${symbol.line}` }))));
280
+ }
281
+ }
282
+ export function detectStructureConventions(conventions, repository) {
283
+ const modules = repository.modules.filter((module) => module.files.length > 0);
284
+ if (modules.length < 3)
285
+ return;
286
+ const withBarrel = modules
287
+ .map((module) => ({
288
+ module,
289
+ barrel: module.files.find((file) => /(^|\/)index\.[cm]?[jt]sx?$/.test(file)),
290
+ }))
291
+ .filter((entry) => entry.barrel !== undefined);
292
+ if (ratio(withBarrel.length, modules.length) >= 0.5) {
293
+ conventions.push(makeConvention('Structure', `Modules expose their public surface through \`index\` files (${withBarrel.length}/${modules.length} modules).`, 0.8, withBarrel.slice(0, 3).map((entry) => ({
294
+ source: entry.barrel,
295
+ detail: `barrel file of module "${entry.module.id}"`,
296
+ }))));
297
+ }
298
+ const domainish = modules.filter((module) => module.roles.some((role) => role.value === 'domain' || role.value === 'repository'));
299
+ const layered = modules.filter((module) => module.roles.some((role) => role.value === 'adapter' || role.value === 'controller' || role.value === 'infrastructure'));
300
+ if (domainish.length > 0 && layered.length > 0) {
301
+ conventions.push(makeConvention('Structure', `The repository appears to separate domain code from infrastructure and adapters (${domainish.length} domain-ish modules, ${layered.length} infrastructure/adapters modules).`, 0.55, [
302
+ { source: '<heuristic>', detail: 'module names and file signals suggested a layered separation' },
303
+ {
304
+ source: '<modules>',
305
+ detail: [...domainish, ...layered]
306
+ .slice(0, 3)
307
+ .map((module) => `${module.id} → ${module.roles[0]?.value ?? 'unknown'}`)
308
+ .join('; '),
309
+ },
310
+ ]));
311
+ }
312
+ }
313
+ export function detectToolchainConventions(conventions, repository, parsed) {
314
+ const workspace = repository.workspace;
315
+ if (workspace.packageManager !== 'unknown') {
316
+ conventions.push(makeConvention('Toolchain', `Dependencies are managed with ${workspace.packageManager} (repository signal).`, 0.8, workspace.packageManagerEvidence.length > 0
317
+ ? workspace.packageManagerEvidence
318
+ : [{ source: '<repository>', detail: 'package manager detected from lockfiles' }], 'config'));
319
+ }
320
+ const rootType = workspace.rootPackage?.type ?? null;
321
+ if (rootType !== null) {
322
+ conventions.push(makeConvention('Toolchain', rootType === 'module'
323
+ ? 'The repository is configured as ESM (`"type": "module"` in package.json).'
324
+ : 'The repository is configured as CommonJS (`"type": "commonjs"` in package.json).', 0.9, [{ source: 'package.json', detail: `"type": "${rootType}"` }], 'config'));
325
+ }
326
+ const strictConfigs = [...parsed.values()].filter((file) => file.metadata['tsconfig.strict'] === true);
327
+ if (strictConfigs.length > 0) {
328
+ conventions.push(makeConvention('Toolchain', `TypeScript strict mode is enabled (${strictConfigs.length} tsconfig file(s)).`, 0.95, strictConfigs.slice(0, 3).map((file) => ({ source: file.path, detail: '"strict": true' })), 'config'));
329
+ }
330
+ if (workspace.isMonorepo) {
331
+ conventions.push(makeConvention('Toolchain', `The repository is a ${workspace.workspaceModel.replace('-workspaces', '')} workspace monorepo (${workspace.workspaceGlobs.join(', ')}).`, 0.95, [{ source: 'package.json', detail: `workspaces: ${workspace.workspaceGlobs.join(', ')}` }], 'config'));
332
+ }
333
+ const devDependencyNames = new Set(workspace.packages.flatMap((entry) => entry.developmentDependencies));
334
+ const tooling = [
335
+ { name: 'eslint', statement: 'ESLint is used for linting' },
336
+ { name: 'prettier', statement: 'Prettier is used for formatting' },
337
+ { name: 'biome', statement: 'Biome is used for linting and formatting' },
338
+ { name: 'husky', statement: 'Git hooks are managed with husky' },
339
+ ];
340
+ for (const entry of tooling) {
341
+ if (!devDependencyNames.has(entry.name))
342
+ continue;
343
+ conventions.push(makeConvention('Toolchain', `${entry.statement}.`, 0.85, [
344
+ { source: 'package.json', detail: `${entry.name} declared in devDependencies` },
345
+ ]));
346
+ }
347
+ const workflows = repository.files
348
+ .filter((file) => file.path.startsWith('.github/workflows/'))
349
+ .map((file) => file.path);
350
+ if (workflows.length > 0) {
351
+ conventions.push(makeConvention('Toolchain', 'Continuous integration runs through GitHub Actions.', 0.85, workflows.slice(0, 3).map((path) => ({ source: path, detail: 'workflow definition' }))));
352
+ }
353
+ }
354
+ export function detectDocumentationConventions(conventions, repository, parsed) {
355
+ const files = new Set(repository.files.map((file) => file.path));
356
+ if (files.has('README.md')) {
357
+ conventions.push(makeConvention('Documentation', 'Repository documentation starts at `README.md`.', 0.9, [
358
+ { source: 'README.md', detail: 'top level README present' },
359
+ ]));
360
+ }
361
+ const adrDocuments = [...parsed.values()].filter((file) => file.language === 'markdown' && /(^|\/)(adr|adrs|decisions?)\//i.test(file.path));
362
+ if (adrDocuments.length > 0) {
363
+ const directory = adrDocuments[0].path.split('/').slice(0, -1).join('/');
364
+ conventions.push(makeConvention('Documentation', `Architectural decisions are recorded as documents under \`${directory}/\` (${adrDocuments.length} documents).`, 0.9, adrDocuments.slice(0, 3).map((file) => ({ source: file.path, detail: 'decision record' }))));
365
+ }
366
+ else if (repository.files.some((file) => file.path.startsWith('docs/'))) {
367
+ conventions.push(makeConvention('Documentation', 'Extended documentation lives in `docs/`.', 0.7, [
368
+ { source: 'docs/', detail: 'documentation directory present' },
369
+ ]));
370
+ }
371
+ }
372
+ export function detectLanguageConventions(conventions, repository) {
373
+ const counts = new Map();
374
+ for (const file of repository.files) {
375
+ if (file.sensitive)
376
+ continue;
377
+ if (!['typescript', 'javascript', 'json', 'markdown'].includes(file.language))
378
+ continue;
379
+ counts.set(file.language, (counts.get(file.language) ?? 0) + 1);
380
+ }
381
+ const typescript = counts.get('typescript') ?? 0;
382
+ const javascript = counts.get('javascript') ?? 0;
383
+ if (typescript + javascript === 0)
384
+ return;
385
+ const statement = javascript === 0
386
+ ? `Implementation is written in TypeScript (${typescript} files).`
387
+ : typescript === 0
388
+ ? `Implementation is written in JavaScript (${javascript} files).`
389
+ : `Implementation mixes TypeScript (${typescript} files) and JavaScript (${javascript} files).`;
390
+ conventions.push(makeConvention('Languages', statement, javascript === 0 ? 0.95 : 0.9, [
391
+ { source: '<repository>', detail: 'languages are derived from file extensions, not from content guessing' },
392
+ ]));
393
+ }
394
+ const CATEGORY_ORDER = [
395
+ 'Languages',
396
+ 'Toolchain',
397
+ 'Naming',
398
+ 'Imports',
399
+ 'Exports',
400
+ 'Structure',
401
+ 'Error handling',
402
+ 'Tests',
403
+ 'Documentation',
404
+ ];
405
+ /** Runs every convention detector and returns a deterministic, ordered list. */
406
+ export function detectConventions(input) {
407
+ const conventions = [];
408
+ const { repository, parsed, aliases } = input;
409
+ detectLanguageConventions(conventions, repository);
410
+ detectToolchainConventions(conventions, repository, parsed);
411
+ detectFileNaming(conventions, repository);
412
+ detectSymbolNaming(conventions, repository);
413
+ detectImportConventions(conventions, repository, parsed, aliases);
414
+ detectExportConventions(conventions, repository);
415
+ detectStructureConventions(conventions, repository);
416
+ detectErrorConventions(conventions, repository);
417
+ detectTestConventions(conventions, repository, parsed);
418
+ detectDocumentationConventions(conventions, repository, parsed);
419
+ const seen = new Set();
420
+ const unique = [];
421
+ for (const convention of conventions) {
422
+ const key = `${convention.category}|${convention.statement}`;
423
+ if (seen.has(key))
424
+ continue;
425
+ seen.add(key);
426
+ unique.push(convention);
427
+ }
428
+ return unique.sort((a, b) => {
429
+ const categoryA = CATEGORY_ORDER.indexOf(a.category);
430
+ const categoryB = CATEGORY_ORDER.indexOf(b.category);
431
+ const rankA = categoryA === -1 ? CATEGORY_ORDER.length : categoryA;
432
+ const rankB = categoryB === -1 ? CATEGORY_ORDER.length : categoryB;
433
+ if (rankA !== rankB)
434
+ return rankA - rankB;
435
+ return compareStrings(a.statement, b.statement);
436
+ });
437
+ }
438
+ //# sourceMappingURL=detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../../src/core/conventions/detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Human readable projection of the conventions.
3
+ *
4
+ * The canonical machine-readable representation is `.agent/conventions.json`; this
5
+ * Markdown file is generated *from* it for humans reading the repository. Every
6
+ * statement shows its confidence and the evidence that supports it.
7
+ */
8
+ import type { Convention } from '../../model/types.ts';
9
+ export interface ConventionsMarkdownMeta {
10
+ repositoryName: string;
11
+ /** Optional ISO timestamp; omitted by default so the file stays diff-stable. */
12
+ generatedAt?: string;
13
+ }
14
+ /** Renders `.agent/conventions.md` deterministically. */
15
+ export declare function renderConventionsMarkdown(conventions: readonly Convention[], meta: ConventionsMarkdownMeta): string;
16
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../src/core/conventions/renderer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGvD,MAAM,WAAW,uBAAuB;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,yDAAyD;AACzD,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,SAAS,UAAU,EAAE,EAClC,IAAI,EAAE,uBAAuB,GAC5B,MAAM,CA2CR"}
@@ -0,0 +1,42 @@
1
+ import { GENERATOR_NAME, SCHEMA_VERSION } from "../../model/schema.js";
2
+ /** Renders `.agent/conventions.md` deterministically. */
3
+ export function renderConventionsMarkdown(conventions, meta) {
4
+ const lines = [];
5
+ lines.push('# Repository Conventions');
6
+ lines.push('');
7
+ lines.push(`Observed in \`${meta.repositoryName}\` by ${GENERATOR_NAME} (schema v${SCHEMA_VERSION}).`);
8
+ lines.push('');
9
+ lines.push('Each statement is a counted observation over the repository, not a guess: the confidence and the');
10
+ lines.push('evidence behind it are listed. Statements marked `config` come from declared configuration files.');
11
+ lines.push('');
12
+ if (meta.generatedAt !== undefined) {
13
+ lines.push(`Generated at: ${meta.generatedAt}`);
14
+ lines.push('');
15
+ }
16
+ const categories = [];
17
+ for (const convention of conventions) {
18
+ if (!categories.includes(convention.category))
19
+ categories.push(convention.category);
20
+ }
21
+ if (categories.length === 0) {
22
+ lines.push('_No conventions were detected: the repository is either too small or has no analyzable source files._');
23
+ lines.push('');
24
+ return `${lines.join('\n')}\n`;
25
+ }
26
+ for (const category of categories) {
27
+ lines.push(`## ${category}`);
28
+ lines.push('');
29
+ for (const convention of conventions.filter((entry) => entry.category === category)) {
30
+ lines.push(`- ${convention.statement} _(confidence ${convention.confidence.toFixed(2)}, ${convention.origin})_`);
31
+ for (const evidence of convention.evidence) {
32
+ lines.push(` - evidence: \`${evidence.source}\` — ${evidence.detail}`);
33
+ }
34
+ }
35
+ lines.push('');
36
+ }
37
+ lines.push('---');
38
+ lines.push('');
39
+ lines.push(`Machine readable form: \`.agent/conventions.json\` (schema v${SCHEMA_VERSION}).`);
40
+ return `${lines.join('\n')}\n`;
41
+ }
42
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../src/core/conventions/renderer.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAQvE,yDAAyD;AACzD,MAAM,UAAU,yBAAyB,CACvC,WAAkC,EAClC,IAA6B;IAE7B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACvC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,cAAc,SAAS,cAAc,aAAa,cAAc,IAAI,CAAC,CAAC;IACvG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CACR,kGAAkG,CACnG,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,mGAAmG,CAAC,CAAC;IAChH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACtF,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,uGAAuG,CAAC,CAAC;QACpH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACjC,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,UAAU,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE,CAAC;YACpF,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,SAAS,iBAAiB,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC;YACjH,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,mBAAmB,QAAQ,CAAC,MAAM,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,+DAA+D,cAAc,IAAI,CAAC,CAAC;IAC9F,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Decision (ADR) detection.
3
+ *
4
+ * Rules of honesty enforced here:
5
+ * - decisions found in human authored documents are `origin: "explicit"`;
6
+ * - decisions derived from configuration or git history are `origin: "inferred"`
7
+ * and say so, with the evidence (file, commit sha, commit subject) attached;
8
+ * - nothing is invented: an ADR without a status is reported as `status: unknown`.
9
+ *
10
+ * Sources: `docs/`, `adr/`, `architecture/`, `README.md` sections and git history.
11
+ */
12
+ import type { Decision, DecisionStatus } from '../../model/types.ts';
13
+ import type { ParsedFile } from '../../adapters/language/types.ts';
14
+ import type { GitCommit } from '../../adapters/git/git-adapter.ts';
15
+ import type { Repository } from '../../model/types.ts';
16
+ export interface DecisionDetectionInput {
17
+ repository: Repository;
18
+ parsed: Map<string, ParsedFile>;
19
+ /** Commits inside the configured git window (empty when git is unavailable). */
20
+ gitCommits: GitCommit[];
21
+ /** Patterns that mark a commit message as an architectural change signal. */
22
+ architectureSignalPatterns: string[];
23
+ }
24
+ interface AdrCandidate {
25
+ path: string;
26
+ id: string;
27
+ title: string;
28
+ status: DecisionStatus;
29
+ excerpt: string;
30
+ explicitId: boolean;
31
+ }
32
+ /** Extracts an ADR from a markdown document, when the document looks like one. */
33
+ export declare function parseAdrDocument(path: string, file: ParsedFile): AdrCandidate | null;
34
+ /** Explicit decisions: ADR documents and dedicated architecture documentation. */
35
+ export declare function detectExplicitDecisions(input: DecisionDetectionInput): Decision[];
36
+ /** Configuration and dependency facts presented as *inferred* decisions. */
37
+ export declare function detectConfigDecisions(input: DecisionDetectionInput): Decision[];
38
+ /** Architectural change signals from git history, clearly marked as inferred. */
39
+ export declare function detectGitDecisions(input: DecisionDetectionInput): Decision[];
40
+ /** Runs every decision detector; explicit decisions win id conflicts. */
41
+ export declare function detectDecisions(input: DecisionDetectionInput): Decision[];
42
+ /** Paths of ADR documents, used by `explain` and search. */
43
+ export declare function collectAdrPaths(parsed: Map<string, ParsedFile>): string[];
44
+ export {};
45
+ //# sourceMappingURL=detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../../src/core/decisions/detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAsBvD,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAChC,gFAAgF;IAChF,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,6EAA6E;IAC7E,0BAA0B,EAAE,MAAM,EAAE,CAAC;CACtC;AAWD,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAqCpF;AAED,kFAAkF;AAClF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,sBAAsB,GAAG,QAAQ,EAAE,CAiEjF;AAED,4EAA4E;AAC5E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,GAAG,QAAQ,EAAE,CAgF/E;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,GAAG,QAAQ,EAAE,CA0B5E;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,KAAK,EAAE,sBAAsB,GAAG,QAAQ,EAAE,CAUzE;AAED,4DAA4D;AAC5D,wBAAgB,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,EAAE,CAKzE"}