UNPKG

@jjdenhertog/ai-driven-development

Version:

AI-driven development workflow with learning capabilities for Claude

118 lines 4.81 kB
"use strict"; 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