@jjdenhertog/ai-driven-development
Version:
AI-driven development workflow with learning capabilities for Claude
118 lines • 4.81 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AI_COMMIT_PATTERNS = void 0;
exports.getUserChanges = getUserChanges;
const getGitInstance_1 = require("./getGitInstance");
exports.AI_COMMIT_PATTERNS = [
'ai:',
'chore:',
'automated:',
'bot:',
'[automated]',
'[bot]'
];
function getUserChanges(branch, taskId) {
return __awaiter(this, void 0, void 0, function* () {
try {
const git = (0, getGitInstance_1.getGitInstance)();
const mainBranch = 'main';
// Find the merge commit for this task
const pattern = `Merge pull request.*${taskId}`;
const mergeCommitResult = yield git.raw([
'log',
`--grep=${pattern}`,
'--merges',
'--pretty=format:%H',
'-n', '1',
mainBranch
]);
const mergeCommit = mergeCommitResult.trim();
if (!mergeCommit) {
return null;
}
// Get the merge base (the original commit before task changes)
const mergeBaseResult = yield git.raw([
'merge-base',
`${mergeCommit}^1`,
`${mergeCommit}^2`
]);
const mergeBase = mergeBaseResult.trim();
// Get all commits from the PR
const commitsResult = yield git.raw([
'log',
`${mergeBase}..${mergeCommit}^2`,
'--pretty=format:%H|%an|%ad|%s',
'--date=iso-strict'
]);
const commits = commitsResult.trim().split('\n').filter(Boolean).map(line => {
const [hash, author, date, message] = line.split('|');
return { hash, author, date, message };
});
if (commits.length === 0) {
return null;
}
// Filter out AI-generated commits
const userCommits = commits.filter(commit => {
const isAICommit = exports.AI_COMMIT_PATTERNS.some(pattern => commit.message.toLowerCase().includes(pattern.toLowerCase()) ||
commit.author.toLowerCase().includes('ai') ||
commit.author.toLowerCase().includes('bot'));
return !isAICommit;
});
// Get file changes for all user commits
const fileChanges = [];
const processedFiles = new Set();
for (const commit of userCommits) {
// Get list of changed files for this commit
const changedFilesResult = yield git.raw([
'diff-tree',
'--no-commit-id',
'--name-only',
'-r',
commit.hash
]);
const changedFiles = changedFilesResult.trim().split('\n').filter(Boolean);
// Get diff for each file
for (const file of changedFiles) {
if (!processedFiles.has(file)) {
processedFiles.add(file);
try {
const diffResult = yield git.raw([
'diff',
`${mergeBase}..${commit.hash}`,
'--',
file
]);
fileChanges.push({
file,
diff: diffResult
});
}
catch (_a) {
// Skip files that can't be diffed
}
}
}
}
return {
taskId,
branch,
commits: userCommits,
fileChanges,
analyzedAt: new Date().toISOString()
};
}
catch (error) {
return null;
}
});
}
//# sourceMappingURL=getUserChanges.js.map