zone-ai-agent 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/.gittignore +4 -0
  2. package/README.md +36 -0
  3. package/dist/api/server.js +136 -0
  4. package/dist/api/server.js.map +1 -0
  5. package/dist/apply/applyPatchPlan.js +17 -0
  6. package/dist/apply/applyPatchPlan.js.map +1 -0
  7. package/dist/apply/canApplyDecision.js +26 -0
  8. package/dist/apply/canApplyDecision.js.map +1 -0
  9. package/dist/apply/patchPlan.js +3 -0
  10. package/dist/apply/patchPlan.js.map +1 -0
  11. package/dist/apply/renderApplyResult.js +18 -0
  12. package/dist/apply/renderApplyResult.js.map +1 -0
  13. package/dist/apply/runApplyFlow.js +40 -0
  14. package/dist/apply/runApplyFlow.js.map +1 -0
  15. package/dist/apply/types.js +3 -0
  16. package/dist/apply/types.js.map +1 -0
  17. package/dist/audit/auditDiffIntelligence.js +3 -0
  18. package/dist/audit/auditDiffIntelligence.js.map +1 -0
  19. package/dist/audit/auditSnapshot.js +87 -0
  20. package/dist/audit/auditSnapshot.js.map +1 -0
  21. package/dist/audit/renderAuditDiff.js +64 -0
  22. package/dist/audit/renderAuditDiff.js.map +1 -0
  23. package/dist/audit/snapshotDiff.js +53 -0
  24. package/dist/audit/snapshotDiff.js.map +1 -0
  25. package/dist/audit/snapshotReader.js +31 -0
  26. package/dist/audit/snapshotReader.js.map +1 -0
  27. package/dist/audit/snapshotWriter.js +59 -0
  28. package/dist/audit/snapshotWriter.js.map +1 -0
  29. package/dist/ci/evaluateCiResult.js +142 -0
  30. package/dist/ci/evaluateCiResult.js.map +1 -0
  31. package/dist/cli/buildGeneratedPatchPlanPreview.js +65 -0
  32. package/dist/cli/buildGeneratedPatchPlanPreview.js.map +1 -0
  33. package/dist/cli/colors.js +28 -0
  34. package/dist/cli/colors.js.map +1 -0
  35. package/dist/cli/diffOutput.js +37 -0
  36. package/dist/cli/diffOutput.js.map +1 -0
  37. package/dist/cli/index.js +850 -0
  38. package/dist/cli/index.js.map +1 -0
  39. package/dist/cli/loadPatchPlan.js +52 -0
  40. package/dist/cli/loadPatchPlan.js.map +1 -0
  41. package/dist/cli/output.js +34 -0
  42. package/dist/cli/output.js.map +1 -0
  43. package/dist/cli/parseCliArgs.js +3 -0
  44. package/dist/cli/parseCliArgs.js.map +1 -0
  45. package/dist/cli/runGeneratedPatchPlanFlow.js +23 -0
  46. package/dist/cli/runGeneratedPatchPlanFlow.js.map +1 -0
  47. package/dist/components/LoginForm.js +64 -0
  48. package/dist/components/LoginForm.js.map +1 -0
  49. package/dist/core/analyzeCodePatterns.js +3 -0
  50. package/dist/core/analyzeCodePatterns.js.map +1 -0
  51. package/dist/core/applyLlmPatches.js +43 -0
  52. package/dist/core/applyLlmPatches.js.map +1 -0
  53. package/dist/core/buildConfidenceBreakdownFromSignals.js +33 -0
  54. package/dist/core/buildConfidenceBreakdownFromSignals.js.map +1 -0
  55. package/dist/core/buildDecisionAuditSnapshot.js +18 -0
  56. package/dist/core/buildDecisionAuditSnapshot.js.map +1 -0
  57. package/dist/core/buildDecisionTrace.js +113 -0
  58. package/dist/core/buildDecisionTrace.js.map +1 -0
  59. package/dist/core/buildFallbackPatchPlan.js +23 -0
  60. package/dist/core/buildFallbackPatchPlan.js.map +1 -0
  61. package/dist/core/buildFallbackPlan.js +25 -0
  62. package/dist/core/buildFallbackPlan.js.map +1 -0
  63. package/dist/core/buildSchemaAwareContext.js +49 -0
  64. package/dist/core/buildSchemaAwareContext.js.map +1 -0
  65. package/dist/core/buildTaskExecutionContext.js +70 -0
  66. package/dist/core/buildTaskExecutionContext.js.map +1 -0
  67. package/dist/core/ciEvaluator.js +83 -0
  68. package/dist/core/ciEvaluator.js.map +1 -0
  69. package/dist/core/computeRiskScore.js +43 -0
  70. package/dist/core/computeRiskScore.js.map +1 -0
  71. package/dist/core/computeRiskScoreDetails.js +106 -0
  72. package/dist/core/computeRiskScoreDetails.js.map +1 -0
  73. package/dist/core/confidenceGate.js +83 -0
  74. package/dist/core/confidenceGate.js.map +1 -0
  75. package/dist/core/decision/buildDecisionExplanation.js +91 -0
  76. package/dist/core/decision/buildDecisionExplanation.js.map +1 -0
  77. package/dist/core/decision/buildDecisionReasonCodes.js +65 -0
  78. package/dist/core/decision/buildDecisionReasonCodes.js.map +1 -0
  79. package/dist/core/decision/buildReasonSummaryLine.js +24 -0
  80. package/dist/core/decision/buildReasonSummaryLine.js.map +1 -0
  81. package/dist/core/decision/buildRecommendation.js +43 -0
  82. package/dist/core/decision/buildRecommendation.js.map +1 -0
  83. package/dist/core/decision/decideExecutionMode.js +125 -0
  84. package/dist/core/decision/decideExecutionMode.js.map +1 -0
  85. package/dist/core/decision/decisionReasonCodeMeta.js +91 -0
  86. package/dist/core/decision/decisionReasonCodeMeta.js.map +1 -0
  87. package/dist/core/decision/renderDecisionSummary.js +115 -0
  88. package/dist/core/decision/renderDecisionSummary.js.map +1 -0
  89. package/dist/core/detectResourceStorage.js +78 -0
  90. package/dist/core/detectResourceStorage.js.map +1 -0
  91. package/dist/core/formatOutput.js +53 -0
  92. package/dist/core/formatOutput.js.map +1 -0
  93. package/dist/core/intentAwareScore.js +35 -0
  94. package/dist/core/intentAwareScore.js.map +1 -0
  95. package/dist/core/loadSavedAgentResult.js +18 -0
  96. package/dist/core/loadSavedAgentResult.js.map +1 -0
  97. package/dist/core/normalizeIssues.js +50 -0
  98. package/dist/core/normalizeIssues.js.map +1 -0
  99. package/dist/core/normalizeSignals.js +40 -0
  100. package/dist/core/normalizeSignals.js.map +1 -0
  101. package/dist/core/output/zoneStageTypes.js +3 -0
  102. package/dist/core/output/zoneStageTypes.js.map +1 -0
  103. package/dist/core/patchRiskAnalyzer.js +50 -0
  104. package/dist/core/patchRiskAnalyzer.js.map +1 -0
  105. package/dist/core/renderRunAgentResult.js +77 -0
  106. package/dist/core/renderRunAgentResult.js.map +1 -0
  107. package/dist/core/result/buildApplyStageResult.js +61 -0
  108. package/dist/core/result/buildApplyStageResult.js.map +1 -0
  109. package/dist/core/result/buildCliViewModel.js +79 -0
  110. package/dist/core/result/buildCliViewModel.js.map +1 -0
  111. package/dist/core/result/buildConversionStageResult.js +62 -0
  112. package/dist/core/result/buildConversionStageResult.js.map +1 -0
  113. package/dist/core/result/buildDecisionStageResult.js +61 -0
  114. package/dist/core/result/buildDecisionStageResult.js.map +1 -0
  115. package/dist/core/result/buildExecutionResult.js +148 -0
  116. package/dist/core/result/buildExecutionResult.js.map +1 -0
  117. package/dist/core/result/buildPreviewStageResult.js +47 -0
  118. package/dist/core/result/buildPreviewStageResult.js.map +1 -0
  119. package/dist/core/result/buildSavedDecisionExplanation.js +52 -0
  120. package/dist/core/result/buildSavedDecisionExplanation.js.map +1 -0
  121. package/dist/core/result/buildSavedRecommendation.js +39 -0
  122. package/dist/core/result/buildSavedRecommendation.js.map +1 -0
  123. package/dist/core/result/buildStageResultV2.js +52 -0
  124. package/dist/core/result/buildStageResultV2.js.map +1 -0
  125. package/dist/core/result/renderBundledResult.js +47 -0
  126. package/dist/core/result/renderBundledResult.js.map +1 -0
  127. package/dist/core/result/renderCliResult.js +93 -0
  128. package/dist/core/result/renderCliResult.js.map +1 -0
  129. package/dist/core/result/scoreTopRisks.js +205 -0
  130. package/dist/core/result/scoreTopRisks.js.map +1 -0
  131. package/dist/core/runAgent.js +210 -0
  132. package/dist/core/runAgent.js.map +1 -0
  133. package/dist/core/runFeatureAgent.js +684 -0
  134. package/dist/core/runFeatureAgent.js.map +1 -0
  135. package/dist/core/runLlmPatchFlow.js +522 -0
  136. package/dist/core/runLlmPatchFlow.js.map +1 -0
  137. package/dist/core/saveAgentResult.js +234 -0
  138. package/dist/core/saveAgentResult.js.map +1 -0
  139. package/dist/core/scoring/computeConfidenceBreakdown.js +130 -0
  140. package/dist/core/scoring/computeConfidenceBreakdown.js.map +1 -0
  141. package/dist/core/scoring/computeConfidenceScore.js +37 -0
  142. package/dist/core/scoring/computeConfidenceScore.js.map +1 -0
  143. package/dist/core/scoring/confidenceRules.js +58 -0
  144. package/dist/core/scoring/confidenceRules.js.map +1 -0
  145. package/dist/core/scoring/confidenceScore.js +8 -0
  146. package/dist/core/scoring/confidenceScore.js.map +1 -0
  147. package/dist/core/selectRelevantBlocks.js +58 -0
  148. package/dist/core/selectRelevantBlocks.js.map +1 -0
  149. package/dist/core/selfHealingLoop.js +209 -0
  150. package/dist/core/selfHealingLoop.js.map +1 -0
  151. package/dist/core/taskIntentParser.js +165 -0
  152. package/dist/core/taskIntentParser.js.map +1 -0
  153. package/dist/core/types/agentResult.js +3 -0
  154. package/dist/core/types/agentResult.js.map +1 -0
  155. package/dist/core/types/risk.js +3 -0
  156. package/dist/core/types/risk.js.map +1 -0
  157. package/dist/core/validatePatchAgainstSchema.js +100 -0
  158. package/dist/core/validatePatchAgainstSchema.js.map +1 -0
  159. package/dist/core/validateSuggestedArchitecture.js +24 -0
  160. package/dist/core/validateSuggestedArchitecture.js.map +1 -0
  161. package/dist/engine/buildDecisionExplanation.js +114 -0
  162. package/dist/engine/buildDecisionExplanation.js.map +1 -0
  163. package/dist/engine/contradictionDetector.js +40 -0
  164. package/dist/engine/contradictionDetector.js.map +1 -0
  165. package/dist/engine/decisionEngine.js +19 -0
  166. package/dist/engine/decisionEngine.js.map +1 -0
  167. package/dist/llm/openaiClient.js +19 -0
  168. package/dist/llm/openaiClient.js.map +1 -0
  169. package/dist/llm/planFeature.js +57 -0
  170. package/dist/llm/planFeature.js.map +1 -0
  171. package/dist/llm/planFix.js +3 -0
  172. package/dist/llm/planFix.js.map +1 -0
  173. package/dist/llm/planFullPatch.js +62 -0
  174. package/dist/llm/planFullPatch.js.map +1 -0
  175. package/dist/llm/planPatchPreview.js +60 -0
  176. package/dist/llm/planPatchPreview.js.map +1 -0
  177. package/dist/llm/prompts.js +131 -0
  178. package/dist/llm/prompts.js.map +1 -0
  179. package/dist/llm/schemas.js +28 -0
  180. package/dist/llm/schemas.js.map +1 -0
  181. package/dist/patch/apply/formatApplyFlowResult.js +23 -0
  182. package/dist/patch/apply/formatApplyFlowResult.js.map +1 -0
  183. package/dist/patch/apply/renderApplyFlowResult.js +15 -0
  184. package/dist/patch/apply/renderApplyFlowResult.js.map +1 -0
  185. package/dist/patch/apply/runApplyFlow.js +88 -0
  186. package/dist/patch/apply/runApplyFlow.js.map +1 -0
  187. package/dist/patch/applyFlowTypes.js +3 -0
  188. package/dist/patch/applyFlowTypes.js.map +1 -0
  189. package/dist/patch/applyPatchPlan.js +117 -0
  190. package/dist/patch/applyPatchPlan.js.map +1 -0
  191. package/dist/patch/backupFile.js +23 -0
  192. package/dist/patch/backupFile.js.map +1 -0
  193. package/dist/patch/conversion/canConvertGeneratedPlanToPatchPlan.js +57 -0
  194. package/dist/patch/conversion/canConvertGeneratedPlanToPatchPlan.js.map +1 -0
  195. package/dist/patch/conversion/convertGeneratedPlanToPatchPlan.js +38 -0
  196. package/dist/patch/conversion/convertGeneratedPlanToPatchPlan.js.map +1 -0
  197. package/dist/patch/conversion/formatGeneratedPlanConversionFailure.js +17 -0
  198. package/dist/patch/conversion/formatGeneratedPlanConversionFailure.js.map +1 -0
  199. package/dist/patch/conversion/generatedPlanConversionFailureMeta.js +40 -0
  200. package/dist/patch/conversion/generatedPlanConversionFailureMeta.js.map +1 -0
  201. package/dist/patch/conversion/generatedPlanConversionTypes.js +3 -0
  202. package/dist/patch/conversion/generatedPlanConversionTypes.js.map +1 -0
  203. package/dist/patch/conversion/renderGeneratedPlanConversionFailure.js +16 -0
  204. package/dist/patch/conversion/renderGeneratedPlanConversionFailure.js.map +1 -0
  205. package/dist/patch/generatedPlanConversion.js +96 -0
  206. package/dist/patch/generatedPlanConversion.js.map +1 -0
  207. package/dist/patch/patchAnchors.js +3 -0
  208. package/dist/patch/patchAnchors.js.map +1 -0
  209. package/dist/patch/patchValidationRules.js +116 -0
  210. package/dist/patch/patchValidationRules.js.map +1 -0
  211. package/dist/patch/patchValidationTypes.js +3 -0
  212. package/dist/patch/patchValidationTypes.js.map +1 -0
  213. package/dist/patch/renderApplyFlowResult.js +26 -0
  214. package/dist/patch/renderApplyFlowResult.js.map +1 -0
  215. package/dist/patch/validatePatchPlan.js +148 -0
  216. package/dist/patch/validatePatchPlan.js.map +1 -0
  217. package/dist/patch-generation/buildGeneratedPatchPlan.js +94 -0
  218. package/dist/patch-generation/buildGeneratedPatchPlan.js.map +1 -0
  219. package/dist/patch-generation/buildPatchOperations.js +41 -0
  220. package/dist/patch-generation/buildPatchOperations.js.map +1 -0
  221. package/dist/patch-generation/classifyPatchIntent.js +62 -0
  222. package/dist/patch-generation/classifyPatchIntent.js.map +1 -0
  223. package/dist/patch-generation/formatGeneratedPatchPlanPreview.js +25 -0
  224. package/dist/patch-generation/formatGeneratedPatchPlanPreview.js.map +1 -0
  225. package/dist/patch-generation/generatePatchPlan.js +74 -0
  226. package/dist/patch-generation/generatePatchPlan.js.map +1 -0
  227. package/dist/patch-generation/generatedPatchPlanTypes.js +3 -0
  228. package/dist/patch-generation/generatedPatchPlanTypes.js.map +1 -0
  229. package/dist/patch-generation/isIntentAllowed.js +15 -0
  230. package/dist/patch-generation/isIntentAllowed.js.map +1 -0
  231. package/dist/patch-generation/renderGeneratedPatchPlan.js +62 -0
  232. package/dist/patch-generation/renderGeneratedPatchPlan.js.map +1 -0
  233. package/dist/prompts/developerPrompt.js +213 -0
  234. package/dist/prompts/developerPrompt.js.map +1 -0
  235. package/dist/prompts/fullPatchPrompt.js +82 -0
  236. package/dist/prompts/fullPatchPrompt.js.map +1 -0
  237. package/dist/prompts/patchPreviewPrompt.js +83 -0
  238. package/dist/prompts/patchPreviewPrompt.js.map +1 -0
  239. package/dist/prompts/planFeaturePrompt.js +73 -0
  240. package/dist/prompts/planFeaturePrompt.js.map +1 -0
  241. package/dist/prompts/testEngineerContext.js +184 -0
  242. package/dist/prompts/testEngineerContext.js.map +1 -0
  243. package/dist/prompts/testEngineerPrompt.js +135 -0
  244. package/dist/prompts/testEngineerPrompt.js.map +1 -0
  245. package/dist/repo/analyzeProjectPatterns.js +46 -0
  246. package/dist/repo/analyzeProjectPatterns.js.map +1 -0
  247. package/dist/repo/detectProjectStructure.js +45 -0
  248. package/dist/repo/detectProjectStructure.js.map +1 -0
  249. package/dist/repo/getGitChangedFiles.js +96 -0
  250. package/dist/repo/getGitChangedFiles.js.map +1 -0
  251. package/dist/repo/loadSchemaSnapshot.js +29 -0
  252. package/dist/repo/loadSchemaSnapshot.js.map +1 -0
  253. package/dist/repo/rankRelevantFiles.js +306 -0
  254. package/dist/repo/rankRelevantFiles.js.map +1 -0
  255. package/dist/repo/readProjectFiles.js +27 -0
  256. package/dist/repo/readProjectFiles.js.map +1 -0
  257. package/dist/repo/scanRepo.js +93 -0
  258. package/dist/repo/scanRepo.js.map +1 -0
  259. package/dist/repo/validateSuggestedFiles.js +66 -0
  260. package/dist/repo/validateSuggestedFiles.js.map +1 -0
  261. package/dist/roles/dataAnalystContext.js +155 -0
  262. package/dist/roles/dataAnalystContext.js.map +1 -0
  263. package/dist/roles/detectDataSchema.js +152 -0
  264. package/dist/roles/detectDataSchema.js.map +1 -0
  265. package/dist/roles/detectTestComplexity.js +74 -0
  266. package/dist/roles/detectTestComplexity.js.map +1 -0
  267. package/dist/roles/detectTestFramework.js +166 -0
  268. package/dist/roles/detectTestFramework.js.map +1 -0
  269. package/dist/roles/runDataAnalystFlow.js +221 -0
  270. package/dist/roles/runDataAnalystFlow.js.map +1 -0
  271. package/dist/roles/runTestEngineerFlow.js +266 -0
  272. package/dist/roles/runTestEngineerFlow.js.map +1 -0
  273. package/dist/roles/testEngineerContext.js +282 -0
  274. package/dist/roles/testEngineerContext.js.map +1 -0
  275. package/dist/roles/testOutputValidator.js +474 -0
  276. package/dist/roles/testOutputValidator.js.map +1 -0
  277. package/dist/types/agent.js +3 -0
  278. package/dist/types/agent.js.map +1 -0
  279. package/dist/types/analysis.js +3 -0
  280. package/dist/types/analysis.js.map +1 -0
  281. package/dist/types/patch.js +3 -0
  282. package/dist/types/patch.js.map +1 -0
  283. package/dist/types/project.js +3 -0
  284. package/dist/types/project.js.map +1 -0
  285. package/dist/types/schema.js +3 -0
  286. package/dist/types/schema.js.map +1 -0
  287. package/dist/utils/executionTracker.js +33 -0
  288. package/dist/utils/executionTracker.js.map +1 -0
  289. package/dist/utils/files.js +35 -0
  290. package/dist/utils/files.js.map +1 -0
  291. package/dist/utils/logger.js +179 -0
  292. package/dist/utils/logger.js.map +1 -0
  293. package/dist/utils/paths.js +14 -0
  294. package/dist/utils/paths.js.map +1 -0
  295. package/dist/utils/trace.js +10 -0
  296. package/dist/utils/trace.js.map +1 -0
  297. package/dist/utils/validation.js +24 -0
  298. package/dist/utils/validation.js.map +1 -0
  299. package/package.json +53 -0
  300. package/tsconfig.json +17 -0
  301. package/vitest.config.ts +21 -0
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildDataAnalystContext = buildDataAnalystContext;
4
+ const TASK_FILLER_WORDS = new Set([
5
+ "create", "table", "add", "column", "make",
6
+ "a", "an", "the", "for", "with", "new",
7
+ "and", "or", "to", "in", "of",
8
+ ]);
9
+ function buildIntentTokens(task) {
10
+ const sanitizedTask = task
11
+ .toLowerCase()
12
+ .normalize("NFKD")
13
+ .replace(/[\u0300-\u036f]/g, "")
14
+ .replace(/https?:\/\/[^\s]+/g, " ")
15
+ .replace(/www\.[^\s]+/g, " ")
16
+ .replace(/[a-z0-9-]+\.(com|org|net|io|dev|app|co)[^\s]*/g, " ")
17
+ .replace(/[^a-z0-9\s]+/g, " ")
18
+ .trim();
19
+ const rawTokens = sanitizedTask.split(/\s+/).filter(Boolean);
20
+ const meaningfulTokens = rawTokens.filter((token) => !TASK_FILLER_WORDS.has(token));
21
+ const sourceTokens = meaningfulTokens.length > 0 ? meaningfulTokens : rawTokens;
22
+ const limitedTokens = [];
23
+ let totalLength = 0;
24
+ for (const token of sourceTokens) {
25
+ const nextLength = totalLength === 0 ? token.length : totalLength + 1 + token.length;
26
+ if (limitedTokens.length >= 5 || nextLength > 40) {
27
+ break;
28
+ }
29
+ limitedTokens.push(token);
30
+ totalLength = nextLength;
31
+ }
32
+ return limitedTokens.length > 0 ? limitedTokens : ["generated", "migration"];
33
+ }
34
+ function buildSlug(task) {
35
+ return buildIntentTokens(task).join("_");
36
+ }
37
+ function detectSqlFiles(files) {
38
+ if (!Array.isArray(files))
39
+ return [];
40
+ return files
41
+ .filter((file) => file.path.endsWith(".sql") ||
42
+ file.path.endsWith(".db") ||
43
+ file.path.endsWith(".sqlite") ||
44
+ file.path.endsWith(".sqlite3"))
45
+ .sort((a, b) => a.path.localeCompare(b.path));
46
+ }
47
+ function detectMigrationFiles(files, migrationFormat) {
48
+ if (!Array.isArray(files))
49
+ return [];
50
+ if (migrationFormat === "flyway") {
51
+ return files
52
+ .filter((file) => /(^|\/)V\d+__.+\.sql$/i.test(file.path))
53
+ .sort((a, b) => a.path.localeCompare(b.path));
54
+ }
55
+ if (migrationFormat === "alembic") {
56
+ return files
57
+ .filter((file) => file.path.includes("alembic/versions/") || file.path === "alembic.ini")
58
+ .sort((a, b) => a.path.localeCompare(b.path));
59
+ }
60
+ if (migrationFormat === "liquibase") {
61
+ return files
62
+ .filter((file) => file.path.toLowerCase().includes("liquibase") ||
63
+ file.path.toLowerCase().includes("databasechangelog"))
64
+ .sort((a, b) => a.path.localeCompare(b.path));
65
+ }
66
+ return detectSqlFiles(files);
67
+ }
68
+ function buildSchemaSummary(schema) {
69
+ const lines = [
70
+ `SQL dialect: ${schema.dialect}`,
71
+ `Migration format: ${schema.migrationFormat}`,
72
+ `Confidence: ${schema.confidence}`,
73
+ `Evidence: ${schema.evidence.join(", ")}`,
74
+ `Migration directory: ${schema.migrationDir ?? "unknown"}`,
75
+ `Existing tables: ${schema.existingTables.join(", ") || "none detected"}`,
76
+ ];
77
+ return lines.join("\n");
78
+ }
79
+ function buildOutputRules(dialect, existingTables) {
80
+ const common = [
81
+ "Never use DROP TABLE or TRUNCATE — these are destructive",
82
+ "Always use IF NOT EXISTS for CREATE TABLE",
83
+ "Use snake_case for all table and column names",
84
+ "Add created_at and updated_at columns unless explicitly told not to",
85
+ `Never invent table names that conflict with existing tables: ${existingTables.length > 0 ? existingTables.join(", ") : "none"}`,
86
+ ];
87
+ if (dialect === "postgresql") {
88
+ return [
89
+ ...common,
90
+ "Use SERIAL or BIGSERIAL for auto-increment",
91
+ "Use TEXT for strings",
92
+ "Use TIMESTAMPTZ for timestamps",
93
+ ];
94
+ }
95
+ if (dialect === "mysql") {
96
+ return [
97
+ ...common,
98
+ "Use AUTO_INCREMENT for auto-increment",
99
+ "Use VARCHAR for strings",
100
+ "Use DATETIME for timestamps",
101
+ ];
102
+ }
103
+ if (dialect === "sqlite") {
104
+ return [
105
+ ...common,
106
+ "Use INTEGER PRIMARY KEY AUTOINCREMENT for auto-increment",
107
+ "Use TEXT for strings",
108
+ "Use DATETIME for timestamps",
109
+ ];
110
+ }
111
+ return common;
112
+ }
113
+ function getNextFlywayVersion(migrationFiles) {
114
+ let maxVersion = 0;
115
+ for (const file of migrationFiles) {
116
+ const match = file.path.match(/(^|\/)V(\d+)__/i);
117
+ if (!match)
118
+ continue;
119
+ const version = Number.parseInt(match[2], 10);
120
+ if (!Number.isNaN(version)) {
121
+ maxVersion = Math.max(maxVersion, version);
122
+ }
123
+ }
124
+ return maxVersion + 1;
125
+ }
126
+ function buildOutputPath(task, schema, migrationFiles) {
127
+ const slug = buildSlug(task);
128
+ if (schema.migrationFormat === "flyway") {
129
+ const nextVersion = getNextFlywayVersion(migrationFiles);
130
+ const baseDir = schema.migrationDir ?? "db/migration";
131
+ return `${baseDir}/V${nextVersion}__${slug}.sql`;
132
+ }
133
+ if (schema.migrationFormat === "alembic") {
134
+ return `alembic/versions/${slug}.py`;
135
+ }
136
+ return `sql/${slug}.sql`;
137
+ }
138
+ function buildDataAnalystContext(task, schema, files) {
139
+ const safeFiles = Array.isArray(files) ? files : [];
140
+ const existingSqlFiles = detectSqlFiles(safeFiles);
141
+ const migrationFiles = detectMigrationFiles(safeFiles, schema.migrationFormat);
142
+ return {
143
+ schema,
144
+ existingSqlFiles,
145
+ migrationFiles,
146
+ outputPaths: {
147
+ migrationFile: buildOutputPath(task, schema, migrationFiles),
148
+ },
149
+ dialect: schema.dialect,
150
+ migrationFormat: schema.migrationFormat,
151
+ outputRules: buildOutputRules(schema.dialect, schema.existingTables),
152
+ schemaSummary: buildSchemaSummary(schema),
153
+ };
154
+ }
155
+ //# sourceMappingURL=dataAnalystContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataAnalystContext.js","sourceRoot":"","sources":["../../src/roles/dataAnalystContext.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.detectDataSchema = detectDataSchema;
7
+ const node_fs_1 = require("node:fs");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ function readRepoFileContent(file) {
10
+ try {
11
+ return (0, node_fs_1.readFileSync)(file.absolutePath, "utf8");
12
+ }
13
+ catch {
14
+ return "";
15
+ }
16
+ }
17
+ function findMigrationDir(files, format) {
18
+ if (!Array.isArray(files))
19
+ return null;
20
+ if (format === "flyway") {
21
+ const match = files.find((file) => /(^|\/)V\d+__.+\.sql$/i.test(file.path));
22
+ return match ? node_path_1.default.posix.dirname(match.path) : "db/migration";
23
+ }
24
+ if (format === "alembic") {
25
+ const versionsFile = files.find((file) => file.path.includes("alembic/versions/"));
26
+ if (versionsFile)
27
+ return node_path_1.default.posix.dirname(versionsFile.path);
28
+ const alembicFile = files.find((file) => file.path.includes("alembic/"));
29
+ return alembicFile ? node_path_1.default.posix.dirname(alembicFile.path) : "alembic/versions";
30
+ }
31
+ if (format === "liquibase") {
32
+ const match = files.find((file) => file.path.toLowerCase().includes("liquibase") ||
33
+ file.path.toLowerCase().includes("changelog"));
34
+ return match ? node_path_1.default.posix.dirname(match.path) : null;
35
+ }
36
+ if (format === "raw_sql") {
37
+ const match = files.find((file) => file.path.endsWith(".sql"));
38
+ return match ? node_path_1.default.posix.dirname(match.path) : "sql";
39
+ }
40
+ return null;
41
+ }
42
+ function detectMigrationFormat(files, evidence) {
43
+ if (files.some((file) => /(^|\/)V\d+__.+\.sql$/i.test(file.path))) {
44
+ evidence.push("Flyway migration filename detected");
45
+ return "flyway";
46
+ }
47
+ if (files.some((file) => file.path.toLowerCase().includes("liquibase") ||
48
+ file.path.toLowerCase().includes("databasechangelog"))) {
49
+ evidence.push("Liquibase files detected");
50
+ return "liquibase";
51
+ }
52
+ if (files.some((file) => file.path === "alembic.ini" ||
53
+ file.path.includes("alembic/"))) {
54
+ evidence.push("Alembic files detected");
55
+ return "alembic";
56
+ }
57
+ if (files.some((file) => file.path.endsWith(".sql"))) {
58
+ evidence.push("Raw SQL files detected");
59
+ return "raw_sql";
60
+ }
61
+ return "unknown";
62
+ }
63
+ function detectDialect(files, evidence) {
64
+ let hasPostgres = false;
65
+ let hasMysql = false;
66
+ let hasSqlite = false;
67
+ for (const file of files) {
68
+ const lowerPath = file.path.toLowerCase();
69
+ const content = readRepoFileContent(file);
70
+ const lowerContent = content.toLowerCase();
71
+ if (lowerPath.endsWith("postgresql.conf") ||
72
+ lowerContent.includes("postgresql://") ||
73
+ content.includes("SERIAL") ||
74
+ content.includes("BIGSERIAL") ||
75
+ content.includes("TEXT[]") ||
76
+ content.includes("JSONB")) {
77
+ hasPostgres = true;
78
+ }
79
+ if (lowerPath.endsWith("my.cnf") ||
80
+ content.includes("AUTO_INCREMENT") ||
81
+ content.includes("ENGINE=InnoDB")) {
82
+ hasMysql = true;
83
+ }
84
+ if (lowerPath.endsWith(".db") ||
85
+ lowerContent.includes("sqlite3")) {
86
+ hasSqlite = true;
87
+ }
88
+ }
89
+ if (hasPostgres) {
90
+ evidence.push("PostgreSQL evidence detected");
91
+ return "postgresql";
92
+ }
93
+ if (hasMysql) {
94
+ evidence.push("MySQL evidence detected");
95
+ return "mysql";
96
+ }
97
+ if (hasSqlite) {
98
+ evidence.push("SQLite evidence detected");
99
+ return "sqlite";
100
+ }
101
+ return "unknown";
102
+ }
103
+ function extractExistingTables(files) {
104
+ const tables = new Set();
105
+ const createTableRegex = /CREATE TABLE (?:IF NOT EXISTS )?["`]?(\w+)["`]?/gi;
106
+ for (const file of files) {
107
+ if (!file.path.endsWith(".sql"))
108
+ continue;
109
+ const content = readRepoFileContent(file);
110
+ let match;
111
+ while ((match = createTableRegex.exec(content)) !== null) {
112
+ tables.add(match[1]);
113
+ }
114
+ }
115
+ return [...tables].sort((a, b) => a.localeCompare(b));
116
+ }
117
+ function detectDataSchema(files) {
118
+ if (!Array.isArray(files) || files.length === 0) {
119
+ return {
120
+ dialect: "unknown",
121
+ migrationFormat: "unknown",
122
+ confidence: "low",
123
+ evidence: ["No repository files available"],
124
+ migrationDir: null,
125
+ existingTables: [],
126
+ };
127
+ }
128
+ const evidence = [];
129
+ const dialect = detectDialect(files, evidence);
130
+ const migrationFormat = detectMigrationFormat(files, evidence);
131
+ const migrationDir = findMigrationDir(files, migrationFormat);
132
+ const existingTables = extractExistingTables(files);
133
+ let confidence = "low";
134
+ if (dialect !== "unknown" && migrationFormat !== "unknown") {
135
+ confidence = "high";
136
+ }
137
+ else if (dialect !== "unknown" || migrationFormat !== "unknown") {
138
+ confidence = "medium";
139
+ }
140
+ if (evidence.length === 0) {
141
+ evidence.push("No recognizable SQL dialect or migration format detected");
142
+ }
143
+ return {
144
+ dialect,
145
+ migrationFormat,
146
+ confidence,
147
+ evidence,
148
+ migrationDir,
149
+ existingTables,
150
+ };
151
+ }
152
+ //# sourceMappingURL=detectDataSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectDataSchema.js","sourceRoot":"","sources":["../../src/roles/detectDataSchema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectTestComplexity = detectTestComplexity;
4
+ function buildResult(complexity, hints, suggestedPatterns) {
5
+ return { complexity, hints, suggestedPatterns };
6
+ }
7
+ function detectTestComplexity(task) {
8
+ if (typeof task !== "string") {
9
+ return buildResult("simple", [], []);
10
+ }
11
+ const normalizedTask = task.toLowerCase();
12
+ const matchesMultiScenario = [
13
+ "all scenarios",
14
+ "all cases",
15
+ "smoke and e2e",
16
+ "positive and negative",
17
+ "multiple scenarios",
18
+ ].some((keyword) => normalizedTask.includes(keyword));
19
+ if (matchesMultiScenario) {
20
+ return buildResult("multi_scenario", ["Task requires multiple independent test scenarios"], ["multiple test functions", "multiple scenarios"]);
21
+ }
22
+ const matchesE2e = [
23
+ "end to end",
24
+ "end-to-end",
25
+ "e2e",
26
+ "complete flow",
27
+ "full flow",
28
+ "purchase flow",
29
+ "checkout flow",
30
+ "booking flow",
31
+ "from login to",
32
+ ].some((keyword) => normalizedTask.includes(keyword));
33
+ if (matchesE2e) {
34
+ return buildResult("e2e", ["Task requires chaining multiple page objects and steps"], ["multiple page objects", "step-by-step chain", "beforeEach login"]);
35
+ }
36
+ const matchesDataDriven = [
37
+ "multiple users",
38
+ "multiple cases",
39
+ "parametrize",
40
+ "data driven",
41
+ "data-driven",
42
+ "different users",
43
+ "various",
44
+ "all users",
45
+ "each user",
46
+ "for each",
47
+ ].some((keyword) => normalizedTask.includes(keyword));
48
+ if (matchesDataDriven) {
49
+ return buildResult("data_driven", ["Task requires multiple test cases with different inputs"], [
50
+ "@pytest.mark.parametrize",
51
+ "Scenario Outline",
52
+ "Examples table",
53
+ "test.each",
54
+ "forEach",
55
+ ]);
56
+ }
57
+ const matchesNegative = [
58
+ "invalid",
59
+ "error",
60
+ "fail",
61
+ "locked",
62
+ "wrong password",
63
+ "edge case",
64
+ "negative",
65
+ "should not",
66
+ "should fail",
67
+ "unauthorized",
68
+ ].some((keyword) => normalizedTask.includes(keyword));
69
+ if (matchesNegative) {
70
+ return buildResult("negative", ["Task requires testing failure scenarios"], ["assert error message", "assert url unchanged"]);
71
+ }
72
+ return buildResult("simple", ["Single focused test case"], ["single test function"]);
73
+ }
74
+ //# sourceMappingURL=detectTestComplexity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectTestComplexity.js","sourceRoot":"","sources":["../../src/roles/detectTestComplexity.ts"],"names":[],"mappings":";;AAqBA,oDA4FC;AApGD,SAAS,WAAW,CAClB,UAA0B,EAC1B,KAAe,EACf,iBAA2B;IAE3B,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;AAClD,CAAC;AAED,SAAgB,oBAAoB,CAAC,IAAY;IAC/C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,WAAW,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAE1C,MAAM,oBAAoB,GAAG;QAC3B,eAAe;QACf,WAAW;QACX,eAAe;QACf,uBAAuB;QACvB,oBAAoB;KACrB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAEtD,IAAI,oBAAoB,EAAE,CAAC;QACzB,OAAO,WAAW,CAChB,gBAAgB,EAChB,CAAC,mDAAmD,CAAC,EACrD,CAAC,yBAAyB,EAAE,oBAAoB,CAAC,CAClD,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG;QACjB,YAAY;QACZ,YAAY;QACZ,KAAK;QACL,eAAe;QACf,WAAW;QACX,eAAe;QACf,eAAe;QACf,cAAc;QACd,eAAe;KAChB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAEtD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,WAAW,CAChB,KAAK,EACL,CAAC,wDAAwD,CAAC,EAC1D,CAAC,uBAAuB,EAAE,oBAAoB,EAAE,kBAAkB,CAAC,CACpE,CAAC;IACJ,CAAC;IAED,MAAM,iBAAiB,GAAG;QACxB,gBAAgB;QAChB,gBAAgB;QAChB,aAAa;QACb,aAAa;QACb,aAAa;QACb,iBAAiB;QACjB,SAAS;QACT,WAAW;QACX,WAAW;QACX,UAAU;KACX,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAEtD,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,WAAW,CAChB,aAAa,EACb,CAAC,yDAAyD,CAAC,EAC3D;YACE,0BAA0B;YAC1B,kBAAkB;YAClB,gBAAgB;YAChB,WAAW;YACX,SAAS;SACV,CACF,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG;QACtB,SAAS;QACT,OAAO;QACP,MAAM;QACN,QAAQ;QACR,gBAAgB;QAChB,WAAW;QACX,UAAU;QACV,YAAY;QACZ,aAAa;QACb,cAAc;KACf,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAEtD,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,WAAW,CAChB,UAAU,EACV,CAAC,yCAAyC,CAAC,EAC3C,CAAC,sBAAsB,EAAE,sBAAsB,CAAC,CACjD,CAAC;IACJ,CAAC;IAED,OAAO,WAAW,CAAC,QAAQ,EAAE,CAAC,0BAA0B,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC,CAAC;AACvF,CAAC"}
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectTestFramework = detectTestFramework;
4
+ function hasFile(files, pattern) {
5
+ return files.some((f) => f.path.includes(pattern));
6
+ }
7
+ function hasExtension(files, ext) {
8
+ return files.some((f) => f.path.endsWith(ext));
9
+ }
10
+ function findTestDir(files, patterns) {
11
+ for (const pattern of patterns) {
12
+ const found = files.find((f) => f.path.includes(pattern));
13
+ if (found) {
14
+ const parts = found.path.split("/");
15
+ const idx = parts.findIndex((p) => p === pattern.replace("/", ""));
16
+ if (idx !== -1)
17
+ return parts.slice(0, idx + 1).join("/");
18
+ }
19
+ }
20
+ return null;
21
+ }
22
+ function detectTestFramework(files) {
23
+ if (!Array.isArray(files)) {
24
+ return {
25
+ framework: "unknown",
26
+ confidence: "low",
27
+ language: "unknown",
28
+ evidence: ["Invalid input: files is not an array"],
29
+ testFilePattern: "*",
30
+ testDir: null,
31
+ };
32
+ }
33
+ const evidence = [];
34
+ // Playwright TS
35
+ if (hasFile(files, "playwright.config.ts")) {
36
+ evidence.push("playwright.config.ts found");
37
+ const hasSpecTs = files.some((f) => f.path.endsWith(".spec.ts") || f.path.endsWith(".test.ts"));
38
+ if (hasSpecTs)
39
+ evidence.push(".spec.ts test files found");
40
+ return {
41
+ framework: "playwright_ts",
42
+ confidence: "high",
43
+ language: "typescript",
44
+ evidence,
45
+ testFilePattern: "*.spec.ts",
46
+ testDir: findTestDir(files, ["tests", "e2e", "test"]),
47
+ };
48
+ }
49
+ // Playwright JS
50
+ if (hasFile(files, "playwright.config.js")) {
51
+ evidence.push("playwright.config.js found");
52
+ return {
53
+ framework: "playwright_js",
54
+ confidence: "high",
55
+ language: "javascript",
56
+ evidence,
57
+ testFilePattern: "*.spec.js",
58
+ testDir: findTestDir(files, ["tests", "e2e", "test"]),
59
+ };
60
+ }
61
+ // Cypress
62
+ if (hasFile(files, "cypress.config.ts") ||
63
+ hasFile(files, "cypress.config.js") ||
64
+ hasFile(files, "cypress/")) {
65
+ evidence.push("cypress.config found");
66
+ return {
67
+ framework: "cypress",
68
+ confidence: "high",
69
+ language: hasFile(files, "cypress.config.ts") ? "typescript" : "javascript",
70
+ evidence,
71
+ testFilePattern: "*.cy.ts",
72
+ testDir: findTestDir(files, ["cypress/e2e", "cypress/integration"]),
73
+ };
74
+ }
75
+ // Cucumber Java
76
+ if (hasFile(files, "pom.xml") &&
77
+ hasFile(files, ".feature") &&
78
+ hasExtension(files, ".java")) {
79
+ evidence.push("pom.xml found");
80
+ evidence.push(".feature files found");
81
+ evidence.push(".java files found");
82
+ const hasSelenium = files.some((f) => f.path.includes("BasePage") ||
83
+ f.path.includes("WebDriver") ||
84
+ f.path.includes("selenium"));
85
+ if (hasSelenium)
86
+ evidence.push("Selenium page objects detected");
87
+ return {
88
+ framework: "cucumber_java",
89
+ confidence: "high",
90
+ language: "java",
91
+ evidence,
92
+ testFilePattern: "*.feature",
93
+ testDir: findTestDir(files, [
94
+ "src/test/resources/features",
95
+ "features",
96
+ ]),
97
+ };
98
+ }
99
+ // Selenium Java (without Cucumber)
100
+ if (hasFile(files, "pom.xml") && hasExtension(files, ".java")) {
101
+ evidence.push("pom.xml found");
102
+ evidence.push(".java files found");
103
+ const hasTestNG = hasFile(files, "testng.xml");
104
+ if (hasTestNG) {
105
+ evidence.push("testng.xml found");
106
+ return {
107
+ framework: "testng",
108
+ confidence: "high",
109
+ language: "java",
110
+ evidence,
111
+ testFilePattern: "*Test.java",
112
+ testDir: findTestDir(files, ["src/test/java"]),
113
+ };
114
+ }
115
+ return {
116
+ framework: "selenium_java",
117
+ confidence: "medium",
118
+ language: "java",
119
+ evidence,
120
+ testFilePattern: "*Test.java",
121
+ testDir: findTestDir(files, ["src/test/java"]),
122
+ };
123
+ }
124
+ // Pytest
125
+ if (hasFile(files, "pytest.ini") ||
126
+ hasFile(files, "conftest.py") ||
127
+ hasFile(files, "pyproject.toml")) {
128
+ evidence.push("pytest config found");
129
+ const hasCypress = hasFile(files, "cypress");
130
+ if (!hasCypress) {
131
+ return {
132
+ framework: "pytest",
133
+ confidence: "high",
134
+ language: "python",
135
+ evidence,
136
+ testFilePattern: "test_*.py",
137
+ testDir: findTestDir(files, ["tests", "test"]),
138
+ };
139
+ }
140
+ }
141
+ // Selenium Python
142
+ if (hasExtension(files, ".py")) {
143
+ const hasSelenium = files.some((f) => f.path.includes("selenium") || f.path.includes("webdriver"));
144
+ if (hasSelenium) {
145
+ evidence.push("Python + Selenium detected");
146
+ return {
147
+ framework: "selenium_python",
148
+ confidence: "medium",
149
+ language: "python",
150
+ evidence,
151
+ testFilePattern: "test_*.py",
152
+ testDir: findTestDir(files, ["tests", "test"]),
153
+ };
154
+ }
155
+ }
156
+ // Unknown
157
+ return {
158
+ framework: "unknown",
159
+ confidence: "low",
160
+ language: "unknown",
161
+ evidence: ["No recognizable test framework detected"],
162
+ testFilePattern: "*",
163
+ testDir: null,
164
+ };
165
+ }
166
+ //# sourceMappingURL=detectTestFramework.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectTestFramework.js","sourceRoot":"","sources":["../../src/roles/detectTestFramework.ts"],"names":[],"mappings":"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"}