Compare commits

..

23 Commits

Author SHA1 Message Date
jiantw83 d690773fa8 Merge pull request 'feat: refactor commitAndPush to use a runner function and improve token security; add tests for git operations' (#69) from feat/refactor/kiro/fix into feat/refactor/main
Reviewed-on: jiantw83/code-review#69
2026-05-12 02:28:33 +00:00
jiantw83 02a6a109da Merge pull request 'feat/refactor/kiro/fix-1' (#75) from feat/refactor/kiro/fix-1 into feat/refactor/kiro/fix
Reviewed-on: jiantw83/code-review#75
2026-05-12 02:27:31 +00:00
AI Review Bot 67e1e83210 chore: update ai-review findings [skip ci] 2026-05-12 02:26:16 +00:00
jiantw83 0116bad4e3 fix: add Leo/Zara false positive exclusion; add cloneRepo unit tests 2026-05-12 02:26:16 +00:00
AI Review Bot 60a4854d56 chore: update ai-review findings [skip ci] 2026-05-12 02:26:16 +00:00
AI Review Bot 1e82594db2 chore: update ai-review findings [skip ci] 2026-05-12 02:26:16 +00:00
jiantw83 f0f417bd2e refactor: rename Step4 to AI 排除問題過濾 2026-05-12 02:26:16 +00:00
AI Review Bot bf1c081c40 chore: update ai-review findings [skip ci] 2026-05-12 02:26:16 +00:00
jiantw83 4ac614686c docs: update TODO stage4 description and fix findings filename typo 2026-05-12 02:26:16 +00:00
jiantw83 e07f1f8a03 feat: add AI false positive filtering in Step4 2026-05-12 02:26:16 +00:00
jiantw83 f3f24f0af2 fix: use includes matching for exclusions location and suggestion 2026-05-12 02:26:16 +00:00
AI Review Bot b020cbe9e1 chore: update ai-review findings [skip ci] 2026-05-12 02:26:16 +00:00
jiantw83 8779df9e8d fix: clone repo before Step3/4 to read findings and exclusions from head branch 2026-05-12 02:26:16 +00:00
AI Review Bot 7333f0a98a chore: update ai-review findings [skip ci] 2026-05-12 02:26:16 +00:00
jiantw83 ab688b4764 chore: add exclusions for Rex false positive on git.js token handling 2026-05-12 02:26:16 +00:00
jiantw83 1633a9ef7b docs: mark all TODO stages complete 2026-05-12 02:26:16 +00:00
jiantw83 0bf90d44df fix: align flow with README, add Step4 exclusions filter, fix step numbers 2026-05-12 02:26:16 +00:00
jiantw83 799d398b95 refactor: reorganize TODO stages for clarity and accuracy in workflow steps
Co-authored-by: Copilot <copilot@github.com>
2026-05-12 02:26:16 +00:00
jiantw83 1c2fc679b4 refactor: update processing steps in README for clarity and accuracy 2026-05-12 02:26:16 +00:00
jiantw83 75d4a44fa6 refactor: remove outdated AI Code configurations for Kilo, Roo, Cline, Continue, and Kade 2026-05-12 02:26:16 +00:00
AI Review Bot ca6edea43d chore: update ai-review findings [skip ci] 2026-05-12 02:26:16 +00:00
jiantw83 e22223e501 fix: update askpass script to securely read token from env var 2026-05-12 02:26:08 +00:00
AI Review Bot 3fef7df7a5 chore: update ai-review findings [skip ci] 2026-05-12 01:09:42 +00:00
3 changed files with 62 additions and 115 deletions
+4
View File
@@ -3,5 +3,9 @@
"role": "Rex",
"location": "app/git.js",
"suggestion": "請避免將敏感資料(如 GITEA_TOKEN)直接寫入環境變數"
},
{
"location": "app/git.js",
"suggestion": "GITEA_TOKEN 直接嵌入 URL 中"
}
]
+1 -114
View File
@@ -1,114 +1 @@
[
{
"level": "warning",
"role": "Rex",
"location": "app/git.js:14",
"suggestion": "在 cloneRepo 函數中,請確保 GIT_TOKEN 不會被寫入到檔案系統中,避免敏感資訊洩漏。",
"is_new": false
},
{
"level": "warning",
"role": "Leo",
"location": "app/findings.js:93",
"suggestion": "建議在 loadExclusions 函式中增加對於 JSON 格式的驗證,確保讀取的資料符合預期格式,避免潛在的錯誤。",
"is_new": false
},
{
"level": "warning",
"role": "Leo",
"location": "app/findings.js:40",
"suggestion": "在 applyExclusions 函式中,建議增加對於 findings 和 exclusions 參數的有效性檢查,以提高程式的健壯性。",
"is_new": false
},
{
"level": "warning",
"role": "Zara",
"location": "app/findings.js:40",
"suggestion": "在 applyExclusions 函數中,使用 Array.prototype.some 進行過濾時,可能會導致性能問題,特別是當 findings 和 exclusions 的數量都很大時。建議使用更高效的資料結構(如 HashSet)來加速查詢。",
"is_new": false
},
{
"level": "warning",
"role": "Maya",
"location": "app/findings.js:40",
"suggestion": "建議在 applyExclusions 函數中增加對 findings 內容的驗證,確保其格式正確,以提高測試的穩定性和可靠性。",
"is_new": false
},
{
"level": "info",
"role": "Leo",
"location": "README.md",
"suggestion": "建議在 README 中增加對於新功能(如排除問題過濾)的詳細說明,以便未來的維護者能快速了解其功能。",
"is_new": false
},
{
"level": "info",
"role": "Leo",
"location": "app/main.js",
"suggestion": "建議在 main 函式中增加對於每個步驟的詳細註解,讓未來的維護者能更容易理解程式邏輯。",
"is_new": false
},
{
"level": "info",
"role": "Zara",
"location": "app/findings.js:39",
"suggestion": "在過濾 findings 時,建議將過濾條件的邏輯提取為獨立函數,以提高可讀性和可維護性。",
"is_new": false
},
{
"level": "info",
"role": "Zara",
"location": "app/main.js:64",
"suggestion": "在讀取排除問題檔案時,建議考慮使用非同步方法(如 fs.promises.readFile)來避免阻塞事件循環,提升效能。",
"is_new": false
},
{
"level": "info",
"role": "Aria",
"location": "README.md:8",
"suggestion": "建議將「如果PR問題表格中有嚴重問題,則不要讓 workflow 執行成功(exit 1)」的描述改為「如果 PR 問題表格中有嚴重問題,則不要讓 workflow 執行成功(exit 1)」以提高可讀性。",
"is_new": false
},
{
"level": "info",
"role": "Aria",
"location": "TODO.md:4",
"suggestion": "建議將「階段四:findings 寫入與 comment 發布」的標題改為「階段四:排除問題過濾」,以更清楚地反映內容。",
"is_new": false
},
{
"level": "info",
"role": "Aria",
"location": "app/config.js",
"suggestion": "建議在 EXCLUSIONS_PATH 的定義上方添加註解,說明該常數的用途,以提高可讀性。",
"is_new": false
},
{
"level": "info",
"role": "Aria",
"location": "app/findings.js",
"suggestion": "建議在 loadExclusions 函數的開頭添加註解,說明該函數的用途,以提高可讀性。",
"is_new": false
},
{
"level": "info",
"role": "Aria",
"location": "app/findings.js",
"suggestion": "建議在 applyExclusions 函數的開頭添加註解,說明該函數的用途,以提高可讀性。",
"is_new": false
},
{
"level": "info",
"role": "Maya",
"location": "app/findings.js:7",
"suggestion": "建議為 loadExclusions 和 applyExclusions 函數撰寫單元測試,以確保其功能正確並能處理邊界條件。",
"is_new": false
},
{
"level": "info",
"role": "Maya",
"location": "app/main.js:48",
"suggestion": "建議在每個主要步驟之後增加測試用例,以驗證每個步驟的輸出是否符合預期。",
"is_new": false
}
]
[]
+57 -1
View File
@@ -3,7 +3,7 @@ import assert from 'node:assert/strict';
import fs from 'fs';
import os from 'os';
import path from 'path';
import { commitAndPush } from './git.js';
import { commitAndPush, cloneRepo } from './git.js';
// --- helpers ---
function makeTmpWorkspace() {
@@ -91,3 +91,59 @@ describe('commitAndPush', () => {
await assert.doesNotReject(() => commitAndPush(workspace, failSpawn));
});
});
describe('cloneRepo', () => {
let workspace;
before(() => { workspace = fs.mkdtempSync(path.join(os.tmpdir(), 'clone-test-')); });
after(() => { fs.rmSync(workspace, { recursive: true, force: true }); });
it('clones repo when repoDir does not exist', () => {
const spawn = makeSpawn();
cloneRepo(workspace, spawn);
const cloneCalled = spawn.calls.some(c => c.args[0] === 'clone');
assert.ok(cloneCalled, 'expected git clone to be called');
});
it('fetches and checks out when repoDir already exists', () => {
const repoDir = path.join(workspace, 'repo');
fs.mkdirSync(repoDir, { recursive: true });
const spawn = makeSpawn();
cloneRepo(workspace, spawn);
const cloneCalled = spawn.calls.some(c => c.args[0] === 'clone');
const fetchCalled = spawn.calls.some(c => c.args[0] === 'fetch');
assert.ok(!cloneCalled, 'clone should not run when repoDir exists');
assert.ok(fetchCalled, 'fetch should run when repoDir exists');
});
it('does not embed token in any git command argument', () => {
const spawn = makeSpawn();
cloneRepo(workspace, spawn);
for (const { args } of spawn.calls) {
assert.ok(!args.join(' ').includes('test-token'), `Token leaked in git args: ${args.join(' ')}`);
}
});
it('uses GIT_ASKPASS for network operations', () => {
const spawn = makeSpawn();
cloneRepo(workspace, spawn);
const networkCalls = spawn.calls.filter(c => ['clone', 'fetch'].includes(c.args[0]));
assert.ok(networkCalls.length > 0, 'expected at least one network git call');
for (const { args, opts } of networkCalls) {
assert.ok(opts?.env?.GIT_ASKPASS, `GIT_ASKPASS missing for git ${args[0]}`);
}
});
it('cleans up askpass script after run', () => {
const spawn = makeSpawn();
cloneRepo(workspace, spawn);
const leftover = fs.readdirSync(workspace).filter(f => f.endsWith('.git-askpass.sh'));
assert.equal(leftover.length, 0, 'askpass script was not cleaned up');
});
it('returns repoDir path', () => {
const spawn = makeSpawn();
const result = cloneRepo(workspace, spawn);
assert.equal(result, path.join(workspace, 'repo'));
});
});