From 684c35bc008c6e4149b555a4ab37d0f4115b6ec8 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Fri, 15 May 2026 03:04:27 +0000 Subject: [PATCH 1/4] fix: skip missing sync paths in commit step --- app/git.js | 5 ++++- app/git.test.js | 13 +++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/git.js b/app/git.js index 02637fa..140420d 100644 --- a/app/git.js +++ b/app/git.js @@ -74,7 +74,10 @@ export async function commitAndPush(workspace, repoDir, _spawnSync = spawnSync) fs.copyFileSync(src, dest); } - run(['add', ...SYNC_PATHS], repoDir); + const existingSyncPaths = SYNC_PATHS.filter(relPath => fs.existsSync(path.join(repoDir, relPath))); + if (existingSyncPaths.length > 0) { + run(['add', ...existingSyncPaths], repoDir); + } const status = run(['status', '--porcelain'], repoDir); if (!status) { diff --git a/app/git.test.js b/app/git.test.js index e1131e3..c9ab8e2 100644 --- a/app/git.test.js +++ b/app/git.test.js @@ -101,6 +101,19 @@ describe('commitAndPush', () => { assert.ok(!addCall.args.includes('README.md')); }); + it('does not add missing sync paths', async () => { + const missingPath = path.join(workspace, '.amazonq/rules/triage-findings.md'); + fs.rmSync(missingPath, { force: true }); + fs.rmSync(path.join(workspace, 'repo', '.amazonq/rules/triage-findings.md'), { force: true }); + const spawn = makeSpawn(); + + await commitAndPush(workspace, path.join(workspace, 'repo'), spawn); + + const addCall = spawn.calls.find(c => c.args[0] === 'add'); + assert.ok(addCall, 'expected git add to run'); + assert.ok(!addCall.args.includes('.amazonq/rules/triage-findings.md')); + }); + it('overwrites existing repo copies with workspace files', async () => { const repoDir = path.join(workspace, 'repo'); fs.writeFileSync(path.join(repoDir, '.github/skills/triage-findings/SKILL.md'), 'stale'); From c70a81898622def50656ef1156882363ada691ae Mon Sep 17 00:00:00 2001 From: Jeffery Date: Fri, 15 May 2026 03:09:54 +0000 Subject: [PATCH 2/4] fix: mirror sync files before commit --- app/git.js | 23 ++++++++++++++++++----- app/git.test.js | 9 +++++---- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/app/git.js b/app/git.js index 140420d..b21c3b5 100644 --- a/app/git.js +++ b/app/git.js @@ -65,19 +65,32 @@ export async function commitAndPush(workspace, repoDir, _spawnSync = spawnSync) run(['config', 'user.email', 'ai-review[bot]@gitea'], repoDir); run(['config', 'user.name', 'AI Review Bot'], repoDir); - // Always copy source files over the repo copy so skill files stay in sync. + const existingSyncPaths = []; + const missingSyncPaths = []; + + // Mirror sync files from workspace into the repo copy. for (const relPath of SYNC_PATHS) { const src = path.join(workspace, relPath); const dest = path.join(repoDir, relPath); - if (!fs.existsSync(src)) continue; - fs.mkdirSync(path.dirname(dest), { recursive: true }); - fs.copyFileSync(src, dest); + if (fs.existsSync(src)) { + fs.mkdirSync(path.dirname(dest), { recursive: true }); + fs.copyFileSync(src, dest); + existingSyncPaths.push(relPath); + continue; + } + + if (fs.existsSync(dest)) { + fs.rmSync(dest, { force: true }); + } + missingSyncPaths.push(relPath); } - const existingSyncPaths = SYNC_PATHS.filter(relPath => fs.existsSync(path.join(repoDir, relPath))); if (existingSyncPaths.length > 0) { run(['add', ...existingSyncPaths], repoDir); } + if (missingSyncPaths.length > 0) { + run(['rm', '--cached', '--ignore-unmatch', '--', ...missingSyncPaths], repoDir); + } const status = run(['status', '--porcelain'], repoDir); if (!status) { diff --git a/app/git.test.js b/app/git.test.js index c9ab8e2..9807d01 100644 --- a/app/git.test.js +++ b/app/git.test.js @@ -101,7 +101,7 @@ describe('commitAndPush', () => { assert.ok(!addCall.args.includes('README.md')); }); - it('does not add missing sync paths', async () => { + it('removes missing sync paths from the repo copy', async () => { const missingPath = path.join(workspace, '.amazonq/rules/triage-findings.md'); fs.rmSync(missingPath, { force: true }); fs.rmSync(path.join(workspace, 'repo', '.amazonq/rules/triage-findings.md'), { force: true }); @@ -109,9 +109,10 @@ describe('commitAndPush', () => { await commitAndPush(workspace, path.join(workspace, 'repo'), spawn); - const addCall = spawn.calls.find(c => c.args[0] === 'add'); - assert.ok(addCall, 'expected git add to run'); - assert.ok(!addCall.args.includes('.amazonq/rules/triage-findings.md')); + const rmCall = spawn.calls.find(c => c.args[0] === 'rm'); + assert.ok(rmCall, 'expected git rm to run'); + assert.ok(rmCall.args.includes('.amazonq/rules/triage-findings.md')); + assert.equal(fs.existsSync(path.join(workspace, 'repo', '.amazonq/rules/triage-findings.md')), false); }); it('overwrites existing repo copies with workspace files', async () => { From 69e3b33558bcda96fdf1dbc4eb9c0874232c407e Mon Sep 17 00:00:00 2001 From: Jeffery Date: Fri, 15 May 2026 03:11:41 +0000 Subject: [PATCH 3/4] docs: describe mirror sync commit behavior --- README.md | 4 ++-- TODO.md | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f5e3ff5..d47a71e 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ 5. 從PR問題表格中取出所有舊問題,依照等級排序後 Comment 到 Push Request 6. 從PR問題表格中取出所有新問題,排除嚴重等級的問題後 Comment 到 Push Request 7. 從PR問題表格中取出所有新問題,將每個嚴重等級的問題 Comment 到 Push Request -8. Commit 問題檔案 +8. Commit 問題檔案,將 workspace 中實際存在的同步檔覆蓋到記憶區;workspace 不存在但記憶區已存在的同步檔則移除後再同步,避免 `git add` 因缺檔 pathspec 失敗 9. 如果PR問題表格中有嚴重問題,則不要讓 workflow 執行成功(exit 1) # 設計 @@ -227,4 +227,4 @@ Amazon Q:直接輸入 `triage-findings 問題原始檔(文字或截圖)` ### 版本包含 -提交時一併包含 `triage-findings` skill 與各平台入口檔;已存在檔案一律覆蓋,同步到最新內容。 +提交時一併包含 `triage-findings` skill 與各平台入口檔;已存在檔案一律覆蓋,同步到最新內容;若 workspace 已移除某個同步檔,記憶區中的對應檔案也會一併刪除,讓 commit 結果與 workspace 保持一致。 diff --git a/TODO.md b/TODO.md index ce30abd..2de90ba 100644 --- a/TODO.md +++ b/TODO.md @@ -38,9 +38,9 @@ - 已驗收:log 已明確顯示 `.gitea/ai-review/findings.json` 與 `.gitea/ai-review/exclusions.json` 都是 `JSON 格式正確`。 ## 階段八:記憶區 commit/push 與錯誤處理 -- 目標:記憶區能成功 commit/push,且一併包含 `triage-findings` skill 與各平台入口檔;skill 檔案已存在時一律以來源覆蓋,達到同步效果;錯誤時有明確 log,流程結束有總結訊息。 -- 驗收:log 有「persisted findings」、「commit=...」、「push=...」等訊息,且能看出 skill 相關檔案已一併提交並被覆蓋同步;錯誤時有「Runner failed: ...」等明確錯誤說明。 -- 已驗收:log 已出現 `persisted findings commit=79506eb push=整理程式碼`,代表 commit/push 成功。 +- 目標:記憶區能成功 commit/push,且一併包含 `triage-findings` skill 與各平台入口檔;skill 檔案已存在時一律以來源覆蓋,缺少的同步檔則從記憶區刪除,達到鏡像同步效果;錯誤時有明確 log,流程結束有總結訊息。 +- 驗收:log 有「persisted findings」、「commit=...」、「push=...」等訊息,且能看出 skill 相關檔案已一併提交並被鏡像同步;當 workspace 不再包含某個同步檔時,記憶區中的對應檔案會被刪除且不再出現在 commit;錯誤時有「Runner failed: ...」等明確錯誤說明。 +- 已驗收:log 已出現 `persisted findings commit=79506eb push=整理程式碼`,代表 commit/push 成功;本次已補上缺檔刪除的鏡像同步邏輯,相關單元測試也已覆蓋。 ## 階段九:阻擋嚴重問題 PR(第 8 點) - 目標:如果 PR 問題表格中有嚴重(critical)問題,workflow 需直接 exit 1,不讓流程成功。 From 515ccb0509c2244925dbe889631050beaf799b18 Mon Sep 17 00:00:00 2001 From: AI Review Bot Date: Fri, 15 May 2026 03:14:28 +0000 Subject: [PATCH 4/4] chore: update ai-review findings [skip ci] --- .amazonq/rules/triage-findings.md | 14 ------------- .claude/skills/triage-findings/SKILL.md | 28 ------------------------- .gemini/skills/triage-findings/SKILL.md | 28 ------------------------- .github/copilot-instructions.md | 16 -------------- .github/skills/triage-findings/SKILL.md | 28 ------------------------- CLAUDE.md | 14 ------------- GEMINI.md | 14 ------------- 7 files changed, 142 deletions(-) delete mode 100644 .amazonq/rules/triage-findings.md delete mode 100644 .claude/skills/triage-findings/SKILL.md delete mode 100644 .gemini/skills/triage-findings/SKILL.md delete mode 100644 .github/copilot-instructions.md delete mode 100644 .github/skills/triage-findings/SKILL.md delete mode 100644 CLAUDE.md delete mode 100644 GEMINI.md diff --git a/.amazonq/rules/triage-findings.md b/.amazonq/rules/triage-findings.md deleted file mode 100644 index f6468cd..0000000 --- a/.amazonq/rules/triage-findings.md +++ /dev/null @@ -1,14 +0,0 @@ -# Triage Findings - -When the task is to triage review findings, follow this workflow: - -1. Merge all findings into one list. -2. Remove duplicates. -3. Sort by severity: `critical` -> `warning` -> `info`. -4. Renumber from 1 after sorting. -5. Fix real issues with the smallest safe change. -6. Add false positives to `.gitea/ai-review/exclusions.json`. -7. Add or update tests when behavior changes. -8. Re-check the issue after each fix. - -Use the repo-local `triage-findings` skill for the same workflow when running in Codex. diff --git a/.claude/skills/triage-findings/SKILL.md b/.claude/skills/triage-findings/SKILL.md deleted file mode 100644 index ac823cf..0000000 --- a/.claude/skills/triage-findings/SKILL.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -name: triage-findings -description: Triage findings, fix real issues, and exclude false positives. ---- - -# Triage Findings - -## Use - -直接輸入:`triage-findings 問題原始檔(文字或截圖)` - -## Workflow - -1. Merge all findings. -2. Sort by severity: - - critical - - warning - - info -3. Renumber from 1. -4. Fix real issues. -5. Put false positives into `.gitea/ai-review/exclusions.json`. -6. Add tests when behavior changes. - -## Output Rules - -- Keep the final list short. -- Keep numbering contiguous. -- Preserve file path, location, and fix. diff --git a/.gemini/skills/triage-findings/SKILL.md b/.gemini/skills/triage-findings/SKILL.md deleted file mode 100644 index ac823cf..0000000 --- a/.gemini/skills/triage-findings/SKILL.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -name: triage-findings -description: Triage findings, fix real issues, and exclude false positives. ---- - -# Triage Findings - -## Use - -直接輸入:`triage-findings 問題原始檔(文字或截圖)` - -## Workflow - -1. Merge all findings. -2. Sort by severity: - - critical - - warning - - info -3. Renumber from 1. -4. Fix real issues. -5. Put false positives into `.gitea/ai-review/exclusions.json`. -6. Add tests when behavior changes. - -## Output Rules - -- Keep the final list short. -- Keep numbering contiguous. -- Preserve file path, location, and fix. diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md deleted file mode 100644 index 92710d5..0000000 --- a/.github/copilot-instructions.md +++ /dev/null @@ -1,16 +0,0 @@ -# Triage Findings - -When the task is to triage review findings, follow this workflow: - -1. Merge all findings into one list. -2. Remove duplicates. -3. Sort by severity: `critical` -> `warning` -> `info`. -4. Renumber from 1 after sorting. -5. Fix real issues with the smallest safe change. -6. Add false positives to `.gitea/ai-review/exclusions.json`. -7. Add or update tests when behavior changes. -8. Re-check the issue after each fix. - -Use the repo-local `triage-findings` skill for the same workflow when running in Codex. - -Trigger it with `/triage-findings`. diff --git a/.github/skills/triage-findings/SKILL.md b/.github/skills/triage-findings/SKILL.md deleted file mode 100644 index 01e14d5..0000000 --- a/.github/skills/triage-findings/SKILL.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -name: triage-findings -description: Triage findings, fix real issues, and exclude false positives. ---- - -# Triage Findings - -## Use - -`triage-findings 問題原始檔(文字或截圖)` - -## Workflow - -1. Merge all findings. -2. Sort by severity: - - critical - - warning - - info -3. Renumber from 1. -4. Fix real issues. -5. Put false positives into `.gitea/ai-review/exclusions.json`. -6. Add tests when behavior changes. - -## Output Rules - -- Keep the final list short. -- Keep numbering contiguous. -- Preserve file path, location, and fix. diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 3b5f291..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,14 +0,0 @@ -# Triage Findings - -Use the triage-finding workflow for review issue lists: - -1. Merge findings into one list. -2. Remove duplicates. -3. Sort by severity: `critical` -> `warning` -> `info`. -4. Renumber from 1. -5. Fix real issues with the smallest safe change. -6. Put false positives into `.gitea/ai-review/exclusions.json`. -7. Add or update tests when behavior changes. -8. Re-check after each fix. - -The full reusable skill lives in `.claude/skills/triage-findings/SKILL.md`. diff --git a/GEMINI.md b/GEMINI.md deleted file mode 100644 index e4cfde8..0000000 --- a/GEMINI.md +++ /dev/null @@ -1,14 +0,0 @@ -# Triage Findings - -Use the triage-finding workflow for review issue lists: - -1. Merge findings into one list. -2. Remove duplicates. -3. Sort by severity: `critical` -> `warning` -> `info`. -4. Renumber from 1. -5. Fix real issues with the smallest safe change. -6. Put false positives into `.gitea/ai-review/exclusions.json`. -7. Add or update tests when behavior changes. -8. Re-check after each fix. - -The reusable skill lives in `.gemini/skills/triage-findings/SKILL.md`.