autodocs-engine 0.5.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 (240) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +185 -0
  3. package/dist/analysis-builder.d.ts +13 -0
  4. package/dist/analysis-builder.js +268 -0
  5. package/dist/analysis-builder.js.map +1 -0
  6. package/dist/anti-pattern-detector.d.ts +9 -0
  7. package/dist/anti-pattern-detector.js +58 -0
  8. package/dist/anti-pattern-detector.js.map +1 -0
  9. package/dist/architecture-detector.d.ts +7 -0
  10. package/dist/architecture-detector.js +212 -0
  11. package/dist/architecture-detector.js.map +1 -0
  12. package/dist/ast-parser.d.ts +5 -0
  13. package/dist/ast-parser.js +635 -0
  14. package/dist/ast-parser.js.map +1 -0
  15. package/dist/benchmark/code-generator.d.ts +20 -0
  16. package/dist/benchmark/code-generator.js +206 -0
  17. package/dist/benchmark/code-generator.js.map +1 -0
  18. package/dist/benchmark/pr-miner.d.ts +61 -0
  19. package/dist/benchmark/pr-miner.js +304 -0
  20. package/dist/benchmark/pr-miner.js.map +1 -0
  21. package/dist/benchmark/pr-runner.d.ts +58 -0
  22. package/dist/benchmark/pr-runner.js +346 -0
  23. package/dist/benchmark/pr-runner.js.map +1 -0
  24. package/dist/benchmark/pr-scorer.d.ts +48 -0
  25. package/dist/benchmark/pr-scorer.js +222 -0
  26. package/dist/benchmark/pr-scorer.js.map +1 -0
  27. package/dist/benchmark/pr-task-gen.d.ts +16 -0
  28. package/dist/benchmark/pr-task-gen.js +129 -0
  29. package/dist/benchmark/pr-task-gen.js.map +1 -0
  30. package/dist/benchmark/report.d.ts +9 -0
  31. package/dist/benchmark/report.js +131 -0
  32. package/dist/benchmark/report.js.map +1 -0
  33. package/dist/benchmark/runner.d.ts +6 -0
  34. package/dist/benchmark/runner.js +183 -0
  35. package/dist/benchmark/runner.js.map +1 -0
  36. package/dist/benchmark/scorer.d.ts +6 -0
  37. package/dist/benchmark/scorer.js +549 -0
  38. package/dist/benchmark/scorer.js.map +1 -0
  39. package/dist/benchmark/shuffler.d.ts +5 -0
  40. package/dist/benchmark/shuffler.js +70 -0
  41. package/dist/benchmark/shuffler.js.map +1 -0
  42. package/dist/benchmark/statistics.d.ts +36 -0
  43. package/dist/benchmark/statistics.js +159 -0
  44. package/dist/benchmark/statistics.js.map +1 -0
  45. package/dist/benchmark/task-generator.d.ts +20 -0
  46. package/dist/benchmark/task-generator.js +388 -0
  47. package/dist/benchmark/task-generator.js.map +1 -0
  48. package/dist/benchmark/types.d.ts +111 -0
  49. package/dist/benchmark/types.js +3 -0
  50. package/dist/benchmark/types.js.map +1 -0
  51. package/dist/bin/autodocs-engine.d.ts +2 -0
  52. package/dist/bin/autodocs-engine.js +296 -0
  53. package/dist/bin/autodocs-engine.js.map +1 -0
  54. package/dist/bin/benchmark.d.ts +14 -0
  55. package/dist/bin/benchmark.js +172 -0
  56. package/dist/bin/benchmark.js.map +1 -0
  57. package/dist/bin/check.d.ts +13 -0
  58. package/dist/bin/check.js +79 -0
  59. package/dist/bin/check.js.map +1 -0
  60. package/dist/bin/init.d.ts +11 -0
  61. package/dist/bin/init.js +268 -0
  62. package/dist/bin/init.js.map +1 -0
  63. package/dist/bin/serve.d.ts +4 -0
  64. package/dist/bin/serve.js +29 -0
  65. package/dist/bin/serve.js.map +1 -0
  66. package/dist/budget-validator.d.ts +22 -0
  67. package/dist/budget-validator.js +119 -0
  68. package/dist/budget-validator.js.map +1 -0
  69. package/dist/command-extractor.d.ts +10 -0
  70. package/dist/command-extractor.js +276 -0
  71. package/dist/command-extractor.js.map +1 -0
  72. package/dist/config-analyzer.d.ts +5 -0
  73. package/dist/config-analyzer.js +364 -0
  74. package/dist/config-analyzer.js.map +1 -0
  75. package/dist/config.d.ts +33 -0
  76. package/dist/config.js +172 -0
  77. package/dist/config.js.map +1 -0
  78. package/dist/contribution-patterns.d.ts +6 -0
  79. package/dist/contribution-patterns.js +263 -0
  80. package/dist/contribution-patterns.js.map +1 -0
  81. package/dist/convention-extractor.d.ts +17 -0
  82. package/dist/convention-extractor.js +90 -0
  83. package/dist/convention-extractor.js.map +1 -0
  84. package/dist/cross-package.d.ts +5 -0
  85. package/dist/cross-package.js +71 -0
  86. package/dist/cross-package.js.map +1 -0
  87. package/dist/dependency-analyzer.d.ts +5 -0
  88. package/dist/dependency-analyzer.js +233 -0
  89. package/dist/dependency-analyzer.js.map +1 -0
  90. package/dist/detectors/build-tool.d.ts +2 -0
  91. package/dist/detectors/build-tool.js +67 -0
  92. package/dist/detectors/build-tool.js.map +1 -0
  93. package/dist/detectors/component-patterns.d.ts +2 -0
  94. package/dist/detectors/component-patterns.js +49 -0
  95. package/dist/detectors/component-patterns.js.map +1 -0
  96. package/dist/detectors/data-fetching.d.ts +2 -0
  97. package/dist/detectors/data-fetching.js +127 -0
  98. package/dist/detectors/data-fetching.js.map +1 -0
  99. package/dist/detectors/database.d.ts +2 -0
  100. package/dist/detectors/database.js +54 -0
  101. package/dist/detectors/database.js.map +1 -0
  102. package/dist/detectors/error-handling.d.ts +2 -0
  103. package/dist/detectors/error-handling.js +47 -0
  104. package/dist/detectors/error-handling.js.map +1 -0
  105. package/dist/detectors/export-patterns.d.ts +2 -0
  106. package/dist/detectors/export-patterns.js +64 -0
  107. package/dist/detectors/export-patterns.js.map +1 -0
  108. package/dist/detectors/file-naming.d.ts +2 -0
  109. package/dist/detectors/file-naming.js +74 -0
  110. package/dist/detectors/file-naming.js.map +1 -0
  111. package/dist/detectors/graphql-patterns.d.ts +2 -0
  112. package/dist/detectors/graphql-patterns.js +47 -0
  113. package/dist/detectors/graphql-patterns.js.map +1 -0
  114. package/dist/detectors/hook-patterns.d.ts +2 -0
  115. package/dist/detectors/hook-patterns.js +105 -0
  116. package/dist/detectors/hook-patterns.js.map +1 -0
  117. package/dist/detectors/import-patterns.d.ts +2 -0
  118. package/dist/detectors/import-patterns.js +88 -0
  119. package/dist/detectors/import-patterns.js.map +1 -0
  120. package/dist/detectors/telemetry-patterns.d.ts +2 -0
  121. package/dist/detectors/telemetry-patterns.js +42 -0
  122. package/dist/detectors/telemetry-patterns.js.map +1 -0
  123. package/dist/detectors/test-framework-ecosystem.d.ts +2 -0
  124. package/dist/detectors/test-framework-ecosystem.js +95 -0
  125. package/dist/detectors/test-framework-ecosystem.js.map +1 -0
  126. package/dist/detectors/test-patterns.d.ts +2 -0
  127. package/dist/detectors/test-patterns.js +60 -0
  128. package/dist/detectors/test-patterns.js.map +1 -0
  129. package/dist/detectors/web-framework.d.ts +2 -0
  130. package/dist/detectors/web-framework.js +51 -0
  131. package/dist/detectors/web-framework.js.map +1 -0
  132. package/dist/deterministic-formatter.d.ts +54 -0
  133. package/dist/deterministic-formatter.js +922 -0
  134. package/dist/deterministic-formatter.js.map +1 -0
  135. package/dist/diff-analyzer.d.ts +7 -0
  136. package/dist/diff-analyzer.js +126 -0
  137. package/dist/diff-analyzer.js.map +1 -0
  138. package/dist/example-extractor.d.ts +6 -0
  139. package/dist/example-extractor.js +115 -0
  140. package/dist/example-extractor.js.map +1 -0
  141. package/dist/existing-docs.d.ts +36 -0
  142. package/dist/existing-docs.js +257 -0
  143. package/dist/existing-docs.js.map +1 -0
  144. package/dist/file-discovery.d.ts +6 -0
  145. package/dist/file-discovery.js +154 -0
  146. package/dist/file-discovery.js.map +1 -0
  147. package/dist/git-history.d.ts +41 -0
  148. package/dist/git-history.js +401 -0
  149. package/dist/git-history.js.map +1 -0
  150. package/dist/impact-classifier.d.ts +22 -0
  151. package/dist/impact-classifier.js +87 -0
  152. package/dist/impact-classifier.js.map +1 -0
  153. package/dist/impact-radius.d.ts +23 -0
  154. package/dist/impact-radius.js +130 -0
  155. package/dist/impact-radius.js.map +1 -0
  156. package/dist/import-chain.d.ts +12 -0
  157. package/dist/import-chain.js +93 -0
  158. package/dist/import-chain.js.map +1 -0
  159. package/dist/index.d.ts +40 -0
  160. package/dist/index.js +72 -0
  161. package/dist/index.js.map +1 -0
  162. package/dist/inferability.d.ts +16 -0
  163. package/dist/inferability.js +142 -0
  164. package/dist/inferability.js.map +1 -0
  165. package/dist/llm/adapter.d.ts +33 -0
  166. package/dist/llm/adapter.js +202 -0
  167. package/dist/llm/adapter.js.map +1 -0
  168. package/dist/llm/client.d.ts +5 -0
  169. package/dist/llm/client.js +68 -0
  170. package/dist/llm/client.js.map +1 -0
  171. package/dist/llm/hierarchical.d.ts +23 -0
  172. package/dist/llm/hierarchical.js +126 -0
  173. package/dist/llm/hierarchical.js.map +1 -0
  174. package/dist/llm/serializer.d.ts +19 -0
  175. package/dist/llm/serializer.js +363 -0
  176. package/dist/llm/serializer.js.map +1 -0
  177. package/dist/llm/template-selector.d.ts +7 -0
  178. package/dist/llm/template-selector.js +21 -0
  179. package/dist/llm/template-selector.js.map +1 -0
  180. package/dist/llm-adapter.d.ts +2 -0
  181. package/dist/llm-adapter.js +5 -0
  182. package/dist/llm-adapter.js.map +1 -0
  183. package/dist/mcp/cache.d.ts +30 -0
  184. package/dist/mcp/cache.js +112 -0
  185. package/dist/mcp/cache.js.map +1 -0
  186. package/dist/mcp/errors.d.ts +21 -0
  187. package/dist/mcp/errors.js +27 -0
  188. package/dist/mcp/errors.js.map +1 -0
  189. package/dist/mcp/queries.d.ts +27 -0
  190. package/dist/mcp/queries.js +121 -0
  191. package/dist/mcp/queries.js.map +1 -0
  192. package/dist/mcp/server.d.ts +14 -0
  193. package/dist/mcp/server.js +131 -0
  194. package/dist/mcp/server.js.map +1 -0
  195. package/dist/mcp/tools.d.ts +39 -0
  196. package/dist/mcp/tools.js +249 -0
  197. package/dist/mcp/tools.js.map +1 -0
  198. package/dist/mermaid-generator.d.ts +6 -0
  199. package/dist/mermaid-generator.js +59 -0
  200. package/dist/mermaid-generator.js.map +1 -0
  201. package/dist/meta-tool-detector.d.ts +23 -0
  202. package/dist/meta-tool-detector.js +177 -0
  203. package/dist/meta-tool-detector.js.map +1 -0
  204. package/dist/output-validator.d.ts +6 -0
  205. package/dist/output-validator.js +471 -0
  206. package/dist/output-validator.js.map +1 -0
  207. package/dist/pattern-fingerprinter.d.ts +7 -0
  208. package/dist/pattern-fingerprinter.js +241 -0
  209. package/dist/pattern-fingerprinter.js.map +1 -0
  210. package/dist/pipeline.d.ts +5 -0
  211. package/dist/pipeline.js +374 -0
  212. package/dist/pipeline.js.map +1 -0
  213. package/dist/plugin-loader.d.ts +19 -0
  214. package/dist/plugin-loader.js +124 -0
  215. package/dist/plugin-loader.js.map +1 -0
  216. package/dist/role-inferrer.d.ts +5 -0
  217. package/dist/role-inferrer.js +159 -0
  218. package/dist/role-inferrer.js.map +1 -0
  219. package/dist/symbol-graph.d.ts +11 -0
  220. package/dist/symbol-graph.js +613 -0
  221. package/dist/symbol-graph.js.map +1 -0
  222. package/dist/templates/agents-md.d.ts +20 -0
  223. package/dist/templates/agents-md.js +346 -0
  224. package/dist/templates/agents-md.js.map +1 -0
  225. package/dist/templates/claude-md.d.ts +4 -0
  226. package/dist/templates/claude-md.js +23 -0
  227. package/dist/templates/claude-md.js.map +1 -0
  228. package/dist/templates/cursorrules.d.ts +4 -0
  229. package/dist/templates/cursorrules.js +18 -0
  230. package/dist/templates/cursorrules.js.map +1 -0
  231. package/dist/tier-classifier.d.ts +7 -0
  232. package/dist/tier-classifier.js +32 -0
  233. package/dist/tier-classifier.js.map +1 -0
  234. package/dist/types.d.ts +428 -0
  235. package/dist/types.js +42 -0
  236. package/dist/types.js.map +1 -0
  237. package/dist/workflow-rules.d.ts +18 -0
  238. package/dist/workflow-rules.js +131 -0
  239. package/dist/workflow-rules.js.map +1 -0
  240. package/package.json +62 -0
@@ -0,0 +1,388 @@
1
+ // src/benchmark/task-generator.ts — Generate benchmark tasks from ContributionPatterns
2
+ // Tasks are self-referential: the engine tests whether its own AGENTS.md helps AI follow
3
+ // the patterns the engine detected.
4
+ import { readFileSync, readdirSync, statSync } from "node:fs";
5
+ import { join, basename, relative } from "node:path";
6
+ import { SOURCE_EXTENSIONS } from "../types.js";
7
+ // ─── Constants ───────────────────────────────────────────────────────────────
8
+ const MAX_SIBLING_LINES = 100;
9
+ const TASK_NAME_POOL = [
10
+ "import-ordering", "error-boundary", "accessibility", "keyboard-navigation",
11
+ "dark-mode", "internationalization", "pagination", "search-filter",
12
+ "form-validation", "notification", "authentication", "rate-limiting",
13
+ "caching", "retry-logic", "health-check", "metric-collection",
14
+ ];
15
+ // ─── Public API ──────────────────────────────────────────────────────────────
16
+ /**
17
+ * Generate benchmark tasks from analysis results.
18
+ * Returns tasks sorted by tier (A > B > C) with deterministic sibling selection.
19
+ */
20
+ export function generateTasksFromAnalysis(analysis, repoPath, maxTasks = 20) {
21
+ const tasks = [];
22
+ for (const pkg of analysis.packages) {
23
+ const patterns = pkg.contributionPatterns ?? [];
24
+ const conventions = pkg.conventions ?? [];
25
+ const antiPatterns = pkg.antiPatterns ?? [];
26
+ const pkgPath = join(repoPath, pkg.relativePath);
27
+ for (const pattern of patterns) {
28
+ const tier = classifyTier(pattern);
29
+ const task = generateTaskFromPattern(pattern, pkg.name, pkgPath, tier, conventions, antiPatterns);
30
+ if (task)
31
+ tasks.push(task);
32
+ }
33
+ // Command tasks — generate from pkg.commands
34
+ const cmdTasks = generateCommandTasks(pkg, pkgPath, conventions, antiPatterns);
35
+ tasks.push(...cmdTasks);
36
+ // Architecture tasks — generate from pkg.architecture.directories
37
+ const archTasks = generateArchitectureTasks(pkg, pkgPath, conventions, antiPatterns);
38
+ tasks.push(...archTasks);
39
+ }
40
+ // Sort by tier quality (A first), then by maxScoringPoints descending
41
+ tasks.sort((a, b) => {
42
+ const tierOrder = { A: 0, B: 1, C: 2 };
43
+ const tierDiff = tierOrder[a.tier] - tierOrder[b.tier];
44
+ if (tierDiff !== 0)
45
+ return tierDiff;
46
+ return b.maxScoringPoints - a.maxScoringPoints;
47
+ });
48
+ return tasks.slice(0, maxTasks);
49
+ }
50
+ /**
51
+ * Classify a ContributionPattern into a tier based on deep signal richness.
52
+ */
53
+ export function classifyTier(pattern) {
54
+ const hasCommonImports = (pattern.commonImports?.length ?? 0) > 0;
55
+ const hasExportSuffix = !!pattern.exportSuffix;
56
+ const hasRegistration = !!pattern.registrationFile;
57
+ const signals = [hasCommonImports, hasExportSuffix, hasRegistration].filter(Boolean).length;
58
+ if (signals === 3)
59
+ return "A";
60
+ if (signals >= 1)
61
+ return "B";
62
+ return "C";
63
+ }
64
+ // ─── Task Generation ─────────────────────────────────────────────────────────
65
+ function generateTaskFromPattern(pattern, packageName, pkgPath, tier, conventions, antiPatterns) {
66
+ const absDir = join(pkgPath, pattern.directory);
67
+ // Derive a task name that doesn't collide with existing files
68
+ const taskName = deriveTaskName(pattern, absDir);
69
+ if (!taskName)
70
+ return null;
71
+ // Build the prompt (deliberately vague — AGENTS.md should fill in the details)
72
+ const prompt = buildTaskPrompt(pattern, taskName, packageName);
73
+ // Collect context files (siblings, registration, barrel)
74
+ const context = collectContext(pattern, pkgPath, absDir);
75
+ // Calculate max scoring points based on tier
76
+ const maxPoints = tier === "A" ? 25 : tier === "B" ? 18 : 12;
77
+ return {
78
+ id: `pattern-${pattern.directory.replace(/\//g, "-")}-${taskName}`,
79
+ repoPath: pkgPath,
80
+ packageName,
81
+ tier,
82
+ taskType: "pattern",
83
+ prompt,
84
+ contributionPattern: pattern,
85
+ conventions,
86
+ antiPatterns,
87
+ expectedDirectory: pattern.directory,
88
+ expectedFilePattern: pattern.filePattern,
89
+ maxScoringPoints: maxPoints,
90
+ context,
91
+ };
92
+ }
93
+ /**
94
+ * Derive a plausible task name that doesn't collide with existing exports.
95
+ */
96
+ export function deriveTaskName(pattern, absDir) {
97
+ // List existing files in the directory
98
+ let existingFiles = [];
99
+ try {
100
+ existingFiles = readdirSync(absDir)
101
+ .filter(f => SOURCE_EXTENSIONS.test(f))
102
+ .map(f => basename(f, f.slice(f.lastIndexOf("."))));
103
+ }
104
+ catch {
105
+ return null;
106
+ }
107
+ const existing = new Set(existingFiles.map(f => f.toLowerCase()));
108
+ // Try names from the pool, applying the pattern's naming convention
109
+ for (const candidate of TASK_NAME_POOL) {
110
+ const name = pattern.exportSuffix
111
+ ? candidate // Will get suffix applied later
112
+ : candidate;
113
+ if (!existing.has(name.toLowerCase())) {
114
+ return name;
115
+ }
116
+ }
117
+ return null;
118
+ }
119
+ function buildTaskPrompt(pattern, taskName, packageName) {
120
+ const typeLabel = pattern.type === "function" ? "utility function"
121
+ : pattern.type === "hook" ? "React hook"
122
+ : pattern.type === "component" ? "React component"
123
+ : pattern.type;
124
+ // Deliberately vague — doesn't mention imports, suffixes, or registration
125
+ return `Add a new ${typeLabel} for "${taskName}" to the ${packageName} project. `
126
+ + `It should handle ${taskName.replace(/-/g, " ")} functionality. `
127
+ + `Include implementation, any necessary registration or re-exports, and a test file.`;
128
+ }
129
+ // ─── Context Collection ──────────────────────────────────────────────────────
130
+ /**
131
+ * Collect context files for benchmark conditions.
132
+ * Deterministic sibling selection: exampleFile + most recent + median-dated.
133
+ */
134
+ export function collectContext(pattern, pkgPath, absDir) {
135
+ const siblingFiles = selectSiblings(pattern, pkgPath, absDir);
136
+ const directoryListing = listDirectory(absDir);
137
+ let registrationFile;
138
+ if (pattern.registrationFile) {
139
+ const regPath = join(pkgPath, pattern.registrationFile);
140
+ try {
141
+ registrationFile = {
142
+ path: pattern.registrationFile,
143
+ content: readFileSync(regPath, "utf-8"),
144
+ };
145
+ }
146
+ catch { /* file doesn't exist */ }
147
+ }
148
+ // Find barrel file (index.ts in directory or parent)
149
+ let barrelFile;
150
+ for (const candidate of ["index.ts", "index.tsx", "../index.ts"]) {
151
+ const barrelPath = join(absDir, candidate);
152
+ try {
153
+ const content = readFileSync(barrelPath, "utf-8");
154
+ barrelFile = {
155
+ path: relative(pkgPath, barrelPath),
156
+ content,
157
+ };
158
+ break;
159
+ }
160
+ catch { /* try next */ }
161
+ }
162
+ return { siblingFiles, registrationFile, barrelFile, directoryListing };
163
+ }
164
+ /**
165
+ * Deterministic sibling selection algorithm.
166
+ * 1. Always include exampleFile
167
+ * 2. Most recently modified non-example sibling
168
+ * 3. If 5+ files, add median-dated file
169
+ */
170
+ function selectSiblings(pattern, pkgPath, absDir) {
171
+ const result = [];
172
+ // 1. Always include the example file
173
+ const examplePath = join(pkgPath, pattern.exampleFile);
174
+ try {
175
+ result.push({
176
+ path: pattern.exampleFile,
177
+ content: truncateFile(readFileSync(examplePath, "utf-8")),
178
+ });
179
+ }
180
+ catch { /* missing */ }
181
+ // List all source files in directory, with modification times
182
+ let filesWithMtime = [];
183
+ try {
184
+ filesWithMtime = readdirSync(absDir)
185
+ .filter(f => SOURCE_EXTENSIONS.test(f) && !f.includes(".test.") && !f.includes(".spec.") && f !== "index.ts" && f !== "index.tsx")
186
+ .map(f => {
187
+ try {
188
+ return { name: f, mtime: statSync(join(absDir, f)).mtimeMs };
189
+ }
190
+ catch {
191
+ return { name: f, mtime: 0 };
192
+ }
193
+ })
194
+ .filter(f => {
195
+ const relPath = relative(pkgPath, join(absDir, f.name));
196
+ return relPath !== pattern.exampleFile;
197
+ })
198
+ .sort((a, b) => b.mtime - a.mtime);
199
+ }
200
+ catch { /* dir read error */ }
201
+ // 2. Most recently modified non-example sibling
202
+ if (filesWithMtime.length > 0) {
203
+ const newest = filesWithMtime[0];
204
+ const newestPath = join(absDir, newest.name);
205
+ try {
206
+ result.push({
207
+ path: relative(pkgPath, newestPath),
208
+ content: truncateFile(readFileSync(newestPath, "utf-8")),
209
+ });
210
+ }
211
+ catch { /* read error */ }
212
+ }
213
+ // 3. If 5+ files, add median-dated file
214
+ if (filesWithMtime.length >= 4) {
215
+ const medianIdx = Math.floor(filesWithMtime.length / 2);
216
+ const median = filesWithMtime[medianIdx];
217
+ const medianPath = join(absDir, median.name);
218
+ // Skip if same as newest
219
+ if (median.name !== filesWithMtime[0]?.name) {
220
+ try {
221
+ result.push({
222
+ path: relative(pkgPath, medianPath),
223
+ content: truncateFile(readFileSync(medianPath, "utf-8")),
224
+ });
225
+ }
226
+ catch { /* read error */ }
227
+ }
228
+ }
229
+ return result;
230
+ }
231
+ function listDirectory(absDir) {
232
+ try {
233
+ return readdirSync(absDir)
234
+ .filter(f => SOURCE_EXTENSIONS.test(f))
235
+ .sort();
236
+ }
237
+ catch {
238
+ return [];
239
+ }
240
+ }
241
+ function truncateFile(content) {
242
+ const lines = content.split("\n");
243
+ if (lines.length <= MAX_SIBLING_LINES)
244
+ return content;
245
+ return lines.slice(0, MAX_SIBLING_LINES).join("\n") + "\n// ... truncated";
246
+ }
247
+ // ─── Command Task Generation ─────────────────────────────────────────────────
248
+ const COMMAND_TASK_PROMPTS = [
249
+ {
250
+ id: "ci-workflow",
251
+ prompt: (pkg) => `Write a GitHub Actions CI workflow (YAML) for the ${pkg} project that runs the standard build, test, and lint commands. Use the correct package manager and exact script names from this project.`,
252
+ },
253
+ {
254
+ id: "pre-commit",
255
+ prompt: (pkg) => `Write a shell script that acts as a pre-commit hook for the ${pkg} project. It should run the project's lint and type-check commands before allowing a commit.`,
256
+ },
257
+ ];
258
+ function generateCommandTasks(pkg, pkgPath, conventions, antiPatterns) {
259
+ const commands = pkg.commands;
260
+ if (!commands)
261
+ return [];
262
+ // Need at least build + test
263
+ const availableCommands = [];
264
+ if (commands.build)
265
+ availableCommands.push(commands.build.run);
266
+ if (commands.test)
267
+ availableCommands.push(commands.test.run);
268
+ if (commands.lint)
269
+ availableCommands.push(commands.lint.run);
270
+ if (commands.start)
271
+ availableCommands.push(commands.start.run);
272
+ if (availableCommands.length < 2)
273
+ return [];
274
+ const allNames = [];
275
+ if (commands.build)
276
+ allNames.push("build");
277
+ if (commands.test)
278
+ allNames.push("test");
279
+ if (commands.lint)
280
+ allNames.push("lint");
281
+ if (commands.start)
282
+ allNames.push("start");
283
+ for (const cmd of commands.other) {
284
+ allNames.push(cmd.run.split(" ").pop() ?? cmd.run);
285
+ }
286
+ const tier = availableCommands.length >= 4 ? "A" : availableCommands.length >= 3 ? "B" : "C";
287
+ // Read package.json scripts for condition B context
288
+ let packageJsonScripts = "";
289
+ try {
290
+ const pkgJson = JSON.parse(readFileSync(join(pkgPath, "package.json"), "utf-8"));
291
+ if (pkgJson.scripts) {
292
+ packageJsonScripts = JSON.stringify(pkgJson.scripts, null, 2);
293
+ }
294
+ }
295
+ catch { /* no package.json */ }
296
+ const dirListing = listDirectory(join(pkgPath, "src")) ?? listDirectory(pkgPath);
297
+ const taskDef = COMMAND_TASK_PROMPTS[0]; // CI workflow task
298
+ return [{
299
+ id: `command-${taskDef.id}`,
300
+ repoPath: pkgPath,
301
+ packageName: pkg.name,
302
+ tier,
303
+ taskType: "command",
304
+ prompt: taskDef.prompt(pkg.name),
305
+ conventions,
306
+ antiPatterns,
307
+ expectedDirectory: "",
308
+ expectedFilePattern: "",
309
+ maxScoringPoints: 8,
310
+ context: {
311
+ siblingFiles: packageJsonScripts ? [{ path: "package.json (scripts)", content: packageJsonScripts }] : [],
312
+ directoryListing: dirListing,
313
+ },
314
+ commandData: {
315
+ expectedCommands: availableCommands,
316
+ packageManager: commands.packageManager,
317
+ allCommandNames: allNames,
318
+ },
319
+ }];
320
+ }
321
+ // ─── Architecture Task Generation ────────────────────────────────────────────
322
+ const ARCHITECTURE_FEATURE_MAP = {
323
+ "hooks": { feature: "a new React hook for clipboard management", keywords: ["hooks", "hook", "use"] },
324
+ "components": { feature: "a new UI component for notifications", keywords: ["components", "component", "ui"] },
325
+ "utils": { feature: "a new utility function for string formatting", keywords: ["utils", "utilities", "helpers"] },
326
+ "middleware": { feature: "new authentication middleware", keywords: ["middleware", "interceptor"] },
327
+ "api": { feature: "a new REST API endpoint for user preferences", keywords: ["api", "routes", "endpoints", "handlers"] },
328
+ "services": { feature: "a new service for email notifications", keywords: ["services", "service"] },
329
+ "detectors": { feature: "a new convention detector for import patterns", keywords: ["detectors", "detector", "plugins"] },
330
+ "lib": { feature: "a new shared library module", keywords: ["lib", "core", "shared"] },
331
+ "types": { feature: "new TypeScript type definitions for configuration", keywords: ["types", "interfaces", "models"] },
332
+ "test": { feature: "new integration test helpers", keywords: ["test", "tests", "testing", "spec"] },
333
+ };
334
+ function generateArchitectureTasks(pkg, pkgPath, conventions, antiPatterns) {
335
+ const arch = pkg.architecture;
336
+ if (!arch || arch.directories.length < 3)
337
+ return [];
338
+ const tasks = [];
339
+ const dirListing = listDirectory(join(pkgPath, "src")) ?? listDirectory(pkgPath);
340
+ const allDirNames = arch.directories.map(d => d.path);
341
+ // Find directories that match our feature map
342
+ for (const dir of arch.directories) {
343
+ const dirName = dir.path.split("/").filter(Boolean).pop()?.toLowerCase() ?? "";
344
+ // Find a matching feature for this directory
345
+ let featureMatch;
346
+ for (const [key, value] of Object.entries(ARCHITECTURE_FEATURE_MAP)) {
347
+ if (value.keywords.some(k => dirName.includes(k))) {
348
+ featureMatch = value;
349
+ break;
350
+ }
351
+ }
352
+ if (!featureMatch)
353
+ continue;
354
+ // Find alternative acceptable directories
355
+ const alternatives = arch.directories
356
+ .filter(d => d.path !== dir.path && d.purpose?.toLowerCase().includes(dirName))
357
+ .map(d => d.path);
358
+ const tier = arch.directories.length >= 5 ? "A" : "B";
359
+ tasks.push({
360
+ id: `architecture-${dirName}`,
361
+ repoPath: pkgPath,
362
+ packageName: pkg.name,
363
+ tier,
364
+ taskType: "architecture",
365
+ prompt: `You need to add ${featureMatch.feature} to the ${pkg.name} project. `
366
+ + `Which directory should this code go in? Respond with the directory path and a brief justification for your choice.`,
367
+ conventions,
368
+ antiPatterns,
369
+ expectedDirectory: dir.path,
370
+ expectedFilePattern: "",
371
+ maxScoringPoints: 8,
372
+ context: {
373
+ siblingFiles: [],
374
+ directoryListing: dirListing,
375
+ },
376
+ architectureData: {
377
+ expectedDirectory: dir.path,
378
+ directoryPurpose: dir.purpose,
379
+ alternatives,
380
+ allDirectories: allDirNames,
381
+ },
382
+ });
383
+ if (tasks.length >= 2)
384
+ break; // Max 2 architecture tasks per package
385
+ }
386
+ return tasks;
387
+ }
388
+ //# sourceMappingURL=task-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-generator.js","sourceRoot":"","sources":["../../src/benchmark/task-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import type { ContributionPattern, Convention, AntiPattern } from "../types.js";
2
+ export type BenchmarkCondition = "treatment" | "realistic-control" | "impoverished-control" | "negative-control";
3
+ export type TaskTier = "A" | "B" | "C";
4
+ export type TaskType = "pattern" | "command" | "architecture";
5
+ export interface BenchmarkTask {
6
+ id: string;
7
+ repoPath: string;
8
+ packageName: string;
9
+ tier: TaskTier;
10
+ taskType: TaskType;
11
+ prompt: string;
12
+ contributionPattern?: ContributionPattern;
13
+ conventions: Convention[];
14
+ antiPatterns: AntiPattern[];
15
+ expectedDirectory: string;
16
+ expectedFilePattern: string;
17
+ maxScoringPoints: number;
18
+ context: TaskContext;
19
+ commandData?: {
20
+ expectedCommands: string[];
21
+ packageManager: string;
22
+ allCommandNames: string[];
23
+ };
24
+ architectureData?: {
25
+ expectedDirectory: string;
26
+ directoryPurpose: string;
27
+ alternatives?: string[];
28
+ allDirectories: string[];
29
+ };
30
+ }
31
+ export interface TaskContext {
32
+ siblingFiles: {
33
+ path: string;
34
+ content: string;
35
+ }[];
36
+ registrationFile?: {
37
+ path: string;
38
+ content: string;
39
+ };
40
+ barrelFile?: {
41
+ path: string;
42
+ content: string;
43
+ };
44
+ directoryListing: string[];
45
+ }
46
+ export interface BenchmarkResults {
47
+ meta: {
48
+ engineVersion: string;
49
+ model: string;
50
+ repoPath: string;
51
+ timestamp: string;
52
+ mode: "quick" | "full";
53
+ conditions: BenchmarkCondition[];
54
+ };
55
+ summary: ConditionSummary;
56
+ tasks: TaskResult[];
57
+ }
58
+ export interface ConditionSummary {
59
+ tasksRun: number;
60
+ conditions: Record<BenchmarkCondition, {
61
+ meanScore: number;
62
+ passRate: number;
63
+ scores: number[];
64
+ meanTokens: number;
65
+ }>;
66
+ headlineDelta: number;
67
+ upperBoundDelta: number;
68
+ pValue?: number;
69
+ effectSize?: number;
70
+ ci95?: [number, number];
71
+ }
72
+ export interface TaskResult {
73
+ taskId: string;
74
+ tier: TaskTier;
75
+ taskType: TaskType;
76
+ prompt: string;
77
+ results: Record<BenchmarkCondition, RunResult>;
78
+ }
79
+ export interface RunResult {
80
+ score: number;
81
+ rawScore: number;
82
+ maxPoints: number;
83
+ passed: boolean;
84
+ checks: CheckResult[];
85
+ filesCreated: string[];
86
+ tokensUsed: number;
87
+ latencyMs: number;
88
+ error?: string;
89
+ }
90
+ export interface CheckResult {
91
+ name: string;
92
+ category: "convention" | "integration" | "structure" | "quality" | "command" | "architecture";
93
+ weight: number;
94
+ score: number;
95
+ passed: boolean;
96
+ detail: string;
97
+ }
98
+ export interface BenchmarkOptions {
99
+ repoPath: string;
100
+ rootDir?: string;
101
+ mode: "quick" | "full";
102
+ model?: string;
103
+ outputDir?: string;
104
+ verbose?: boolean;
105
+ dryRun?: boolean;
106
+ maxTasks?: number;
107
+ }
108
+ export interface GeneratedFile {
109
+ path: string;
110
+ content: string;
111
+ }
@@ -0,0 +1,3 @@
1
+ // src/benchmark/types.ts — Benchmark system type definitions
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/benchmark/types.ts"],"names":[],"mappings":"AAAA,6DAA6D"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};