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.
- package/.gittignore +4 -0
- package/README.md +36 -0
- package/dist/api/server.js +136 -0
- package/dist/api/server.js.map +1 -0
- package/dist/apply/applyPatchPlan.js +17 -0
- package/dist/apply/applyPatchPlan.js.map +1 -0
- package/dist/apply/canApplyDecision.js +26 -0
- package/dist/apply/canApplyDecision.js.map +1 -0
- package/dist/apply/patchPlan.js +3 -0
- package/dist/apply/patchPlan.js.map +1 -0
- package/dist/apply/renderApplyResult.js +18 -0
- package/dist/apply/renderApplyResult.js.map +1 -0
- package/dist/apply/runApplyFlow.js +40 -0
- package/dist/apply/runApplyFlow.js.map +1 -0
- package/dist/apply/types.js +3 -0
- package/dist/apply/types.js.map +1 -0
- package/dist/audit/auditDiffIntelligence.js +3 -0
- package/dist/audit/auditDiffIntelligence.js.map +1 -0
- package/dist/audit/auditSnapshot.js +87 -0
- package/dist/audit/auditSnapshot.js.map +1 -0
- package/dist/audit/renderAuditDiff.js +64 -0
- package/dist/audit/renderAuditDiff.js.map +1 -0
- package/dist/audit/snapshotDiff.js +53 -0
- package/dist/audit/snapshotDiff.js.map +1 -0
- package/dist/audit/snapshotReader.js +31 -0
- package/dist/audit/snapshotReader.js.map +1 -0
- package/dist/audit/snapshotWriter.js +59 -0
- package/dist/audit/snapshotWriter.js.map +1 -0
- package/dist/ci/evaluateCiResult.js +142 -0
- package/dist/ci/evaluateCiResult.js.map +1 -0
- package/dist/cli/buildGeneratedPatchPlanPreview.js +65 -0
- package/dist/cli/buildGeneratedPatchPlanPreview.js.map +1 -0
- package/dist/cli/colors.js +28 -0
- package/dist/cli/colors.js.map +1 -0
- package/dist/cli/diffOutput.js +37 -0
- package/dist/cli/diffOutput.js.map +1 -0
- package/dist/cli/index.js +850 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/loadPatchPlan.js +52 -0
- package/dist/cli/loadPatchPlan.js.map +1 -0
- package/dist/cli/output.js +34 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/parseCliArgs.js +3 -0
- package/dist/cli/parseCliArgs.js.map +1 -0
- package/dist/cli/runGeneratedPatchPlanFlow.js +23 -0
- package/dist/cli/runGeneratedPatchPlanFlow.js.map +1 -0
- package/dist/components/LoginForm.js +64 -0
- package/dist/components/LoginForm.js.map +1 -0
- package/dist/core/analyzeCodePatterns.js +3 -0
- package/dist/core/analyzeCodePatterns.js.map +1 -0
- package/dist/core/applyLlmPatches.js +43 -0
- package/dist/core/applyLlmPatches.js.map +1 -0
- package/dist/core/buildConfidenceBreakdownFromSignals.js +33 -0
- package/dist/core/buildConfidenceBreakdownFromSignals.js.map +1 -0
- package/dist/core/buildDecisionAuditSnapshot.js +18 -0
- package/dist/core/buildDecisionAuditSnapshot.js.map +1 -0
- package/dist/core/buildDecisionTrace.js +113 -0
- package/dist/core/buildDecisionTrace.js.map +1 -0
- package/dist/core/buildFallbackPatchPlan.js +23 -0
- package/dist/core/buildFallbackPatchPlan.js.map +1 -0
- package/dist/core/buildFallbackPlan.js +25 -0
- package/dist/core/buildFallbackPlan.js.map +1 -0
- package/dist/core/buildSchemaAwareContext.js +49 -0
- package/dist/core/buildSchemaAwareContext.js.map +1 -0
- package/dist/core/buildTaskExecutionContext.js +70 -0
- package/dist/core/buildTaskExecutionContext.js.map +1 -0
- package/dist/core/ciEvaluator.js +83 -0
- package/dist/core/ciEvaluator.js.map +1 -0
- package/dist/core/computeRiskScore.js +43 -0
- package/dist/core/computeRiskScore.js.map +1 -0
- package/dist/core/computeRiskScoreDetails.js +106 -0
- package/dist/core/computeRiskScoreDetails.js.map +1 -0
- package/dist/core/confidenceGate.js +83 -0
- package/dist/core/confidenceGate.js.map +1 -0
- package/dist/core/decision/buildDecisionExplanation.js +91 -0
- package/dist/core/decision/buildDecisionExplanation.js.map +1 -0
- package/dist/core/decision/buildDecisionReasonCodes.js +65 -0
- package/dist/core/decision/buildDecisionReasonCodes.js.map +1 -0
- package/dist/core/decision/buildReasonSummaryLine.js +24 -0
- package/dist/core/decision/buildReasonSummaryLine.js.map +1 -0
- package/dist/core/decision/buildRecommendation.js +43 -0
- package/dist/core/decision/buildRecommendation.js.map +1 -0
- package/dist/core/decision/decideExecutionMode.js +125 -0
- package/dist/core/decision/decideExecutionMode.js.map +1 -0
- package/dist/core/decision/decisionReasonCodeMeta.js +91 -0
- package/dist/core/decision/decisionReasonCodeMeta.js.map +1 -0
- package/dist/core/decision/renderDecisionSummary.js +115 -0
- package/dist/core/decision/renderDecisionSummary.js.map +1 -0
- package/dist/core/detectResourceStorage.js +78 -0
- package/dist/core/detectResourceStorage.js.map +1 -0
- package/dist/core/formatOutput.js +53 -0
- package/dist/core/formatOutput.js.map +1 -0
- package/dist/core/intentAwareScore.js +35 -0
- package/dist/core/intentAwareScore.js.map +1 -0
- package/dist/core/loadSavedAgentResult.js +18 -0
- package/dist/core/loadSavedAgentResult.js.map +1 -0
- package/dist/core/normalizeIssues.js +50 -0
- package/dist/core/normalizeIssues.js.map +1 -0
- package/dist/core/normalizeSignals.js +40 -0
- package/dist/core/normalizeSignals.js.map +1 -0
- package/dist/core/output/zoneStageTypes.js +3 -0
- package/dist/core/output/zoneStageTypes.js.map +1 -0
- package/dist/core/patchRiskAnalyzer.js +50 -0
- package/dist/core/patchRiskAnalyzer.js.map +1 -0
- package/dist/core/renderRunAgentResult.js +77 -0
- package/dist/core/renderRunAgentResult.js.map +1 -0
- package/dist/core/result/buildApplyStageResult.js +61 -0
- package/dist/core/result/buildApplyStageResult.js.map +1 -0
- package/dist/core/result/buildCliViewModel.js +79 -0
- package/dist/core/result/buildCliViewModel.js.map +1 -0
- package/dist/core/result/buildConversionStageResult.js +62 -0
- package/dist/core/result/buildConversionStageResult.js.map +1 -0
- package/dist/core/result/buildDecisionStageResult.js +61 -0
- package/dist/core/result/buildDecisionStageResult.js.map +1 -0
- package/dist/core/result/buildExecutionResult.js +148 -0
- package/dist/core/result/buildExecutionResult.js.map +1 -0
- package/dist/core/result/buildPreviewStageResult.js +47 -0
- package/dist/core/result/buildPreviewStageResult.js.map +1 -0
- package/dist/core/result/buildSavedDecisionExplanation.js +52 -0
- package/dist/core/result/buildSavedDecisionExplanation.js.map +1 -0
- package/dist/core/result/buildSavedRecommendation.js +39 -0
- package/dist/core/result/buildSavedRecommendation.js.map +1 -0
- package/dist/core/result/buildStageResultV2.js +52 -0
- package/dist/core/result/buildStageResultV2.js.map +1 -0
- package/dist/core/result/renderBundledResult.js +47 -0
- package/dist/core/result/renderBundledResult.js.map +1 -0
- package/dist/core/result/renderCliResult.js +93 -0
- package/dist/core/result/renderCliResult.js.map +1 -0
- package/dist/core/result/scoreTopRisks.js +205 -0
- package/dist/core/result/scoreTopRisks.js.map +1 -0
- package/dist/core/runAgent.js +210 -0
- package/dist/core/runAgent.js.map +1 -0
- package/dist/core/runFeatureAgent.js +684 -0
- package/dist/core/runFeatureAgent.js.map +1 -0
- package/dist/core/runLlmPatchFlow.js +522 -0
- package/dist/core/runLlmPatchFlow.js.map +1 -0
- package/dist/core/saveAgentResult.js +234 -0
- package/dist/core/saveAgentResult.js.map +1 -0
- package/dist/core/scoring/computeConfidenceBreakdown.js +130 -0
- package/dist/core/scoring/computeConfidenceBreakdown.js.map +1 -0
- package/dist/core/scoring/computeConfidenceScore.js +37 -0
- package/dist/core/scoring/computeConfidenceScore.js.map +1 -0
- package/dist/core/scoring/confidenceRules.js +58 -0
- package/dist/core/scoring/confidenceRules.js.map +1 -0
- package/dist/core/scoring/confidenceScore.js +8 -0
- package/dist/core/scoring/confidenceScore.js.map +1 -0
- package/dist/core/selectRelevantBlocks.js +58 -0
- package/dist/core/selectRelevantBlocks.js.map +1 -0
- package/dist/core/selfHealingLoop.js +209 -0
- package/dist/core/selfHealingLoop.js.map +1 -0
- package/dist/core/taskIntentParser.js +165 -0
- package/dist/core/taskIntentParser.js.map +1 -0
- package/dist/core/types/agentResult.js +3 -0
- package/dist/core/types/agentResult.js.map +1 -0
- package/dist/core/types/risk.js +3 -0
- package/dist/core/types/risk.js.map +1 -0
- package/dist/core/validatePatchAgainstSchema.js +100 -0
- package/dist/core/validatePatchAgainstSchema.js.map +1 -0
- package/dist/core/validateSuggestedArchitecture.js +24 -0
- package/dist/core/validateSuggestedArchitecture.js.map +1 -0
- package/dist/engine/buildDecisionExplanation.js +114 -0
- package/dist/engine/buildDecisionExplanation.js.map +1 -0
- package/dist/engine/contradictionDetector.js +40 -0
- package/dist/engine/contradictionDetector.js.map +1 -0
- package/dist/engine/decisionEngine.js +19 -0
- package/dist/engine/decisionEngine.js.map +1 -0
- package/dist/llm/openaiClient.js +19 -0
- package/dist/llm/openaiClient.js.map +1 -0
- package/dist/llm/planFeature.js +57 -0
- package/dist/llm/planFeature.js.map +1 -0
- package/dist/llm/planFix.js +3 -0
- package/dist/llm/planFix.js.map +1 -0
- package/dist/llm/planFullPatch.js +62 -0
- package/dist/llm/planFullPatch.js.map +1 -0
- package/dist/llm/planPatchPreview.js +60 -0
- package/dist/llm/planPatchPreview.js.map +1 -0
- package/dist/llm/prompts.js +131 -0
- package/dist/llm/prompts.js.map +1 -0
- package/dist/llm/schemas.js +28 -0
- package/dist/llm/schemas.js.map +1 -0
- package/dist/patch/apply/formatApplyFlowResult.js +23 -0
- package/dist/patch/apply/formatApplyFlowResult.js.map +1 -0
- package/dist/patch/apply/renderApplyFlowResult.js +15 -0
- package/dist/patch/apply/renderApplyFlowResult.js.map +1 -0
- package/dist/patch/apply/runApplyFlow.js +88 -0
- package/dist/patch/apply/runApplyFlow.js.map +1 -0
- package/dist/patch/applyFlowTypes.js +3 -0
- package/dist/patch/applyFlowTypes.js.map +1 -0
- package/dist/patch/applyPatchPlan.js +117 -0
- package/dist/patch/applyPatchPlan.js.map +1 -0
- package/dist/patch/backupFile.js +23 -0
- package/dist/patch/backupFile.js.map +1 -0
- package/dist/patch/conversion/canConvertGeneratedPlanToPatchPlan.js +57 -0
- package/dist/patch/conversion/canConvertGeneratedPlanToPatchPlan.js.map +1 -0
- package/dist/patch/conversion/convertGeneratedPlanToPatchPlan.js +38 -0
- package/dist/patch/conversion/convertGeneratedPlanToPatchPlan.js.map +1 -0
- package/dist/patch/conversion/formatGeneratedPlanConversionFailure.js +17 -0
- package/dist/patch/conversion/formatGeneratedPlanConversionFailure.js.map +1 -0
- package/dist/patch/conversion/generatedPlanConversionFailureMeta.js +40 -0
- package/dist/patch/conversion/generatedPlanConversionFailureMeta.js.map +1 -0
- package/dist/patch/conversion/generatedPlanConversionTypes.js +3 -0
- package/dist/patch/conversion/generatedPlanConversionTypes.js.map +1 -0
- package/dist/patch/conversion/renderGeneratedPlanConversionFailure.js +16 -0
- package/dist/patch/conversion/renderGeneratedPlanConversionFailure.js.map +1 -0
- package/dist/patch/generatedPlanConversion.js +96 -0
- package/dist/patch/generatedPlanConversion.js.map +1 -0
- package/dist/patch/patchAnchors.js +3 -0
- package/dist/patch/patchAnchors.js.map +1 -0
- package/dist/patch/patchValidationRules.js +116 -0
- package/dist/patch/patchValidationRules.js.map +1 -0
- package/dist/patch/patchValidationTypes.js +3 -0
- package/dist/patch/patchValidationTypes.js.map +1 -0
- package/dist/patch/renderApplyFlowResult.js +26 -0
- package/dist/patch/renderApplyFlowResult.js.map +1 -0
- package/dist/patch/validatePatchPlan.js +148 -0
- package/dist/patch/validatePatchPlan.js.map +1 -0
- package/dist/patch-generation/buildGeneratedPatchPlan.js +94 -0
- package/dist/patch-generation/buildGeneratedPatchPlan.js.map +1 -0
- package/dist/patch-generation/buildPatchOperations.js +41 -0
- package/dist/patch-generation/buildPatchOperations.js.map +1 -0
- package/dist/patch-generation/classifyPatchIntent.js +62 -0
- package/dist/patch-generation/classifyPatchIntent.js.map +1 -0
- package/dist/patch-generation/formatGeneratedPatchPlanPreview.js +25 -0
- package/dist/patch-generation/formatGeneratedPatchPlanPreview.js.map +1 -0
- package/dist/patch-generation/generatePatchPlan.js +74 -0
- package/dist/patch-generation/generatePatchPlan.js.map +1 -0
- package/dist/patch-generation/generatedPatchPlanTypes.js +3 -0
- package/dist/patch-generation/generatedPatchPlanTypes.js.map +1 -0
- package/dist/patch-generation/isIntentAllowed.js +15 -0
- package/dist/patch-generation/isIntentAllowed.js.map +1 -0
- package/dist/patch-generation/renderGeneratedPatchPlan.js +62 -0
- package/dist/patch-generation/renderGeneratedPatchPlan.js.map +1 -0
- package/dist/prompts/developerPrompt.js +213 -0
- package/dist/prompts/developerPrompt.js.map +1 -0
- package/dist/prompts/fullPatchPrompt.js +82 -0
- package/dist/prompts/fullPatchPrompt.js.map +1 -0
- package/dist/prompts/patchPreviewPrompt.js +83 -0
- package/dist/prompts/patchPreviewPrompt.js.map +1 -0
- package/dist/prompts/planFeaturePrompt.js +73 -0
- package/dist/prompts/planFeaturePrompt.js.map +1 -0
- package/dist/prompts/testEngineerContext.js +184 -0
- package/dist/prompts/testEngineerContext.js.map +1 -0
- package/dist/prompts/testEngineerPrompt.js +135 -0
- package/dist/prompts/testEngineerPrompt.js.map +1 -0
- package/dist/repo/analyzeProjectPatterns.js +46 -0
- package/dist/repo/analyzeProjectPatterns.js.map +1 -0
- package/dist/repo/detectProjectStructure.js +45 -0
- package/dist/repo/detectProjectStructure.js.map +1 -0
- package/dist/repo/getGitChangedFiles.js +96 -0
- package/dist/repo/getGitChangedFiles.js.map +1 -0
- package/dist/repo/loadSchemaSnapshot.js +29 -0
- package/dist/repo/loadSchemaSnapshot.js.map +1 -0
- package/dist/repo/rankRelevantFiles.js +306 -0
- package/dist/repo/rankRelevantFiles.js.map +1 -0
- package/dist/repo/readProjectFiles.js +27 -0
- package/dist/repo/readProjectFiles.js.map +1 -0
- package/dist/repo/scanRepo.js +93 -0
- package/dist/repo/scanRepo.js.map +1 -0
- package/dist/repo/validateSuggestedFiles.js +66 -0
- package/dist/repo/validateSuggestedFiles.js.map +1 -0
- package/dist/roles/dataAnalystContext.js +155 -0
- package/dist/roles/dataAnalystContext.js.map +1 -0
- package/dist/roles/detectDataSchema.js +152 -0
- package/dist/roles/detectDataSchema.js.map +1 -0
- package/dist/roles/detectTestComplexity.js +74 -0
- package/dist/roles/detectTestComplexity.js.map +1 -0
- package/dist/roles/detectTestFramework.js +166 -0
- package/dist/roles/detectTestFramework.js.map +1 -0
- package/dist/roles/runDataAnalystFlow.js +221 -0
- package/dist/roles/runDataAnalystFlow.js.map +1 -0
- package/dist/roles/runTestEngineerFlow.js +266 -0
- package/dist/roles/runTestEngineerFlow.js.map +1 -0
- package/dist/roles/testEngineerContext.js +282 -0
- package/dist/roles/testEngineerContext.js.map +1 -0
- package/dist/roles/testOutputValidator.js +474 -0
- package/dist/roles/testOutputValidator.js.map +1 -0
- package/dist/types/agent.js +3 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/analysis.js +3 -0
- package/dist/types/analysis.js.map +1 -0
- package/dist/types/patch.js +3 -0
- package/dist/types/patch.js.map +1 -0
- package/dist/types/project.js +3 -0
- package/dist/types/project.js.map +1 -0
- package/dist/types/schema.js +3 -0
- package/dist/types/schema.js.map +1 -0
- package/dist/utils/executionTracker.js +33 -0
- package/dist/utils/executionTracker.js.map +1 -0
- package/dist/utils/files.js +35 -0
- package/dist/utils/files.js.map +1 -0
- package/dist/utils/logger.js +179 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paths.js +14 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/trace.js +10 -0
- package/dist/utils/trace.js.map +1 -0
- package/dist/utils/validation.js +24 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +53 -0
- package/tsconfig.json +17 -0
- 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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"}
|