generated from ztimson/template
Compare commits
7
Commits
0.0.7
..
7becf99be2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7becf99be2 | ||
|
|
99a1e55471 | ||
|
|
23cb66544e | ||
|
|
9e5372f37b | ||
|
|
eb4486f196 | ||
|
|
f3df34ec47 | ||
|
|
f2936ae4dc |
@@ -16,4 +16,4 @@ How can it be fixed or improved?
|
|||||||
|
|
||||||
Steps to reproduce?
|
Steps to reproduce?
|
||||||
|
|
||||||
Anything other useful information, logs or screenshots?
|
Any other useful information? Logs, screenshots, steps to reproduce?
|
||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ztimson/ai-agents",
|
"name": "@ztimson/ai-agents",
|
||||||
"version": "0.0.7",
|
"version": "0.1.0",
|
||||||
"description": "AI agents",
|
"description": "AI agents",
|
||||||
"keywords": ["ai", "review"],
|
"keywords": ["ai", "review"],
|
||||||
"author": "ztimson",
|
"author": "ztimson",
|
||||||
|
|||||||
+20
-13
@@ -26,11 +26,13 @@ dotenv.config({path: '.env.local', override: true, quiet: true});
|
|||||||
console.log(`Processing issue #${ticket}`);
|
console.log(`Processing issue #${ticket}`);
|
||||||
|
|
||||||
// Fetch issue
|
// Fetch issue
|
||||||
const issueRes = await fetch(`${git}/api/v1/repos/${owner}/${repo}/issues/${ticket}`, {
|
const issueData = await fetch(`${git}/api/v1/repos/${owner}/${repo}/issues/${ticket}`, {
|
||||||
headers: {'Authorization': `token ${auth}`}
|
headers: {'Authorization': `token ${auth}`}
|
||||||
}).then(async resp => !resp.ok ? throw new Error(`${updateRes.status} ${await updateRes.text()}`) : null);
|
}).then(async resp => {
|
||||||
const issueData = await issueRes.json();
|
if(resp.ok) return resp.json();
|
||||||
if(issueData.labels[0] !== 'Review/AI' || issueData.labels.length !== 1) {
|
else throw new Error(`${resp.status} ${await resp.text()}`);
|
||||||
|
});
|
||||||
|
if(issueData.labels?.[0] !== 1 || issueData.labels?.[0]?.name !== 'Review/AI') {
|
||||||
console.log('Skipping');
|
console.log('Skipping');
|
||||||
return process.exit();
|
return process.exit();
|
||||||
}
|
}
|
||||||
@@ -148,11 +150,13 @@ Output ONLY markdown. No explanations, labels, or extra formatting.`});
|
|||||||
if(!body) throw new Error('Invalid response from AI');
|
if(!body) throw new Error('Invalid response from AI');
|
||||||
|
|
||||||
// Check for duplicates
|
// Check for duplicates
|
||||||
|
const repoInfo = await fetch(`${git}/api/v1/repos/${owner}/${repo}`, {headers: {'Authorization': `token ${auth}`},}).then(resp => resp.ok ? resp.json() : null);
|
||||||
const search = await fetch(`${git}/api/v1/repos/issues/search`, {
|
const search = await fetch(`${git}/api/v1/repos/issues/search`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: {'Authorization': `token ${auth}`, 'Content-Type': 'application/json'},
|
headers: {'Authorization': `token ${auth}`, 'Content-Type': 'application/json'},
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
priority_repo_id: repo,
|
owner,
|
||||||
|
priority_repo_id: repoInfo.id,
|
||||||
type: 'issues',
|
type: 'issues',
|
||||||
limit: 3,
|
limit: 3,
|
||||||
q: title
|
q: title
|
||||||
@@ -165,39 +169,42 @@ Output ONLY markdown. No explanations, labels, or extra formatting.`});
|
|||||||
system: `Your job is to identify duplicates. Respond with the ID number of the duplicate or nothing if there are no matches \n\n${dupes}`
|
system: `Your job is to identify duplicates. Respond with the ID number of the duplicate or nothing if there are no matches \n\n${dupes}`
|
||||||
}))?.pop()?.content;
|
}))?.pop()?.content;
|
||||||
// Handle duplicates
|
// Handle duplicates
|
||||||
if(!!hasDuplicates && (dupeId = dupeIds.find(id => hasDuplicates.includes(id.toString()))) != null) {
|
if(!!hasDuplicates && (dupeId = dupeIds.find(id => new RegExp(`\\b${id}\\b`, 'm').test(hasDuplicates)))) {
|
||||||
await fetch(`${git}/api/v1/repos/${owner}/${repo}/issues/${ticket}/comments`, {
|
await fetch(`${git}/api/v1/repos/${owner}/${repo}/issues/${ticket}/comments`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: {'Authorization': `token ${auth}`, 'Content-Type': 'application/json'},
|
headers: {'Authorization': `token ${auth}`, 'Content-Type': 'application/json'},
|
||||||
body: `{"body": "Duplicate of #${dupeId}"}`
|
body: `{"body": "Duplicate of #${dupeId}"}`
|
||||||
}).then(async resp => !resp.ok ? throw new Error(`${updateRes.status} ${await updateRes.text()}`) : null);
|
}).then(async resp => { if(!resp.ok) throw new Error(`${resp.status} ${await resp.text()}`); });
|
||||||
await fetch(`${git}/api/v1/repos/${owner}/${repo}/issues/${ticket}/labels`, {
|
await fetch(`${git}/api/v1/repos/${owner}/${repo}/issues/${ticket}/labels`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: {'Authorization': `token ${auth}`, 'Content-Type': 'application/json'},
|
headers: {'Authorization': `token ${auth}`, 'Content-Type': 'application/json'},
|
||||||
body: '{"labels":["Reviewed/Duplicate"]}'
|
body: '{"labels":["Reviewed/Duplicate"]}'
|
||||||
}).then(async resp => !resp.ok ? throw new Error(`${updateRes.status} ${await updateRes.text()}`) : null);
|
}).then(async resp => { if(!resp.ok) throw new Error(`${resp.status} ${await resp.text()}`); });
|
||||||
await fetch(`${git}/api/v1/repos/${owner}/${repo}/issues/${ticket}`, {
|
await fetch(`${git}/api/v1/repos/${owner}/${repo}/issues/${ticket}`, {
|
||||||
method: 'PATCH',
|
method: 'PATCH',
|
||||||
headers: {'Authorization': `token ${auth}`, 'Content-Type': 'application/json'},
|
headers: {'Authorization': `token ${auth}`, 'Content-Type': 'application/json'},
|
||||||
body: '{"state": "closed"}'
|
body: '{"state": "closed"}'
|
||||||
}).then(async resp => !resp.ok ? throw new Error(`${updateRes.status} ${await updateRes.text()}`) : null);
|
}).then(async resp => { if(!resp.ok) throw new Error(`${resp.status} ${await resp.text()}`); });
|
||||||
console.log('Duplicate');
|
console.log('Duplicate');
|
||||||
return process.exit();
|
return process.exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update ticket
|
// Update ticket
|
||||||
const updateRes = await fetch(`${git}/api/v1/repos/${owner}/${repo}/issues/${ticket}`, {
|
await fetch(`${git}/api/v1/repos/${owner}/${repo}/issues/${ticket}`, {
|
||||||
method: 'PATCH',
|
method: 'PATCH',
|
||||||
headers: {'Authorization': `token ${auth}`, 'Content-Type': 'application/json'},
|
headers: {'Authorization': `token ${auth}`, 'Content-Type': 'application/json'},
|
||||||
body: JSON.stringify({title, body})
|
body: JSON.stringify({title, body})
|
||||||
}).then(async resp => !resp.ok ? throw new Error(`${updateRes.status} ${await updateRes.text()}`) : null);
|
}).then(async resp => { if(!resp.ok) throw new Error(`${resp.status} ${await resp.text()}`); });
|
||||||
if(type) { // Label
|
if(type) { // Label
|
||||||
await fetch(`${git}/api/v1/repos/${owner}/${repo}/issues/${ticket}/labels`, {
|
await fetch(`${git}/api/v1/repos/${owner}/${repo}/issues/${ticket}/labels`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: {'Authorization': `token ${auth}`, 'Content-Type': 'application/json'},
|
headers: {'Authorization': `token ${auth}`, 'Content-Type': 'application/json'},
|
||||||
body: `{"labels":["Reviewed/${type[0].toUpperCase() + type.slice(1).toLowerCase()}"]}`
|
body: `{"labels":["Reviewed/${type[0].toUpperCase() + type.slice(1).toLowerCase()}"]}`
|
||||||
}).then(async resp => !resp.ok ? throw new Error(`${updateRes.status} ${await updateRes.text()}`) : null);
|
}).then(async resp => { if(!resp.ok) throw new Error(`${resp.status} ${await resp.text()}`); });
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(`Title: ${title}\nType: ${type}\nBody:\n${body}`);
|
console.log(`Title: ${title}\nType: ${type}\nBody:\n${body}`);
|
||||||
})();
|
})().catch(err => {
|
||||||
|
console.error(`Error: ${err.message || err.toString()}`);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
|
|||||||
+5
-2
@@ -43,7 +43,7 @@ dotenv.config({path: '.env.local', override: true, quiet: true, debug: false});
|
|||||||
const comments = await Promise.all(reviews.map(r => fetch(`${git}/api/v1/repos/${owner}/${repo}/pulls/${pr}/reviews/${r.id}/comments`, {
|
const comments = await Promise.all(reviews.map(r => fetch(`${git}/api/v1/repos/${owner}/${repo}/pulls/${pr}/reviews/${r.id}/comments`, {
|
||||||
headers: {'Authorization': `token ${auth}`}
|
headers: {'Authorization': `token ${auth}`}
|
||||||
}).then(resp => resp.ok ? resp.json() : [])));
|
}).then(resp => resp.ok ? resp.json() : [])));
|
||||||
existingComments += comments.flatten().map(c => `${c.path}:${c.position}\n${c.body}`).join('\n\n');
|
existingComments += comments.flat().map(c => `${c.path}:${c.position}\n${c.body}`).join('\n\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
let options = {ollama: {model, host}};
|
let options = {ollama: {model, host}};
|
||||||
@@ -106,4 +106,7 @@ dotenv.config({path: '.env.local', override: true, quiet: true, debug: false});
|
|||||||
if(!res.ok) throw new Error(`${res.status} ${await res.text()}`);
|
if(!res.ok) throw new Error(`${res.status} ${await res.text()}`);
|
||||||
}
|
}
|
||||||
console.log(comments.map(c => `${c.path}${c.new_position ? `:${c.new_position}` : ''}\n${c.body}`).join('\n\n') + '\n\n' + summary);
|
console.log(comments.map(c => `${c.path}${c.new_position ? `:${c.new_position}` : ''}\n${c.body}`).join('\n\n') + '\n\n' + summary);
|
||||||
})();
|
})().catch(err => {
|
||||||
|
console.error(`Error: ${err.message || err.toString()}`);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user