feat: implement git repository synchronization and automated commit functionality for AI review findings
This commit is contained in:
@@ -11,6 +11,7 @@ const remoteUrl = `${GITEA_SERVER_URL.replace(/\/$/, '')}/${GITEA_REPOSITORY}.gi
|
||||
export const BOT_COMMIT_MARKER = '[ai-review-bot]';
|
||||
export const SYNC_PATHS = [
|
||||
'.amazonq/rules/triage-findings.md',
|
||||
'.agents/skills/triage-findings/SKILL.md',
|
||||
'.antigravity/skills/triage-findings/SKILL.md',
|
||||
'.codex/skills/triage-findings/SKILL.md',
|
||||
'.codex/skills/triage-findings/agents/openai.yaml',
|
||||
@@ -18,17 +19,20 @@ export const SYNC_PATHS = [
|
||||
'.gemini/skills/triage-findings/SKILL.md',
|
||||
'.github/copilot-instructions.md',
|
||||
'.github/skills/triage-findings/SKILL.md',
|
||||
'AGENTS.md',
|
||||
'ANTIGRAVITY.md',
|
||||
'CLAUDE.md',
|
||||
'GEMINI.md',
|
||||
];
|
||||
const FORCE_SYNC_FILE_PATHS = [
|
||||
'.github/copilot-instructions.md',
|
||||
'AGENTS.md',
|
||||
'ANTIGRAVITY.md',
|
||||
'CLAUDE.md',
|
||||
'GEMINI.md',
|
||||
];
|
||||
const SYNC_TREE_PATHS = [
|
||||
'.agents/skills/triage-findings',
|
||||
'.antigravity/skills/triage-findings',
|
||||
'.codex/skills/triage-findings',
|
||||
'.claude/skills/triage-findings',
|
||||
|
||||
@@ -130,11 +130,13 @@ describe('commitAndPush', () => {
|
||||
assert.ok(generatedAddCall, 'expected git add for generated review files');
|
||||
assert.ok(skillAddCall.args.includes('.codex/skills/triage-findings/SKILL.md'));
|
||||
assert.ok(skillAddCall.args.includes('.codex/skills/triage-findings/agents/openai.yaml'));
|
||||
assert.ok(skillAddCall.args.includes('.agents/skills/triage-findings/SKILL.md'));
|
||||
assert.ok(skillAddCall.args.includes('.claude/skills/triage-findings/SKILL.md'));
|
||||
assert.ok(skillAddCall.args.includes('.gemini/skills/triage-findings/SKILL.md'));
|
||||
assert.ok(skillAddCall.args.includes('.antigravity/skills/triage-findings/SKILL.md'));
|
||||
assert.ok(skillAddCall.args.includes('.github/copilot-instructions.md'));
|
||||
assert.ok(skillAddCall.args.includes('.amazonq/rules/triage-findings.md'));
|
||||
assert.ok(skillAddCall.args.includes('AGENTS.md'));
|
||||
assert.ok(skillAddCall.args.includes('ANTIGRAVITY.md'));
|
||||
assert.ok(skillAddCall.args.includes('CLAUDE.md'));
|
||||
assert.ok(skillAddCall.args.includes('GEMINI.md'));
|
||||
@@ -159,7 +161,9 @@ describe('commitAndPush', () => {
|
||||
|
||||
it('overwrites existing repo copies with workspace files', async () => {
|
||||
const repoDir = path.join(workspace, 'repo');
|
||||
fs.writeFileSync(path.join(repoDir, '.agents/skills/triage-findings/SKILL.md'), 'stale');
|
||||
fs.writeFileSync(path.join(repoDir, '.github/skills/triage-findings/SKILL.md'), 'stale');
|
||||
fs.writeFileSync(path.join(repoDir, 'AGENTS.md'), 'stale');
|
||||
fs.writeFileSync(path.join(repoDir, 'ANTIGRAVITY.md'), 'stale');
|
||||
fs.writeFileSync(path.join(repoDir, 'CLAUDE.md'), 'stale');
|
||||
fs.writeFileSync(path.join(repoDir, 'GEMINI.md'), 'stale');
|
||||
@@ -168,6 +172,8 @@ describe('commitAndPush', () => {
|
||||
await commitAndPush(workspace, repoDir, makeSpawn(), sourceRoot);
|
||||
|
||||
assert.equal(fs.readFileSync(path.join(repoDir, '.github/skills/triage-findings/SKILL.md'), 'utf8'), '.github/skills/triage-findings/SKILL.md');
|
||||
assert.equal(fs.readFileSync(path.join(repoDir, '.agents/skills/triage-findings/SKILL.md'), 'utf8'), '.agents/skills/triage-findings/SKILL.md');
|
||||
assert.equal(fs.readFileSync(path.join(repoDir, 'AGENTS.md'), 'utf8'), 'AGENTS.md');
|
||||
assert.equal(fs.readFileSync(path.join(repoDir, 'ANTIGRAVITY.md'), 'utf8'), 'ANTIGRAVITY.md');
|
||||
assert.equal(fs.readFileSync(path.join(repoDir, 'CLAUDE.md'), 'utf8'), 'CLAUDE.md');
|
||||
assert.equal(fs.readFileSync(path.join(repoDir, 'GEMINI.md'), 'utf8'), 'GEMINI.md');
|
||||
|
||||
@@ -26,12 +26,14 @@ export async function getPRDiff() {
|
||||
const resp = await axios.get(api(`/repos/${GITEA_REPOSITORY}/pulls/${PR_NUMBER}.diff`), { headers: headers(), timeout: 60000, httpsAgent });
|
||||
return filterDiff(resp.data, [
|
||||
'.amazonq/',
|
||||
'.agents/',
|
||||
'.antigravity/',
|
||||
'.claude/',
|
||||
'.codex/',
|
||||
'.gemini/',
|
||||
'.gitea/',
|
||||
'.github/',
|
||||
'AGENTS.md',
|
||||
'ANTIGRAVITY.md',
|
||||
'CLAUDE.md',
|
||||
'GEMINI.md',
|
||||
|
||||
+2
-2
@@ -119,8 +119,8 @@ describe('filterDiff', () => {
|
||||
});
|
||||
|
||||
it('returns empty string when all blocks are excluded', () => {
|
||||
const diff = block('.gitea/workflows/review.yaml') + block('.gitea/ai-review/findings.json') + block('CLAUDE.md');
|
||||
const result = filterDiff(diff, ['.gitea/', 'CLAUDE.md']);
|
||||
const diff = block('.gitea/workflows/review.yaml') + block('.gitea/ai-review/findings.json') + block('.agents/skills/triage-findings/SKILL.md');
|
||||
const result = filterDiff(diff, ['.gitea/', '.agents/']);
|
||||
assert.equal(result, '');
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user