@wuyanbin/ai-code-review 1.0.12 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/adapters/base.d.ts +14 -0
  2. package/dist/adapters/base.d.ts.map +1 -0
  3. package/dist/adapters/base.js +3 -0
  4. package/dist/adapters/base.js.map +1 -0
  5. package/dist/adapters/factory.d.ts +13 -0
  6. package/dist/adapters/factory.d.ts.map +1 -0
  7. package/dist/adapters/factory.js +21 -0
  8. package/dist/adapters/factory.js.map +1 -0
  9. package/dist/adapters/gemini.d.ts +11 -0
  10. package/dist/adapters/gemini.d.ts.map +1 -0
  11. package/dist/adapters/gemini.js +61 -0
  12. package/dist/adapters/gemini.js.map +1 -0
  13. package/dist/adapters/openai.d.ts +7 -0
  14. package/dist/adapters/openai.d.ts.map +1 -0
  15. package/dist/adapters/openai.js +68 -0
  16. package/dist/adapters/openai.js.map +1 -0
  17. package/dist/reviewer/adapters/base.d.ts +14 -0
  18. package/dist/reviewer/adapters/base.d.ts.map +1 -0
  19. package/dist/reviewer/adapters/base.js +3 -0
  20. package/dist/reviewer/adapters/base.js.map +1 -0
  21. package/dist/reviewer/adapters/factory.d.ts +13 -0
  22. package/dist/reviewer/adapters/factory.d.ts.map +1 -0
  23. package/dist/reviewer/adapters/factory.js +21 -0
  24. package/dist/reviewer/adapters/factory.js.map +1 -0
  25. package/dist/reviewer/adapters/gemini.d.ts +11 -0
  26. package/dist/reviewer/adapters/gemini.d.ts.map +1 -0
  27. package/dist/reviewer/adapters/gemini.js +61 -0
  28. package/dist/reviewer/adapters/gemini.js.map +1 -0
  29. package/dist/reviewer/adapters/openai.d.ts +12 -0
  30. package/dist/reviewer/adapters/openai.d.ts.map +1 -0
  31. package/dist/reviewer/adapters/openai.js +54 -0
  32. package/dist/reviewer/adapters/openai.js.map +1 -0
  33. package/dist/reviewer/index.d.ts +9 -0
  34. package/dist/reviewer/index.d.ts.map +1 -0
  35. package/dist/reviewer/index.js +122 -0
  36. package/dist/reviewer/index.js.map +1 -0
  37. package/dist/reviewer/modelAdapters/base.d.ts +14 -0
  38. package/dist/reviewer/modelAdapters/base.d.ts.map +1 -0
  39. package/dist/reviewer/modelAdapters/base.js +3 -0
  40. package/dist/reviewer/modelAdapters/base.js.map +1 -0
  41. package/dist/reviewer/modelAdapters/factory.d.ts +13 -0
  42. package/dist/reviewer/modelAdapters/factory.d.ts.map +1 -0
  43. package/dist/reviewer/modelAdapters/factory.js +21 -0
  44. package/dist/reviewer/modelAdapters/factory.js.map +1 -0
  45. package/dist/reviewer/modelAdapters/gemini.d.ts +11 -0
  46. package/dist/reviewer/modelAdapters/gemini.d.ts.map +1 -0
  47. package/dist/reviewer/modelAdapters/gemini.js +61 -0
  48. package/dist/reviewer/modelAdapters/gemini.js.map +1 -0
  49. package/dist/reviewer/modelAdapters/openai.d.ts +12 -0
  50. package/dist/reviewer/modelAdapters/openai.d.ts.map +1 -0
  51. package/dist/reviewer/modelAdapters/openai.js +54 -0
  52. package/dist/reviewer/modelAdapters/openai.js.map +1 -0
  53. package/dist/reviewer/utils.d.ts +18 -0
  54. package/dist/reviewer/utils.d.ts.map +1 -0
  55. package/dist/reviewer/utils.js +103 -0
  56. package/dist/reviewer/utils.js.map +1 -0
  57. package/dist/reviewer.d.ts.map +1 -1
  58. package/dist/reviewer.js +4 -96
  59. package/dist/reviewer.js.map +1 -1
  60. package/dist/utils.d.ts +0 -17
  61. package/dist/utils.d.ts.map +1 -1
  62. package/dist/utils.js +1 -100
  63. package/dist/utils.js.map +1 -1
  64. package/package.json +1 -1
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/reviewer/modelAdapters/base.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 模型适配器工厂
3
+ * 根据 endpoint 自动选择合适的适配器
4
+ */
5
+ import { ModelAdapter } from "./base";
6
+ /**
7
+ * 创建模型适配器
8
+ * @param endpoint API 端点
9
+ * @param apiKey API 密钥
10
+ * @returns 对应的模型适配器实例
11
+ */
12
+ export declare function createModelAdapterFactory(endpoint: string, apiKey: string): ModelAdapter;
13
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/reviewer/modelAdapters/factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,YAAY,CAWd"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createModelAdapterFactory = createModelAdapterFactory;
4
+ const openai_1 = require("./openai");
5
+ const gemini_1 = require("./gemini");
6
+ /**
7
+ * 创建模型适配器
8
+ * @param endpoint API 端点
9
+ * @param apiKey API 密钥
10
+ * @returns 对应的模型适配器实例
11
+ */
12
+ function createModelAdapterFactory(endpoint, apiKey) {
13
+ // 判断是否为 Gemini
14
+ if (endpoint.includes("generativelanguage.googleapis.com") ||
15
+ endpoint.includes(":generateContent")) {
16
+ return new gemini_1.GeminiAdapter(endpoint, apiKey);
17
+ }
18
+ // 默认使用 OpenAI 适配器(支持 DeepSeek/Qwen/OpenAI 等兼容模型)
19
+ return new openai_1.OpenAIAdapter(endpoint, apiKey);
20
+ }
21
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/reviewer/modelAdapters/factory.ts"],"names":[],"mappings":";;AAcA,8DAcC;AAvBD,qCAAyC;AACzC,qCAAyC;AAEzC;;;;;GAKG;AACH,SAAgB,yBAAyB,CACvC,QAAgB,EAChB,MAAc;IAEd,eAAe;IACf,IACE,QAAQ,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QACtD,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EACrC,CAAC;QACD,OAAO,IAAI,sBAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,iDAAiD;IACjD,OAAO,IAAI,sBAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Google Gemini 模型适配器
3
+ */
4
+ import { ModelAdapter } from "./base";
5
+ export declare class GeminiAdapter implements ModelAdapter {
6
+ private endpoint;
7
+ private apiKey;
8
+ constructor(endpoint: string, apiKey: string);
9
+ call(model: string, systemPrompt: string, userPrompt: string): Promise<string | null>;
10
+ }
11
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/reviewer/modelAdapters/gemini.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAatC,qBAAa,aAAc,YAAW,YAAY;IAChD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;gBAEX,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAKtC,IAAI,CACR,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CA0D1B"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GeminiAdapter = void 0;
4
+ class GeminiAdapter {
5
+ constructor(endpoint, apiKey) {
6
+ this.endpoint = endpoint;
7
+ this.apiKey = apiKey;
8
+ }
9
+ async call(model, systemPrompt, userPrompt) {
10
+ try {
11
+ let url = this.endpoint;
12
+ // Gemini: API Key 在 Query 参数中
13
+ // 如果 endpoint 本身不含 ?key=... 则追加
14
+ if (!url.includes("key=")) {
15
+ const separator = url.includes("?") ? "&" : "?";
16
+ url = `${url}${separator}key=${this.apiKey}`;
17
+ }
18
+ // Gemini 的 Payload 结构
19
+ const payload = {
20
+ contents: [
21
+ {
22
+ parts: [
23
+ {
24
+ text: `${systemPrompt}\n\n${userPrompt}`, // Gemini 没有显式的 system role,通常合并到 prompt
25
+ },
26
+ ],
27
+ },
28
+ ],
29
+ generationConfig: {
30
+ response_mime_type: "application/json", // Gemini 1.5 Pro/Flash 支持指定 JSON 输出
31
+ },
32
+ };
33
+ const response = await fetch(url, {
34
+ method: "POST",
35
+ headers: {
36
+ "Content-Type": "application/json",
37
+ },
38
+ body: JSON.stringify(payload),
39
+ });
40
+ if (!response.ok) {
41
+ console.error(`[GeminiAdapter] AI API 调用失败,status=${response.status}`);
42
+ const errorText = await response.text();
43
+ console.error(`[GeminiAdapter] 错误详情: ${errorText}`);
44
+ return null;
45
+ }
46
+ const resJson = (await response.json());
47
+ const rawContent = resJson.candidates?.[0]?.content?.parts?.[0]?.text;
48
+ if (!rawContent) {
49
+ console.error("[GeminiAdapter] AI 返回内容为空");
50
+ return null;
51
+ }
52
+ return String(rawContent).trim();
53
+ }
54
+ catch (error) {
55
+ console.error("[GeminiAdapter] AI API 调用异常:", error);
56
+ return null;
57
+ }
58
+ }
59
+ }
60
+ exports.GeminiAdapter = GeminiAdapter;
61
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/reviewer/modelAdapters/gemini.ts"],"names":[],"mappings":";;;AAgBA,MAAa,aAAa;IAIxB,YAAY,QAAgB,EAAE,MAAc;QAC1C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,IAAI,CACR,KAAa,EACb,YAAoB,EACpB,UAAkB;QAElB,IAAI,CAAC;YACH,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;YAExB,8BAA8B;YAC9B,gCAAgC;YAChC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBAChD,GAAG,GAAG,GAAG,GAAG,GAAG,SAAS,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;YAC/C,CAAC;YAED,sBAAsB;YACtB,MAAM,OAAO,GAAG;gBACd,QAAQ,EAAE;oBACR;wBACE,KAAK,EAAE;4BACL;gCACE,IAAI,EAAE,GAAG,YAAY,OAAO,UAAU,EAAE,EAAE,wCAAwC;6BACnF;yBACF;qBACF;iBACF;gBACD,gBAAgB,EAAE;oBAChB,kBAAkB,EAAE,kBAAkB,EAAE,oCAAoC;iBAC7E;aACF,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;aAC9B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,CAAC,KAAK,CACX,sCAAsC,QAAQ,CAAC,MAAM,EAAE,CACxD,CAAC;gBACF,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,OAAO,CAAC,KAAK,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;gBACpD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAC;YAC1D,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YAEtE,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;gBAC3C,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAvED,sCAuEC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * OpenAI 兼容模型适配器
3
+ * 支持 OpenAI、DeepSeek、Qwen 等使用 OpenAI 兼容接口的模型
4
+ */
5
+ import { ModelAdapter } from "./base";
6
+ export declare class OpenAIAdapter implements ModelAdapter {
7
+ private endpoint;
8
+ private apiKey;
9
+ constructor(endpoint: string, apiKey: string);
10
+ call(model: string, systemPrompt: string, userPrompt: string): Promise<string | null>;
11
+ }
12
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/reviewer/modelAdapters/openai.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAWtC,qBAAa,aAAc,YAAW,YAAY;IAChD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;gBAEX,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAKtC,IAAI,CACR,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAmD1B"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpenAIAdapter = void 0;
4
+ class OpenAIAdapter {
5
+ constructor(endpoint, apiKey) {
6
+ this.endpoint = endpoint;
7
+ this.apiKey = apiKey;
8
+ }
9
+ async call(model, systemPrompt, userPrompt) {
10
+ try {
11
+ let url = this.endpoint;
12
+ // 如果 endpoint 不以 /chat/completions 结尾,自动补全
13
+ if (!url.endsWith("/chat/completions")) {
14
+ url = url.replace(/\/+$/, ""); // 移除末尾斜杠
15
+ url += "/chat/completions";
16
+ }
17
+ const payload = {
18
+ model,
19
+ messages: [
20
+ { role: "system", content: systemPrompt },
21
+ { role: "user", content: userPrompt },
22
+ ],
23
+ stream: false,
24
+ };
25
+ const response = await fetch(url, {
26
+ method: "POST",
27
+ headers: {
28
+ "Content-Type": "application/json",
29
+ Authorization: `Bearer ${this.apiKey}`,
30
+ },
31
+ body: JSON.stringify(payload),
32
+ });
33
+ if (!response.ok) {
34
+ console.error(`[OpenAIAdapter] AI API 调用失败,status=${response.status}`);
35
+ const errorText = await response.text();
36
+ console.error(`[OpenAIAdapter] 错误详情: ${errorText}`);
37
+ return null;
38
+ }
39
+ const resJson = (await response.json());
40
+ const rawContent = resJson.choices?.[0]?.message?.content;
41
+ if (!rawContent) {
42
+ console.error("[OpenAIAdapter] AI 返回内容为空");
43
+ return null;
44
+ }
45
+ return String(rawContent).trim();
46
+ }
47
+ catch (error) {
48
+ console.error("[OpenAIAdapter] AI API 调用异常:", error);
49
+ return null;
50
+ }
51
+ }
52
+ }
53
+ exports.OpenAIAdapter = OpenAIAdapter;
54
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/reviewer/modelAdapters/openai.ts"],"names":[],"mappings":";;;AAeA,MAAa,aAAa;IAIxB,YAAY,QAAgB,EAAE,MAAc;QAC1C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,IAAI,CACR,KAAa,EACb,YAAoB,EACpB,UAAkB;QAElB,IAAI,CAAC;YACH,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;YAExB,2CAA2C;YAC3C,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBACvC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS;gBACxC,GAAG,IAAI,mBAAmB,CAAC;YAC7B,CAAC;YAED,MAAM,OAAO,GAAG;gBACd,KAAK;gBACL,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;oBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE;iBACtC;gBACD,MAAM,EAAE,KAAK;aACd,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;iBACvC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;aAC9B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,CAAC,KAAK,CACX,sCAAsC,QAAQ,CAAC,MAAM,EAAE,CACxD,CAAC;gBACF,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,OAAO,CAAC,KAAK,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;gBACpD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAC;YAC1D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC;YAE1D,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;gBAC3C,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAhED,sCAgEC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 简单的 glob -> RegExp 转换,只覆盖当前项目常用模式:
3
+ *
4
+ * 支持的模式示例(覆盖当前默认 ignore 规则的需求):
5
+ * - 任意目录下的某类文件,例如 `src/foo.test.ts`
6
+ * - 某个目录及其子目录下的任意文件,例如 `dist/a/b.js`
7
+ * - 当前目录下的某类文件名,例如 `.aicodereviews.config.js`
8
+ */
9
+ export declare const globToRegExp: (pattern: string) => RegExp;
10
+ export declare const matchGlob: (filePath: string, pattern: string) => boolean;
11
+ export declare const shouldIgnoreFile: (filePath: string, ignorePatterns: string[] | undefined) => boolean;
12
+ /**
13
+ * 根据 ignore 规则过滤 diff 中的文件:
14
+ * - 通过 `diff --git a/xxx b/xxx` 识别每个文件的 diff 块
15
+ * - 命中 ignore 的文件整块跳过
16
+ */
17
+ export declare const filterDiffByIgnore: (diff: string, ignorePatterns: string[] | undefined) => string;
18
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/reviewer/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,KAAG,MAwB9C,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,UAAU,MAAM,EAAE,SAAS,MAAM,KAAG,OAG7D,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,UAAU,MAAM,EAChB,gBAAgB,MAAM,EAAE,GAAG,SAAS,KACnC,OAGF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,MAAM,MAAM,EACZ,gBAAgB,MAAM,EAAE,GAAG,SAAS,KACnC,MAiEF,CAAC"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.filterDiffByIgnore = exports.shouldIgnoreFile = exports.matchGlob = exports.globToRegExp = void 0;
4
+ /**
5
+ * 简单的 glob -> RegExp 转换,只覆盖当前项目常用模式:
6
+ *
7
+ * 支持的模式示例(覆盖当前默认 ignore 规则的需求):
8
+ * - 任意目录下的某类文件,例如 `src/foo.test.ts`
9
+ * - 某个目录及其子目录下的任意文件,例如 `dist/a/b.js`
10
+ * - 当前目录下的某类文件名,例如 `.aicodereviews.config.js`
11
+ */
12
+ const globToRegExp = (pattern) => {
13
+ // 1) 目录前缀匹配:例如 dist/**、node_modules/**
14
+ if (pattern.endsWith("/**")) {
15
+ const prefix = pattern.slice(0, -3); // 去掉末尾的 "/**"
16
+ const escapedPrefix = prefix.replace(/[.+?^${}()|[\]\\]/g, "\\$&");
17
+ // 以该目录开头的任意子路径
18
+ return new RegExp(`^${escapedPrefix}/.*$`);
19
+ }
20
+ // 2) 任意目录下的某类文件:例如 **/*.test.ts
21
+ if (pattern.startsWith("**/")) {
22
+ const rest = pattern.slice(3); // 去掉前缀 "**/"
23
+ const escapedRest = rest
24
+ .replace(/[.+?^${}()|[\]\\]/g, "\\$&")
25
+ .replace(/\*/g, "[^/]*");
26
+ // 前面可以有任意目录(或没有目录),后面是文件名规则
27
+ return new RegExp(`^(?:.*/)?${escapedRest}$`);
28
+ }
29
+ // 3) 普通的 *.ext 之类的模式(不跨目录)
30
+ const escaped = pattern
31
+ .replace(/[.+?^${}()|[\]\\]/g, "\\$&")
32
+ .replace(/\*/g, "[^/]*");
33
+ return new RegExp(`^${escaped}$`);
34
+ };
35
+ exports.globToRegExp = globToRegExp;
36
+ const matchGlob = (filePath, pattern) => {
37
+ const re = (0, exports.globToRegExp)(pattern);
38
+ return re.test(filePath);
39
+ };
40
+ exports.matchGlob = matchGlob;
41
+ const shouldIgnoreFile = (filePath, ignorePatterns) => {
42
+ if (!ignorePatterns || ignorePatterns.length === 0)
43
+ return false;
44
+ return ignorePatterns.some((p) => (0, exports.matchGlob)(filePath, p));
45
+ };
46
+ exports.shouldIgnoreFile = shouldIgnoreFile;
47
+ /**
48
+ * 根据 ignore 规则过滤 diff 中的文件:
49
+ * - 通过 `diff --git a/xxx b/xxx` 识别每个文件的 diff 块
50
+ * - 命中 ignore 的文件整块跳过
51
+ */
52
+ const filterDiffByIgnore = (diff, ignorePatterns) => {
53
+ if (!ignorePatterns || ignorePatterns.length === 0 || !diff.trim()) {
54
+ return diff;
55
+ }
56
+ const lines = diff.split("\n");
57
+ const kept = [];
58
+ // 记录哪些文件会被 CR,哪些文件会被忽略
59
+ const reviewedFiles = new Set();
60
+ const ignoredFiles = new Set();
61
+ let currentFile = null;
62
+ let ignoreCurrent = false;
63
+ for (const line of lines) {
64
+ if (line.startsWith("diff --git ")) {
65
+ // 新文件块开始,先重置状态
66
+ currentFile = null;
67
+ ignoreCurrent = false;
68
+ const match = /^diff --git a\/(.+?) b\/(.+)$/.exec(line);
69
+ if (match) {
70
+ // 通常 a/ 和 b/ 路径相同,使用 b/ 路径
71
+ currentFile = match[2];
72
+ ignoreCurrent = (0, exports.shouldIgnoreFile)(currentFile, ignorePatterns);
73
+ if (currentFile) {
74
+ if (ignoreCurrent) {
75
+ ignoredFiles.add(currentFile);
76
+ }
77
+ else {
78
+ reviewedFiles.add(currentFile);
79
+ }
80
+ }
81
+ }
82
+ if (!ignoreCurrent) {
83
+ kept.push(line);
84
+ }
85
+ continue;
86
+ }
87
+ if (ignoreCurrent) {
88
+ // 当前文件被 ignore,整块 diff 跳过直到下一个 diff --git
89
+ continue;
90
+ }
91
+ kept.push(line);
92
+ }
93
+ // 输出日志到 stderr,不影响 stdout 的 JSON 结果
94
+ if (reviewedFiles.size > 0) {
95
+ console.error("[reviewer] 本次参与 CR 的文件:", Array.from(reviewedFiles).join(", "));
96
+ }
97
+ if (ignoredFiles.size > 0) {
98
+ console.error("[reviewer] 本次被 ignore 的文件:", Array.from(ignoredFiles).join(", "));
99
+ }
100
+ return kept.join("\n");
101
+ };
102
+ exports.filterDiffByIgnore = filterDiffByIgnore;
103
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/reviewer/utils.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../src/reviewer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAmNvD;;GAEG;AACH,eAAO,MAAM,UAAU,GACrB,MAAM,MAAM,EACZ,QAAQ,gBAAgB,KACvB,OAAO,CAAC,UAAU,GAAG,IAAI,CA+D3B,CAAC"}
1
+ {"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../src/reviewer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AA2EvD;;GAEG;AACH,eAAO,MAAM,UAAU,GACrB,MAAM,MAAM,EACZ,QAAQ,gBAAgB,KACvB,OAAO,CAAC,UAAU,GAAG,IAAI,CA8D3B,CAAC"}
package/dist/reviewer.js CHANGED
@@ -5,6 +5,7 @@
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.reviewCode = void 0;
7
7
  const utils_1 = require("./utils");
8
+ const factory_1 = require("./adapters/factory");
8
9
  /**
9
10
  * 通用代码质量规则(始终启用)
10
11
  */
@@ -52,100 +53,6 @@ const buildUserPrompt = (diff, rules) => {
52
53
  diff,
53
54
  ].join("\n");
54
55
  };
55
- /**
56
- * 调用 DeepSeek/OpenAI/Gemini API
57
- */
58
- const callChatAPI = async (endpoint, apiKey, model, systemPrompt, userPrompt) => {
59
- try {
60
- console.error("[reviewer] callChatAPI", endpoint, apiKey, model, systemPrompt, userPrompt);
61
- let url = endpoint;
62
- const isGemini = endpoint.includes("generativelanguage.googleapis.com") ||
63
- endpoint.includes("gemini"); // 简单判断是否为 Gemini
64
- let fetchOptions = {
65
- method: "POST",
66
- headers: {
67
- "Content-Type": "application/json",
68
- },
69
- };
70
- if (isGemini) {
71
- // Gemini: API Key 在 Query 参数中
72
- // 如果 endpoint 本身不含 ?key=... 则追加
73
- if (!url.includes("key=")) {
74
- const separator = url.includes("?") ? "&" : "?";
75
- url = `${url}${separator}key=${apiKey}`;
76
- }
77
- // Gemini 的 Payload 结构
78
- const payload = {
79
- contents: [
80
- {
81
- parts: [
82
- {
83
- text: `${systemPrompt}\n\n${userPrompt}`, // Gemini 没有显式的 system role,通常合并到 prompt
84
- },
85
- ],
86
- },
87
- ],
88
- generationConfig: {
89
- response_mime_type: "application/json", // Gemini 1.5 Pro/Flash 支持指定 JSON 输出
90
- },
91
- };
92
- fetchOptions.body = JSON.stringify(payload);
93
- }
94
- else {
95
- // OpenAI / DeepSeek / Qwen 兼容模式
96
- // 如果 endpoint 看起来像 base URL 且不包含具体的 chat/completions 路径,尝试自动补全
97
- if (!url.endsWith("/chat/completions") &&
98
- !url.endsWith("/generateContent") // 防止 Gemini 或其他特殊 API 误判
99
- ) {
100
- url = url.replace(/\/+$/, "");
101
- url += "/chat/completions";
102
- }
103
- const payload = {
104
- model,
105
- messages: [
106
- { role: "system", content: systemPrompt },
107
- { role: "user", content: userPrompt },
108
- ],
109
- stream: false,
110
- };
111
- fetchOptions.headers = {
112
- ...fetchOptions.headers,
113
- Authorization: `Bearer ${apiKey}`,
114
- };
115
- fetchOptions.body = JSON.stringify(payload);
116
- }
117
- const response = await fetch(url, fetchOptions);
118
- if (!response.ok) {
119
- console.error(`[reviewer] AI API 调用失败,status=${response.status}`);
120
- const errorText = await response.text();
121
- console.error(`[reviewer] 错误详情: ${errorText}`);
122
- return null;
123
- }
124
- // 解析响应
125
- if (isGemini) {
126
- const resJson = (await response.json());
127
- const rawContent = resJson.candidates?.[0]?.content?.parts?.[0]?.text;
128
- if (!rawContent) {
129
- console.error("[reviewer] Gemini AI 返回内容为空");
130
- return null;
131
- }
132
- return String(rawContent).trim();
133
- }
134
- else {
135
- const resJson = (await response.json());
136
- const rawContent = resJson.choices?.[0]?.message?.content;
137
- if (!rawContent) {
138
- console.error("[reviewer] AI 返回内容为空");
139
- return null;
140
- }
141
- return String(rawContent).trim();
142
- }
143
- }
144
- catch (error) {
145
- console.error("[reviewer] AI API 调用异常:", error);
146
- return null;
147
- }
148
- };
149
56
  /**
150
57
  * 解析 AI 返回的 JSON(兼容代码块包裹)
151
58
  */
@@ -184,8 +91,9 @@ const reviewCode = async (diff, config) => {
184
91
  // 构建 prompt
185
92
  const systemPrompt = buildSystemPrompt();
186
93
  const userPrompt = buildUserPrompt(effectiveDiff, rules);
187
- // 调用 AI API
188
- const rawContent = await callChatAPI(config.ai.endpoint, config.ai.apiKey, config.ai.model, systemPrompt, userPrompt);
94
+ // 创建适配器并调用 AI API
95
+ const adapter = (0, factory_1.createAdapter)(config.ai.endpoint, config.ai.apiKey);
96
+ const rawContent = await adapter.call(config.ai.model, systemPrompt, userPrompt);
189
97
  if (!rawContent) {
190
98
  return null;
191
99
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reviewer.js","sourceRoot":"","sources":["../src/reviewer.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAGH,mCAA6C;AAE7C;;GAEG;AACH,MAAM,WAAW,GAAG;IAClB,0CAA0C;IAC1C,aAAa;IACb,iBAAiB;IACjB,kBAAkB;IAClB,aAAa;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,iBAAiB,GAAG,GAAW,EAAE;IACrC,OAAO,+DAA+D,CAAC;AACzE,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,KAAe,EAAU,EAAE;IAChE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEpC,OAAO;QACL,gCAAgC;QAChC,yBAAyB;QACzB,GAAG;QACH,iBAAiB;QACjB,OAAO;QACP,8BAA8B;QAC9B,oBAAoB;QACpB,iDAAiD;QACjD,mCAAmC;QACnC,wCAAwC;QACxC,OAAO;QACP,KAAK;QACL,GAAG;QACH,KAAK;QACL,kCAAkC;QAClC,oCAAoC;QACpC,uCAAuC;QACvC,EAAE;QACF,WAAW;QACX,UAAU;QACV,EAAE;QACF,eAAe;QACf,IAAI;KACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC,CAAC;AAgBF;;GAEG;AACH,MAAM,WAAW,GAAG,KAAK,EACvB,QAAgB,EAChB,MAAc,EACd,KAAa,EACb,YAAoB,EACpB,UAAkB,EACM,EAAE;IAC1B,IAAI,CAAC;QACH,OAAO,CAAC,KAAK,CACX,wBAAwB,EACxB,QAAQ,EACR,MAAM,EACN,KAAK,EACL,YAAY,EACZ,UAAU,CACX,CAAC;QAEF,IAAI,GAAG,GAAG,QAAQ,CAAC;QACnB,MAAM,QAAQ,GACZ,QAAQ,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YACtD,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB;QAEhD,IAAI,YAAY,GAAgB;YAC9B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC;QAEF,IAAI,QAAQ,EAAE,CAAC;YACb,8BAA8B;YAC9B,gCAAgC;YAChC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBAChD,GAAG,GAAG,GAAG,GAAG,GAAG,SAAS,OAAO,MAAM,EAAE,CAAC;YAC1C,CAAC;YAED,sBAAsB;YACtB,MAAM,OAAO,GAAG;gBACd,QAAQ,EAAE;oBACR;wBACE,KAAK,EAAE;4BACL;gCACE,IAAI,EAAE,GAAG,YAAY,OAAO,UAAU,EAAE,EAAE,wCAAwC;6BACnF;yBACF;qBACF;iBACF;gBACD,gBAAgB,EAAE;oBAChB,kBAAkB,EAAE,kBAAkB,EAAE,oCAAoC;iBAC7E;aACF,CAAC;YACF,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,gCAAgC;YAChC,+DAA+D;YAC/D,IACE,CAAC,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBAClC,CAAC,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,yBAAyB;cAC3D,CAAC;gBACD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC9B,GAAG,IAAI,mBAAmB,CAAC;YAC7B,CAAC;YAED,MAAM,OAAO,GAAG;gBACd,KAAK;gBACL,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;oBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE;iBACtC;gBACD,MAAM,EAAE,KAAK;aACd,CAAC;YAEF,YAAY,CAAC,OAAO,GAAG;gBACrB,GAAG,YAAY,CAAC,OAAO;gBACvB,aAAa,EAAE,UAAU,MAAM,EAAE;aAClC,CAAC;YACF,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAEhD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,iCAAiC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAClE,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,OAAO,CAAC,KAAK,CAAC,oBAAoB,SAAS,EAAE,CAAC,CAAC;YAC/C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;QACP,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAC;YAC1D,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YACtE,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBAC7C,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAMrC,CAAC;YACF,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC;YAE1D,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBACtC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,eAAe,GAAG,CAAC,OAAe,EAAqB,EAAE;IAC7D,4BAA4B;IAC5B,MAAM,WAAW,GAAG,OAAO;SACxB,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;SAChC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,IAAI,EAAE,CAAC;IAEV,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,UAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC9C,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACI,MAAM,UAAU,GAAG,KAAK,EAC7B,IAAY,EACZ,MAAwB,EACI,EAAE;IAC9B,gCAAgC;IAChC,MAAM,aAAa,GAAG,IAAA,0BAAkB,EAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEtE,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5C,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACzC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uCAAuC;IACvC,MAAM,KAAK,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;IAEhE,YAAY;IACZ,MAAM,YAAY,GAAG,iBAAiB,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,eAAe,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAEzD,YAAY;IACZ,MAAM,UAAU,GAAG,MAAM,WAAW,CAClC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAClB,MAAM,CAAC,EAAE,CAAC,MAAM,EAChB,MAAM,CAAC,EAAE,CAAC,KAAK,EACf,YAAY,EACZ,UAAU,CACX,CAAC;IAEF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;IACP,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAE3C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,UAAU;IACV,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IAErC,cAAc;IACd,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC5B,MAAM,aAAa,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvD,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC;IAC3E,CAAC;IAED,SAAS;IACT,IACE,MAAM,CAAC,MAAM,EAAE,WAAW;QAC1B,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAC3C,CAAC;QACD,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CACV,4BAA4B,MAAM,CAAC,MAAM,CAAC,WAAW,IAAI,CAC1D,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,CAAC;AACtB,CAAC,CAAC;AAlEW,QAAA,UAAU,cAkErB"}
1
+ {"version":3,"file":"reviewer.js","sourceRoot":"","sources":["../src/reviewer.ts"],"names":[],"mappings":"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"}
package/dist/utils.d.ts CHANGED
@@ -1,20 +1,3 @@
1
- /**
2
- * 简单的 glob -> RegExp 转换,只覆盖当前项目常用模式:
3
- *
4
- * 支持的模式示例(覆盖当前默认 ignore 规则的需求):
5
- * - 任意目录下的某类文件,例如 `src/foo.test.ts`
6
- * - 某个目录及其子目录下的任意文件,例如 `dist/a/b.js`
7
- * - 当前目录下的某类文件名,例如 `.aicodereviews.config.js`
8
- */
9
- export declare const globToRegExp: (pattern: string) => RegExp;
10
- export declare const matchGlob: (filePath: string, pattern: string) => boolean;
11
- export declare const shouldIgnoreFile: (filePath: string, ignorePatterns: string[] | undefined) => boolean;
12
- /**
13
- * 根据 ignore 规则过滤 diff 中的文件:
14
- * - 通过 `diff --git a/xxx b/xxx` 识别每个文件的 diff 块
15
- * - 命中 ignore 的文件整块跳过
16
- */
17
- export declare const filterDiffByIgnore: (diff: string, ignorePatterns: string[] | undefined) => string;
18
1
  /**
19
2
  * 读取 stdin
20
3
  */
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,KAAG,MAwB9C,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,UAAU,MAAM,EAAE,SAAS,MAAM,KAAG,OAG7D,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,UAAU,MAAM,EAChB,gBAAgB,MAAM,EAAE,GAAG,SAAS,KACnC,OAGF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,MAAM,MAAM,EACZ,gBAAgB,MAAM,EAAE,GAAG,SAAS,KACnC,MAiEF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,QAAO,OAAO,CAAC,MAAM,CAavC,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,SAAS,QAAO,OAAO,CAAC,MAAM,CAavC,CAAC"}
package/dist/utils.js CHANGED
@@ -1,105 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.readStdin = exports.filterDiffByIgnore = exports.shouldIgnoreFile = exports.matchGlob = exports.globToRegExp = void 0;
4
- /**
5
- * 简单的 glob -> RegExp 转换,只覆盖当前项目常用模式:
6
- *
7
- * 支持的模式示例(覆盖当前默认 ignore 规则的需求):
8
- * - 任意目录下的某类文件,例如 `src/foo.test.ts`
9
- * - 某个目录及其子目录下的任意文件,例如 `dist/a/b.js`
10
- * - 当前目录下的某类文件名,例如 `.aicodereviews.config.js`
11
- */
12
- const globToRegExp = (pattern) => {
13
- // 1) 目录前缀匹配:例如 dist/**、node_modules/**
14
- if (pattern.endsWith("/**")) {
15
- const prefix = pattern.slice(0, -3); // 去掉末尾的 "/**"
16
- const escapedPrefix = prefix.replace(/[.+?^${}()|[\]\\]/g, "\\$&");
17
- // 以该目录开头的任意子路径
18
- return new RegExp(`^${escapedPrefix}/.*$`);
19
- }
20
- // 2) 任意目录下的某类文件:例如 **/*.test.ts
21
- if (pattern.startsWith("**/")) {
22
- const rest = pattern.slice(3); // 去掉前缀 "**/"
23
- const escapedRest = rest
24
- .replace(/[.+?^${}()|[\]\\]/g, "\\$&")
25
- .replace(/\*/g, "[^/]*");
26
- // 前面可以有任意目录(或没有目录),后面是文件名规则
27
- return new RegExp(`^(?:.*/)?${escapedRest}$`);
28
- }
29
- // 3) 普通的 *.ext 之类的模式(不跨目录)
30
- const escaped = pattern
31
- .replace(/[.+?^${}()|[\]\\]/g, "\\$&")
32
- .replace(/\*/g, "[^/]*");
33
- return new RegExp(`^${escaped}$`);
34
- };
35
- exports.globToRegExp = globToRegExp;
36
- const matchGlob = (filePath, pattern) => {
37
- const re = (0, exports.globToRegExp)(pattern);
38
- return re.test(filePath);
39
- };
40
- exports.matchGlob = matchGlob;
41
- const shouldIgnoreFile = (filePath, ignorePatterns) => {
42
- if (!ignorePatterns || ignorePatterns.length === 0)
43
- return false;
44
- return ignorePatterns.some((p) => (0, exports.matchGlob)(filePath, p));
45
- };
46
- exports.shouldIgnoreFile = shouldIgnoreFile;
47
- /**
48
- * 根据 ignore 规则过滤 diff 中的文件:
49
- * - 通过 `diff --git a/xxx b/xxx` 识别每个文件的 diff 块
50
- * - 命中 ignore 的文件整块跳过
51
- */
52
- const filterDiffByIgnore = (diff, ignorePatterns) => {
53
- if (!ignorePatterns || ignorePatterns.length === 0 || !diff.trim()) {
54
- return diff;
55
- }
56
- const lines = diff.split("\n");
57
- const kept = [];
58
- // 记录哪些文件会被 CR,哪些文件会被忽略
59
- const reviewedFiles = new Set();
60
- const ignoredFiles = new Set();
61
- let currentFile = null;
62
- let ignoreCurrent = false;
63
- for (const line of lines) {
64
- if (line.startsWith("diff --git ")) {
65
- // 新文件块开始,先重置状态
66
- currentFile = null;
67
- ignoreCurrent = false;
68
- const match = /^diff --git a\/(.+?) b\/(.+)$/.exec(line);
69
- if (match) {
70
- // 通常 a/ 和 b/ 路径相同,使用 b/ 路径
71
- currentFile = match[2];
72
- ignoreCurrent = (0, exports.shouldIgnoreFile)(currentFile, ignorePatterns);
73
- if (currentFile) {
74
- if (ignoreCurrent) {
75
- ignoredFiles.add(currentFile);
76
- }
77
- else {
78
- reviewedFiles.add(currentFile);
79
- }
80
- }
81
- }
82
- if (!ignoreCurrent) {
83
- kept.push(line);
84
- }
85
- continue;
86
- }
87
- if (ignoreCurrent) {
88
- // 当前文件被 ignore,整块 diff 跳过直到下一个 diff --git
89
- continue;
90
- }
91
- kept.push(line);
92
- }
93
- // 输出日志到 stderr,不影响 stdout 的 JSON 结果
94
- if (reviewedFiles.size > 0) {
95
- console.error("[reviewer] 本次参与 CR 的文件:", Array.from(reviewedFiles).join(", "));
96
- }
97
- if (ignoredFiles.size > 0) {
98
- console.error("[reviewer] 本次被 ignore 的文件:", Array.from(ignoredFiles).join(", "));
99
- }
100
- return kept.join("\n");
101
- };
102
- exports.filterDiffByIgnore = filterDiffByIgnore;
3
+ exports.readStdin = void 0;
103
4
  /**
104
5
  * 读取 stdin
105
6
  */
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACI,MAAM,SAAS,GAAG,GAAoB,EAAE,CAC7C,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC9B,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QACjC,IAAI,IAAI,KAAK,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;QAC3B,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QAChC,MAAM,CAAC,GAAG,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAbQ,QAAA,SAAS,aAajB"}