|
|
@ -99,6 +99,7 @@ jobs:
|
|
|
|
// Handle resolve conflicts command
|
|
|
|
// Handle resolve conflicts command
|
|
|
|
if (aiCommand === 'resolve' || aiCommand === 'fix conflicts') {
|
|
|
|
if (aiCommand === 'resolve' || aiCommand === 'fix conflicts') {
|
|
|
|
if (!isPullRequest) {
|
|
|
|
if (!isPullRequest) {
|
|
|
|
|
|
|
|
console.log('Command rejected: Not a pull request');
|
|
|
|
await octokit.issues.createComment({
|
|
|
|
await octokit.issues.createComment({
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
repo: event.repository.name,
|
|
|
|
repo: event.repository.name,
|
|
|
@ -109,26 +110,34 @@ jobs:
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
|
|
|
|
console.log('Starting resolve command execution...');
|
|
|
|
|
|
|
|
|
|
|
|
// Get PR details
|
|
|
|
// Get PR details
|
|
|
|
|
|
|
|
console.log('Fetching PR details...');
|
|
|
|
const { data: pr } = await octokit.pulls.get({
|
|
|
|
const { data: pr } = await octokit.pulls.get({
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
repo: event.repository.name,
|
|
|
|
repo: event.repository.name,
|
|
|
|
pull_number: issueNumber
|
|
|
|
pull_number: issueNumber
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
console.log(`PR found: #${issueNumber} from branch ${pr.head.ref}`);
|
|
|
|
|
|
|
|
|
|
|
|
// Get the PR diff to extract the new prompt
|
|
|
|
// Get the PR diff to extract the new prompt
|
|
|
|
|
|
|
|
console.log('Fetching PR file changes...');
|
|
|
|
const { data: files } = await octokit.pulls.listFiles({
|
|
|
|
const { data: files } = await octokit.pulls.listFiles({
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
repo: event.repository.name,
|
|
|
|
repo: event.repository.name,
|
|
|
|
pull_number: issueNumber
|
|
|
|
pull_number: issueNumber
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
console.log(`Found ${files.length} changed files`);
|
|
|
|
|
|
|
|
|
|
|
|
// Extract prompt from changes
|
|
|
|
// Extract prompt from changes
|
|
|
|
|
|
|
|
console.log('Analyzing changes to extract prompt information...');
|
|
|
|
let newPrompt = '';
|
|
|
|
let newPrompt = '';
|
|
|
|
let actName = '';
|
|
|
|
let actName = '';
|
|
|
|
let contributorInfo = '';
|
|
|
|
let contributorInfo = '';
|
|
|
|
|
|
|
|
|
|
|
|
for (const file of files) {
|
|
|
|
for (const file of files) {
|
|
|
|
|
|
|
|
console.log(`Processing file: ${file.filename}`);
|
|
|
|
if (file.filename === 'README.md') {
|
|
|
|
if (file.filename === 'README.md') {
|
|
|
|
const patch = file.patch || '';
|
|
|
|
const patch = file.patch || '';
|
|
|
|
const addedLines = patch.split('\n')
|
|
|
|
const addedLines = patch.split('\n')
|
|
|
@ -136,20 +145,26 @@ jobs:
|
|
|
|
.map(line => line.substring(1))
|
|
|
|
.map(line => line.substring(1))
|
|
|
|
.join('\n');
|
|
|
|
.join('\n');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
console.log('Attempting to extract prompt from README changes...');
|
|
|
|
const promptMatch = addedLines.match(/## Act as (?:a |an )?([^\n]+)\n(?:Contributed by:[^\n]*\n)?(?:> )?([^#]+?)(?=\n\n|$)/);
|
|
|
|
const promptMatch = addedLines.match(/## Act as (?:a |an )?([^\n]+)\n(?:Contributed by:[^\n]*\n)?(?:> )?([^#]+?)(?=\n\n|$)/);
|
|
|
|
if (promptMatch) {
|
|
|
|
if (promptMatch) {
|
|
|
|
actName = `Act as ${promptMatch[1].trim()}`;
|
|
|
|
actName = `Act as ${promptMatch[1].trim()}`;
|
|
|
|
newPrompt = promptMatch[2].trim();
|
|
|
|
newPrompt = promptMatch[2].trim();
|
|
|
|
|
|
|
|
console.log(`Found prompt: "${actName}"`);
|
|
|
|
|
|
|
|
|
|
|
|
const contributorLine = addedLines.match(/Contributed by: \[@([^\]]+)\]\(https:\/\/github\.com\/([^\)]+)\)/);
|
|
|
|
const contributorLine = addedLines.match(/Contributed by: \[@([^\]]+)\]\(https:\/\/github\.com\/([^\)]+)\)/);
|
|
|
|
if (contributorLine) {
|
|
|
|
if (contributorLine) {
|
|
|
|
contributorInfo = `Contributed by: [@${contributorLine[1]}](https://github.com/${contributorLine[2]})`;
|
|
|
|
contributorInfo = `Contributed by: [@${contributorLine[1]}](https://github.com/${contributorLine[2]})`;
|
|
|
|
|
|
|
|
console.log(`Found contributor info: ${contributorInfo}`);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
console.log('No contributor info found');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!actName || !newPrompt) {
|
|
|
|
if (!actName || !newPrompt) {
|
|
|
|
|
|
|
|
console.log('Failed to extract prompt information');
|
|
|
|
await octokit.issues.createComment({
|
|
|
|
await octokit.issues.createComment({
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
repo: event.repository.name,
|
|
|
|
repo: event.repository.name,
|
|
|
@ -160,12 +175,14 @@ jobs:
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Get content from main branch as reference
|
|
|
|
// Get content from main branch as reference
|
|
|
|
|
|
|
|
console.log('Fetching current content from main branch...');
|
|
|
|
const { data: readmeFile } = await octokit.repos.getContent({
|
|
|
|
const { data: readmeFile } = await octokit.repos.getContent({
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
repo: event.repository.name,
|
|
|
|
repo: event.repository.name,
|
|
|
|
path: 'README.md',
|
|
|
|
path: 'README.md',
|
|
|
|
ref: 'main'
|
|
|
|
ref: 'main'
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
console.log('README.md content fetched');
|
|
|
|
|
|
|
|
|
|
|
|
const { data: csvFile } = await octokit.repos.getContent({
|
|
|
|
const { data: csvFile } = await octokit.repos.getContent({
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
owner: event.repository.owner.login,
|
|
|
@ -173,24 +190,31 @@ jobs:
|
|
|
|
path: 'prompts.csv',
|
|
|
|
path: 'prompts.csv',
|
|
|
|
ref: 'main'
|
|
|
|
ref: 'main'
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
console.log('prompts.csv content fetched');
|
|
|
|
|
|
|
|
|
|
|
|
// Format the new prompt section
|
|
|
|
// Format the new prompt section
|
|
|
|
|
|
|
|
console.log('Preparing content updates...');
|
|
|
|
const newSection = `## ${actName}\n${contributorInfo ? contributorInfo + '\n' : ''}\n> ${newPrompt}\n\n`;
|
|
|
|
const newSection = `## ${actName}\n${contributorInfo ? contributorInfo + '\n' : ''}\n> ${newPrompt}\n\n`;
|
|
|
|
|
|
|
|
|
|
|
|
// Insert the new section before Contributors in README
|
|
|
|
// Insert the new section before Contributors in README
|
|
|
|
let readmeContent = Buffer.from(readmeFile.content, 'base64').toString('utf-8');
|
|
|
|
let readmeContent = Buffer.from(readmeFile.content, 'base64').toString('utf-8');
|
|
|
|
const contributorsIndex = readmeContent.indexOf('## Contributors');
|
|
|
|
const contributorsIndex = readmeContent.indexOf('## Contributors');
|
|
|
|
if (contributorsIndex === -1) {
|
|
|
|
if (contributorsIndex === -1) {
|
|
|
|
readmeContent += newSection; // Append if Contributors section not found
|
|
|
|
console.log('Contributors section not found, appending to end');
|
|
|
|
|
|
|
|
readmeContent += newSection;
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
|
|
|
|
console.log('Inserting before Contributors section');
|
|
|
|
readmeContent = readmeContent.slice(0, contributorsIndex) + newSection + readmeContent.slice(contributorsIndex);
|
|
|
|
readmeContent = readmeContent.slice(0, contributorsIndex) + newSection + readmeContent.slice(contributorsIndex);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Prepare CSV content
|
|
|
|
// Prepare CSV content
|
|
|
|
|
|
|
|
console.log('Preparing CSV content...');
|
|
|
|
const csvContent = Buffer.from(csvFile.content, 'base64').toString('utf-8') +
|
|
|
|
const csvContent = Buffer.from(csvFile.content, 'base64').toString('utf-8') +
|
|
|
|
`\n"${actName.replace(/"/g, '""')}","${newPrompt.replace(/"/g, '""')}"`;
|
|
|
|
`\n"${actName.replace(/"/g, '""')}","${newPrompt.replace(/"/g, '""')}"`;
|
|
|
|
|
|
|
|
|
|
|
|
// Create a tree with both files
|
|
|
|
// Create a tree with both files
|
|
|
|
|
|
|
|
console.log('Creating Git tree...');
|
|
|
|
|
|
|
|
console.log(`Using PR head SHA: ${pr.head.sha}`);
|
|
|
|
const { data: mainTree } = await octokit.git.getTree({
|
|
|
|
const { data: mainTree } = await octokit.git.getTree({
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
repo: event.repository.name,
|
|
|
|
repo: event.repository.name,
|
|
|
@ -199,6 +223,7 @@ jobs:
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// Create blobs for both files
|
|
|
|
// Create blobs for both files
|
|
|
|
|
|
|
|
console.log('Creating file blobs...');
|
|
|
|
const [readmeBlob, csvBlob] = await Promise.all([
|
|
|
|
const [readmeBlob, csvBlob] = await Promise.all([
|
|
|
|
octokit.git.createBlob({
|
|
|
|
octokit.git.createBlob({
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
owner: event.repository.owner.login,
|
|
|
@ -213,8 +238,10 @@ jobs:
|
|
|
|
encoding: 'base64'
|
|
|
|
encoding: 'base64'
|
|
|
|
})
|
|
|
|
})
|
|
|
|
]);
|
|
|
|
]);
|
|
|
|
|
|
|
|
console.log('File blobs created');
|
|
|
|
|
|
|
|
|
|
|
|
// Create a new tree
|
|
|
|
// Create a new tree
|
|
|
|
|
|
|
|
console.log('Creating new tree with updated files...');
|
|
|
|
const { data: newTree } = await octokit.git.createTree({
|
|
|
|
const { data: newTree } = await octokit.git.createTree({
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
repo: event.repository.name,
|
|
|
|
repo: event.repository.name,
|
|
|
@ -234,8 +261,10 @@ jobs:
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
]
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
console.log('New tree created');
|
|
|
|
|
|
|
|
|
|
|
|
// Create a commit
|
|
|
|
// Create a commit
|
|
|
|
|
|
|
|
console.log('Creating commit...');
|
|
|
|
const { data: newCommit } = await octokit.git.createCommit({
|
|
|
|
const { data: newCommit } = await octokit.git.createCommit({
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
repo: event.repository.name,
|
|
|
|
repo: event.repository.name,
|
|
|
@ -243,29 +272,34 @@ jobs:
|
|
|
|
tree: newTree.sha,
|
|
|
|
tree: newTree.sha,
|
|
|
|
parents: [pr.head.sha]
|
|
|
|
parents: [pr.head.sha]
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
console.log(`New commit created: ${newCommit.sha}`);
|
|
|
|
|
|
|
|
|
|
|
|
// Update the reference
|
|
|
|
// Update the reference
|
|
|
|
|
|
|
|
console.log(`Updating branch ${pr.head.ref}...`);
|
|
|
|
await octokit.git.updateRef({
|
|
|
|
await octokit.git.updateRef({
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
repo: event.repository.name,
|
|
|
|
repo: event.repository.name,
|
|
|
|
ref: `heads/${pr.head.ref}`,
|
|
|
|
ref: `heads/${pr.head.ref}`,
|
|
|
|
sha: newCommit.sha
|
|
|
|
sha: newCommit.sha
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
console.log('Branch updated successfully');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
console.log('Adding success comment to PR...');
|
|
|
|
await octokit.issues.createComment({
|
|
|
|
await octokit.issues.createComment({
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
repo: event.repository.name,
|
|
|
|
repo: event.repository.name,
|
|
|
|
issue_number: issueNumber,
|
|
|
|
issue_number: issueNumber,
|
|
|
|
body: `✨ Added "${actName}" to both files`
|
|
|
|
body: `✨ Added "${actName}" to both files`
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
console.log('Process completed successfully');
|
|
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
} catch (error) {
|
|
|
|
console.error('Error:', error);
|
|
|
|
console.error('Error details:', error);
|
|
|
|
await octokit.issues.createComment({
|
|
|
|
await octokit.issues.createComment({
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
owner: event.repository.owner.login,
|
|
|
|
repo: event.repository.name,
|
|
|
|
repo: event.repository.name,
|
|
|
|
issue_number: issueNumber,
|
|
|
|
issue_number: issueNumber,
|
|
|
|
body: `❌ Error while trying to update files: ${error.message}`
|
|
|
|
body: `❌ Error while trying to update files:\n\`\`\`\n${error.message}\n\`\`\``
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|