code-gate 0.1.0 → 1.0.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 (133) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +222 -114
  3. package/README_ZH.md +224 -0
  4. package/bin/code-gate.js +12 -19
  5. package/dist/__tests__/config.test.js +1 -1
  6. package/dist/__tests__/config.test.js.map +1 -1
  7. package/dist/__tests__/render.test.js +24 -7
  8. package/dist/__tests__/render.test.js.map +1 -1
  9. package/dist/cli/commands/hook.d.ts +1 -0
  10. package/dist/cli/commands/hook.js +164 -0
  11. package/dist/cli/commands/hook.js.map +1 -0
  12. package/dist/cli/commands/init.d.ts +1 -0
  13. package/dist/cli/commands/init.js +157 -0
  14. package/dist/cli/commands/init.js.map +1 -0
  15. package/dist/cli/commands/setup.d.ts +1 -0
  16. package/dist/cli/commands/setup.js +19 -0
  17. package/dist/cli/commands/setup.js.map +1 -0
  18. package/dist/cli/index.d.ts +2 -0
  19. package/dist/cli/index.js +26 -0
  20. package/dist/cli/index.js.map +1 -0
  21. package/dist/commands/hook.js +7 -0
  22. package/dist/commands/hook.js.map +1 -1
  23. package/dist/commands/init.js +20 -20
  24. package/dist/config/defaults.d.ts +2 -0
  25. package/dist/config/defaults.js +33 -0
  26. package/dist/config/defaults.js.map +1 -0
  27. package/dist/config/index.d.ts +4 -0
  28. package/dist/config/index.js +77 -0
  29. package/dist/config/index.js.map +1 -0
  30. package/dist/config/types.d.ts +55 -0
  31. package/dist/config/types.js +2 -0
  32. package/dist/config/types.js.map +1 -0
  33. package/dist/config.d.ts +111 -21
  34. package/dist/config.js +83 -21
  35. package/dist/config.js.map +1 -1
  36. package/dist/core/git.d.ts +7 -0
  37. package/dist/core/git.js +67 -0
  38. package/dist/core/git.js.map +1 -0
  39. package/dist/core/review-flow.js +105 -59
  40. package/dist/core/review-flow.js.map +1 -1
  41. package/dist/core/review.d.ts +6 -0
  42. package/dist/core/review.js +167 -0
  43. package/dist/core/review.js.map +1 -0
  44. package/dist/index.d.ts +1 -1
  45. package/dist/index.js +1 -1
  46. package/dist/index.js.map +1 -1
  47. package/dist/llm/base.d.ts +14 -0
  48. package/dist/llm/base.js +10 -0
  49. package/dist/llm/base.js.map +1 -0
  50. package/dist/llm/deepseek.js +3 -3
  51. package/dist/llm/deepseek.js.map +1 -1
  52. package/dist/llm/index.d.ts +4 -0
  53. package/dist/llm/index.js +41 -0
  54. package/dist/llm/index.js.map +1 -0
  55. package/dist/llm/ollama.js +2 -2
  56. package/dist/llm/ollama.js.map +1 -1
  57. package/dist/llm/providers/aliyun.d.ts +4 -0
  58. package/dist/llm/providers/aliyun.js +25 -0
  59. package/dist/llm/providers/aliyun.js.map +1 -0
  60. package/dist/llm/providers/anthropic.d.ts +4 -0
  61. package/dist/llm/providers/anthropic.js +52 -0
  62. package/dist/llm/providers/anthropic.js.map +1 -0
  63. package/dist/llm/providers/azure.d.ts +4 -0
  64. package/dist/llm/providers/azure.js +38 -0
  65. package/dist/llm/providers/azure.js.map +1 -0
  66. package/dist/llm/providers/cohere.d.ts +4 -0
  67. package/dist/llm/providers/cohere.js +39 -0
  68. package/dist/llm/providers/cohere.js.map +1 -0
  69. package/dist/llm/providers/deepseek.d.ts +4 -0
  70. package/dist/llm/providers/deepseek.js +25 -0
  71. package/dist/llm/providers/deepseek.js.map +1 -0
  72. package/dist/llm/providers/gemini.d.ts +4 -0
  73. package/dist/llm/providers/gemini.js +40 -0
  74. package/dist/llm/providers/gemini.js.map +1 -0
  75. package/dist/llm/providers/mistral.d.ts +4 -0
  76. package/dist/llm/providers/mistral.js +42 -0
  77. package/dist/llm/providers/mistral.js.map +1 -0
  78. package/dist/llm/providers/ollama.d.ts +5 -0
  79. package/dist/llm/providers/ollama.js +67 -0
  80. package/dist/llm/providers/ollama.js.map +1 -0
  81. package/dist/llm/providers/openai.d.ts +4 -0
  82. package/dist/llm/providers/openai.js +27 -0
  83. package/dist/llm/providers/openai.js.map +1 -0
  84. package/dist/llm/providers/volcengine.d.ts +4 -0
  85. package/dist/llm/providers/volcengine.js +29 -0
  86. package/dist/llm/providers/volcengine.js.map +1 -0
  87. package/dist/llm/providers/zhipu.d.ts +4 -0
  88. package/dist/llm/providers/zhipu.js +25 -0
  89. package/dist/llm/providers/zhipu.js.map +1 -0
  90. package/dist/locales/de.d.ts +2 -0
  91. package/dist/locales/de.js +33 -0
  92. package/dist/locales/de.js.map +1 -0
  93. package/dist/locales/en.d.ts +2 -0
  94. package/dist/locales/en.js +33 -0
  95. package/dist/locales/en.js.map +1 -0
  96. package/dist/locales/fr.d.ts +2 -0
  97. package/dist/locales/fr.js +33 -0
  98. package/dist/locales/fr.js.map +1 -0
  99. package/dist/locales/index.d.ts +3 -0
  100. package/dist/locales/index.js +41 -0
  101. package/dist/locales/index.js.map +1 -0
  102. package/dist/locales/ja.d.ts +2 -0
  103. package/dist/locales/ja.js +33 -0
  104. package/dist/locales/ja.js.map +1 -0
  105. package/dist/locales/ko.d.ts +2 -0
  106. package/dist/locales/ko.js +33 -0
  107. package/dist/locales/ko.js.map +1 -0
  108. package/dist/locales/types.d.ts +32 -0
  109. package/dist/locales/types.js +2 -0
  110. package/dist/locales/types.js.map +1 -0
  111. package/dist/locales/zh-CN.d.ts +2 -0
  112. package/dist/locales/zh-CN.js +33 -0
  113. package/dist/locales/zh-CN.js.map +1 -0
  114. package/dist/locales/zh-TW.d.ts +2 -0
  115. package/dist/locales/zh-TW.js +33 -0
  116. package/dist/locales/zh-TW.js.map +1 -0
  117. package/dist/ui/render/assets.d.ts +8 -0
  118. package/dist/ui/render/assets.js +89 -0
  119. package/dist/ui/render/assets.js.map +1 -0
  120. package/dist/ui/render/html.d.ts +35 -0
  121. package/dist/ui/render/html.js +295 -0
  122. package/dist/ui/render/html.js.map +1 -0
  123. package/dist/ui/render.d.ts +11 -0
  124. package/dist/ui/render.js +198 -13
  125. package/dist/ui/render.js.map +1 -1
  126. package/dist/ui/server.d.ts +4 -2
  127. package/dist/ui/server.js +30 -8
  128. package/dist/ui/server.js.map +1 -1
  129. package/dist/utils/logger.d.ts +3 -0
  130. package/dist/utils/logger.js +10 -0
  131. package/dist/utils/logger.js.map +1 -0
  132. package/package.json +27 -8
  133. package/scripts/hook.sh +12 -0
@@ -2,13 +2,16 @@ import { loadConfig } from '../config.js';
2
2
  import { getStagedFiles, getStagedDiff, filterFiles, getStagedDiffForFile } from '../git.js';
3
3
  import { deepseekReview } from '../llm/deepseek.js';
4
4
  import { ollamaReview } from '../llm/ollama.js';
5
- import { renderHTML, renderHTMLTabs } from '../ui/render.js';
6
- import { serveReview } from '../ui/server.js';
5
+ import { renderHTMLLive, renderHTMLTabs } from '../ui/render.js';
6
+ import { serveReview, saveOutput, triggerOpen } from '../ui/server.js';
7
7
  import { info, warn } from '../log.js';
8
8
  export async function runReviewFlow() {
9
9
  const cfg = await loadConfig();
10
- const providerUsed = (cfg.review?.provider || cfg.provider);
11
- const modelUsed = providerUsed === 'deepseek' ? cfg.deepseek?.model : cfg.ollama?.model;
10
+ const providerUsed = cfg.provider;
11
+ const mode = (cfg.reviewMode || 'files');
12
+ const modelUsed = providerUsed === 'deepseek'
13
+ ? cfg.providerOptions?.deepseek?.model
14
+ : cfg.providerOptions?.ollama?.model;
12
15
  const files = filterFiles(getStagedFiles(), cfg.fileTypes);
13
16
  if (files.length === 0) {
14
17
  info('code-gate: 没有可审查的文件');
@@ -24,86 +27,129 @@ export async function runReviewFlow() {
24
27
  let aiInvoked = false;
25
28
  let aiSucceeded = false;
26
29
  let status = '';
27
- try {
28
- if (providerUsed === 'deepseek') {
29
- const apiKeyEnv = cfg.deepseek?.apiKeyEnv || 'DEEPSEEK_API_KEY';
30
- if (!process.env[apiKeyEnv]) {
31
- status = `缺少 DeepSeek 密钥 ${apiKeyEnv}`;
32
- content =
33
- `未生成 AI 审查结果。\n原因:缺少 DeepSeek 密钥 ${apiKeyEnv}。\n` +
30
+ async function runSummary() {
31
+ try {
32
+ if (providerUsed === 'deepseek') {
33
+ const apiKeyEnv = cfg.providerOptions?.deepseek?.apiKeyEnv || 'DEEPSEEK_API_KEY';
34
+ if (!process.env[apiKeyEnv]) {
35
+ status = `缺少 DeepSeek 密钥 ${apiKeyEnv}`;
36
+ aiInvoked = false;
37
+ aiSucceeded = false;
38
+ return (`未生成 AI 审查结果。\n原因:缺少 DeepSeek 密钥 ${apiKeyEnv}。\n` +
34
39
  `解决方案:在当前环境设置 ${apiKeyEnv},或切换 provider 为 ollama。\n` +
35
- `示例:export ${apiKeyEnv}="你的密钥"`;
36
- aiInvoked = false;
37
- aiSucceeded = false;
40
+ `示例:export ${apiKeyEnv}="你的密钥"`);
41
+ }
42
+ else {
43
+ aiInvoked = true;
44
+ const s = await deepseekReview(cfg, { prompt, diff });
45
+ aiSucceeded = !!s;
46
+ return s || '';
47
+ }
38
48
  }
39
49
  else {
40
50
  aiInvoked = true;
41
- content = await deepseekReview(cfg, { prompt, diff });
42
- aiSucceeded = !!content;
51
+ const s = await ollamaReview(cfg, { prompt, diff });
52
+ aiSucceeded = !!s;
53
+ return s || '';
43
54
  }
44
55
  }
45
- else {
56
+ catch (e) {
57
+ warn(`code-gate: LLM 调用失败:${e?.message || e}`);
58
+ status = `LLM 调用失败:${e?.message || e}`;
46
59
  aiInvoked = true;
47
- content = await ollamaReview(cfg, { prompt, diff });
48
- aiSucceeded = !!content;
49
- }
50
- }
51
- catch (e) {
52
- warn(`code-gate: LLM 调用失败:${e?.message || e}`);
53
- status = `LLM 调用失败:${e?.message || e}`;
54
- content =
55
- `未生成 AI 审查结果。\n可能原因:网络不可达、服务未启动或配置错误。\n` +
60
+ aiSucceeded = false;
61
+ return (`未生成 AI 审查结果。\n可能原因:网络不可达、服务未启动或配置错误。\n` +
56
62
  `当前 provider:${cfg.provider}\n` +
57
63
  (cfg.provider === 'ollama'
58
64
  ? `请检查本地 Ollama 是否运行(默认 http://localhost:11434),模型是否可用。\n示例:ollama list`
59
- : `请检查 ${cfg.deepseek?.apiKeyEnv || 'DEEPSEEK_API_KEY'} 是否已设置、baseURL 是否为 https://api.deepseek.com`);
60
- aiInvoked = true;
61
- aiSucceeded = false;
62
- }
63
- if (cfg.review?.mode === 'per_file') {
64
- const items = [];
65
- for (const f of files.slice(0, cfg.limits?.maxFiles || files.length)) {
66
- const fdiff = getStagedDiffForFile(f);
67
- let frev = '';
68
- try {
69
- if (providerUsed === 'deepseek') {
70
- const apiKeyEnv = cfg.deepseek?.apiKeyEnv || 'DEEPSEEK_API_KEY';
71
- if (process.env[apiKeyEnv]) {
72
- aiInvoked = true;
73
- frev = await deepseekReview(cfg, { prompt, diff: fdiff });
74
- aiSucceeded = aiSucceeded || !!frev;
75
- }
76
- }
77
- else {
78
- aiInvoked = true;
79
- frev = await ollamaReview(cfg, { prompt, diff: fdiff });
80
- aiSucceeded = aiSucceeded || !!frev;
81
- }
82
- }
83
- catch (e) {
84
- warn(`code-gate: 文件 ${f} 审查失败:${e?.message || e}`);
85
- }
86
- items.push({ file: f, review: frev, diff: fdiff || 'diff --git a/' + f + ' b/' + f });
65
+ : `请检查 ${cfg.providerOptions?.deepseek?.apiKeyEnv || 'DEEPSEEK_API_KEY'} 是否已设置、baseURL 是否为 https://api.deepseek.com`));
87
66
  }
88
- const html = renderHTMLTabs(items, {
67
+ }
68
+ const maxFiles = cfg.limits?.maxFiles || files.length;
69
+ const list = files.slice(0, maxFiles);
70
+ const rawConcurrency = providerUsed === 'deepseek'
71
+ ? cfg.providerOptions?.deepseek?.concurrencyFiles ?? 4
72
+ : cfg.providerOptions?.ollama?.concurrencyFiles ?? 1;
73
+ const concurrency = Math.max(1, Math.min(8, rawConcurrency || 1));
74
+ const items = [];
75
+ const id = Date.now().toString(36);
76
+ if (mode === 'summary') {
77
+ const s = await runSummary();
78
+ items.push({ file: 'Summary', review: s, diff, done: true });
79
+ const html = renderHTMLLive(id, { aiInvoked, aiSucceeded, provider: providerUsed, model: modelUsed, status }, [{ file: 'Summary', review: s, diff }]);
80
+ await serveReview(cfg, html, id, () => ({ files: items, done: true }));
81
+ const finalHtml = renderHTMLTabs(items, {
89
82
  aiInvoked,
90
83
  aiSucceeded,
91
84
  provider: providerUsed,
92
85
  model: modelUsed,
93
86
  status
94
87
  });
95
- await serveReview(cfg, html);
88
+ saveOutput(cfg, id, finalHtml);
89
+ return false;
96
90
  }
97
- else {
98
- const html = renderHTML(diff, content, {
91
+ const html = renderHTMLLive(id, { aiInvoked, aiSucceeded, provider: providerUsed, model: modelUsed, status }, []);
92
+ const previewUrl = await serveReview(cfg, html, id, () => {
93
+ const completed = items.filter((it) => it.done);
94
+ const expected = list.length + (mode === 'both' ? 1 : 0);
95
+ const allDone = completed.length >= expected;
96
+ return { files: completed, done: allDone };
97
+ }, false);
98
+ async function runTask(f) {
99
+ const fdiff = getStagedDiffForFile(f);
100
+ let frev = '';
101
+ try {
102
+ if (providerUsed === 'deepseek') {
103
+ const apiKeyEnv = cfg.providerOptions?.deepseek?.apiKeyEnv || 'DEEPSEEK_API_KEY';
104
+ if (process.env[apiKeyEnv]) {
105
+ aiInvoked = true;
106
+ frev = await deepseekReview(cfg, { prompt, diff: fdiff });
107
+ aiSucceeded = aiSucceeded || !!frev;
108
+ }
109
+ }
110
+ else {
111
+ aiInvoked = true;
112
+ frev = await ollamaReview(cfg, { prompt, diff: fdiff });
113
+ aiSucceeded = aiSucceeded || !!frev;
114
+ }
115
+ }
116
+ catch (e) {
117
+ warn(`code-gate: 文件 ${f} 审查失败:${e?.message || e}`);
118
+ }
119
+ items.push({ file: f, review: frev, diff: fdiff || 'diff --git a/' + f + ' b/' + f, done: true });
120
+ if (mode === 'files' && items.length === 1 && previewUrl) {
121
+ triggerOpen(previewUrl);
122
+ }
123
+ }
124
+ const queue = [...list];
125
+ const workers = [];
126
+ for (let i = 0; i < Math.max(1, concurrency); i++) {
127
+ const worker = (async () => {
128
+ while (queue.length) {
129
+ const f = queue.shift();
130
+ if (!f)
131
+ break;
132
+ await runTask(f);
133
+ }
134
+ })();
135
+ workers.push(worker);
136
+ }
137
+ await Promise.all(workers);
138
+ if (mode === 'both') {
139
+ const s = await runSummary();
140
+ items.push({ file: 'Summary', review: s, diff, done: true });
141
+ }
142
+ try {
143
+ const finalHtml = renderHTMLTabs(items, {
99
144
  aiInvoked,
100
145
  aiSucceeded,
101
146
  provider: providerUsed,
102
147
  model: modelUsed,
103
148
  status
104
149
  });
105
- await serveReview(cfg, html);
150
+ saveOutput(cfg, id, finalHtml);
106
151
  }
152
+ catch { }
107
153
  return false;
108
154
  }
109
155
  //# sourceMappingURL=review-flow.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"review-flow.js","sourceRoot":"","sources":["../../src/core/review-flow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"review-flow.js","sourceRoot":"","sources":["../../src/core/review-flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface ReviewFlowOptions {
2
+ onProgress?: (file: string, index: number, total: number) => void;
3
+ onServerReady?: (url: string) => void;
4
+ onStart?: (total: number) => void;
5
+ }
6
+ export declare function runReviewFlow(opts?: ReviewFlowOptions): Promise<boolean>;
@@ -0,0 +1,167 @@
1
+ import { loadConfig } from '../config/index.js';
2
+ import { setLanguage, t } from '../locales/index.js';
3
+ import { getStagedFiles, getStagedDiff, filterFiles, getStagedDiffForFile, getBranchName, getDiffStats, getCommitMessage } from './git.js';
4
+ import { createLLMProvider } from '../llm/index.js';
5
+ import { renderHTMLLive, renderHTMLTabs } from '../ui/render/html.js';
6
+ import { serveReview, saveOutput, triggerOpen } from '../ui/server.js';
7
+ import { warn } from '../utils/logger.js';
8
+ export async function runReviewFlow(opts = {}) {
9
+ const cfg = await loadConfig();
10
+ if (cfg.language) {
11
+ setLanguage(cfg.language);
12
+ }
13
+ const provider = createLLMProvider(cfg);
14
+ const providerName = cfg.provider;
15
+ const mode = (cfg.reviewMode || 'files');
16
+ const modelUsed = cfg.providerOptions?.[providerName]?.model || 'unknown';
17
+ const files = filterFiles(getStagedFiles(), cfg.fileTypes, cfg.exclude);
18
+ if (files.length === 0) {
19
+ // info('code-gate: 没有可审查的文件')
20
+ return true;
21
+ }
22
+ let diff = getStagedDiff();
23
+ if (!diff) {
24
+ // warn('code-gate: 未获取到 diff')
25
+ return true;
26
+ }
27
+ const prompt = cfg.prompt || '';
28
+ let aiInvoked = false;
29
+ let aiSucceeded = false;
30
+ let status = '';
31
+ // 1. Pre-check for Ollama connectivity if selected
32
+ if (providerName === 'ollama') {
33
+ try {
34
+ const baseURL = cfg.providerOptions?.ollama?.baseURL || 'http://localhost:11434';
35
+ const checkRes = await fetch(baseURL).catch(() => null);
36
+ if (!checkRes) {
37
+ warn(t('cli.ollamaCheckFailed'));
38
+ // Don't block, but user should know AI might fail
39
+ status = t('cli.ollamaCheckFailed');
40
+ }
41
+ }
42
+ catch { }
43
+ }
44
+ if (opts.onStart)
45
+ opts.onStart(files.length);
46
+ async function runSummary() {
47
+ try {
48
+ aiInvoked = true;
49
+ const s = await provider.review({ prompt, diff });
50
+ aiSucceeded = true;
51
+ return s || '';
52
+ }
53
+ catch (e) {
54
+ warn(`code-gate: LLM 调用失败:${e?.message || e}`);
55
+ status = `LLM 调用失败:${e?.message || e}`;
56
+ aiSucceeded = false;
57
+ return `未生成 AI 审查结果。\n错误信息:${e?.message || e}`;
58
+ }
59
+ }
60
+ const maxFiles = cfg.limits?.maxFiles || files.length;
61
+ const list = files.slice(0, maxFiles);
62
+ const concurrency = Math.max(1, Math.min(8, cfg.providerOptions?.[providerName]?.concurrencyFiles || 1));
63
+ const items = [];
64
+ // Generate ID with timestamp format: YYYYMMDD-HHmmss (Local Time)
65
+ const now = new Date();
66
+ const year = now.getFullYear();
67
+ const month = String(now.getMonth() + 1).padStart(2, '0');
68
+ const day = String(now.getDate()).padStart(2, '0');
69
+ const hours = String(now.getHours()).padStart(2, '0');
70
+ const minutes = String(now.getMinutes()).padStart(2, '0');
71
+ const seconds = String(now.getSeconds()).padStart(2, '0');
72
+ const id = `${year}${month}${day}-${hours}${minutes}${seconds}`;
73
+ const formattedTime = now.toLocaleString();
74
+ const branchName = getBranchName();
75
+ const commitMsg = getCommitMessage();
76
+ const diffStats = getDiffStats();
77
+ // Prefer commit message, fallback to diff stats
78
+ const info = commitMsg || diffStats;
79
+ const subtitle = `Branch: ${branchName}${info ? ` | ${info}` : ''}`;
80
+ if (mode === 'summary') {
81
+ const s = await runSummary();
82
+ items.push({ file: 'Summary', review: s, diff, done: true });
83
+ const html = renderHTMLLive(id, { aiInvoked, aiSucceeded, provider: providerName, model: modelUsed, status, datetime: formattedTime, subtitle }, [{ file: 'Summary', review: s, diff }]);
84
+ const url = await serveReview(cfg, html, id, () => ({ files: items, done: true }));
85
+ if (opts.onServerReady)
86
+ opts.onServerReady(url);
87
+ const finalHtml = renderHTMLTabs(items, {
88
+ aiInvoked,
89
+ aiSucceeded,
90
+ provider: providerName,
91
+ model: modelUsed,
92
+ status,
93
+ datetime: formattedTime,
94
+ subtitle
95
+ });
96
+ saveOutput(cfg, id, finalHtml);
97
+ return false;
98
+ }
99
+ const html = renderHTMLLive(id, { aiInvoked, aiSucceeded, provider: providerName, model: modelUsed, status, datetime: formattedTime, subtitle }, []);
100
+ const previewUrl = await serveReview(cfg, html, id, () => {
101
+ const completed = items.filter((it) => it.done);
102
+ const expected = list.length + (mode === 'both' ? 1 : 0);
103
+ const allDone = completed.length >= expected;
104
+ return { files: completed, done: allDone };
105
+ }, false);
106
+ if (opts.onServerReady && previewUrl)
107
+ opts.onServerReady(previewUrl);
108
+ let completedCount = 0;
109
+ async function runTask(f) {
110
+ let fdiff = getStagedDiffForFile(f);
111
+ // Check for max diff lines
112
+ const maxDiffLines = cfg.limits?.maxDiffLines || 10000;
113
+ const lines = fdiff.split('\n');
114
+ if (lines.length > maxDiffLines) {
115
+ fdiff = lines.slice(0, maxDiffLines).join('\n') + t('cli.diffTruncated', { lines: lines.length });
116
+ }
117
+ let frev = '';
118
+ try {
119
+ aiInvoked = true;
120
+ frev = await provider.review({ prompt, diff: fdiff });
121
+ aiSucceeded = aiSucceeded || !!frev;
122
+ }
123
+ catch (e) {
124
+ // warn(`code-gate: 文件 ${f} 审查失败:${e?.message || e}`)
125
+ }
126
+ items.push({ file: f, review: frev, diff: fdiff || 'diff --git a/' + f + ' b/' + f, done: true });
127
+ if (mode === 'files' && items.length === 1 && previewUrl) {
128
+ triggerOpen(previewUrl);
129
+ }
130
+ completedCount++;
131
+ if (opts.onProgress)
132
+ opts.onProgress(f, completedCount, list.length);
133
+ }
134
+ const queue = [...list];
135
+ const workers = [];
136
+ for (let i = 0; i < Math.max(1, concurrency); i++) {
137
+ const worker = (async () => {
138
+ while (queue.length) {
139
+ const f = queue.shift();
140
+ if (!f)
141
+ break;
142
+ await runTask(f);
143
+ }
144
+ })();
145
+ workers.push(worker);
146
+ }
147
+ await Promise.all(workers);
148
+ if (mode === 'both') {
149
+ const s = await runSummary();
150
+ items.push({ file: 'Summary', review: s, diff, done: true });
151
+ }
152
+ try {
153
+ const finalHtml = renderHTMLTabs(items, {
154
+ aiInvoked,
155
+ aiSucceeded,
156
+ provider: providerName,
157
+ model: modelUsed,
158
+ status,
159
+ datetime: formattedTime,
160
+ subtitle
161
+ });
162
+ saveOutput(cfg, id, finalHtml);
163
+ }
164
+ catch { }
165
+ return false;
166
+ }
167
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/core/review.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1 +1 @@
1
- export * from './cli.js';
1
+ export * from './cli/index.js';
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export * from './cli.js';
1
+ export * from './cli/index.js';
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { Config } from '../config/types.js';
2
+ export interface ReviewInput {
3
+ prompt: string;
4
+ diff: string;
5
+ }
6
+ export interface LLMProvider {
7
+ review(input: ReviewInput): Promise<string>;
8
+ }
9
+ export declare abstract class BaseLLMProvider implements LLMProvider {
10
+ protected config: Config;
11
+ constructor(config: Config);
12
+ abstract review(input: ReviewInput): Promise<string>;
13
+ protected buildUserPrompt(diff: string): string;
14
+ }
@@ -0,0 +1,10 @@
1
+ import { t } from '../locales/index.js';
2
+ export class BaseLLMProvider {
3
+ constructor(config) {
4
+ this.config = config;
5
+ }
6
+ buildUserPrompt(diff) {
7
+ return t('prompt.userTemplate', { diff });
8
+ }
9
+ }
10
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/llm/base.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAA;AAWvC,MAAM,OAAgB,eAAe;IAGnC,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAIS,eAAe,CAAC,IAAY;QACpC,OAAO,CAAC,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3C,CAAC;CACF"}
@@ -1,12 +1,12 @@
1
1
  import OpenAI from 'openai';
2
2
  export async function deepseekReview(cfg, input) {
3
- const baseURL = (cfg.deepseek?.baseURL || 'https://api.deepseek.com').replace(/`/g, '').trim();
4
- const apiKeyEnv = cfg.deepseek?.apiKeyEnv || 'DEEPSEEK_API_KEY';
3
+ const baseURL = (cfg.providerOptions?.deepseek?.baseURL || 'https://api.deepseek.com').replace(/`/g, '').trim();
4
+ const apiKeyEnv = cfg.providerOptions?.deepseek?.apiKeyEnv || 'DEEPSEEK_API_KEY';
5
5
  const apiKey = process.env[apiKeyEnv];
6
6
  if (!apiKey)
7
7
  throw new Error(`Missing DeepSeek API key in ${apiKeyEnv}`);
8
8
  const client = new OpenAI({ baseURL, apiKey });
9
- const model = cfg.deepseek?.model || 'deepseek-chat';
9
+ const model = cfg.providerOptions?.deepseek?.model || 'deepseek-chat';
10
10
  const res = await client.chat.completions.create({
11
11
  model,
12
12
  messages: [
@@ -1 +1 @@
1
- {"version":3,"file":"deepseek.js","sourceRoot":"","sources":["../../src/llm/deepseek.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAQ3B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,KAAkB;IAClE,MAAM,OAAO,GACX,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,IAAI,0BAA0B,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IAChF,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,EAAE,SAAS,IAAI,kBAAkB,CAAA;IAC/D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACrC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAA;IACxE,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;IAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,eAAe,CAAA;IACpD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAC/C,KAAK;QACL,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE;YACzC;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EACL,kDAAkD;oBAClD,KAAK,CAAC,IAAI;aACb;SACF;KACF,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAA;IACxD,OAAO,OAAO,CAAA;AAChB,CAAC"}
1
+ {"version":3,"file":"deepseek.js","sourceRoot":"","sources":["../../src/llm/deepseek.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAQ3B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,KAAkB;IAClE,MAAM,OAAO,GACX,CAAC,GAAG,CAAC,eAAe,EAAE,QAAQ,EAAE,OAAO,IAAI,0BAA0B,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACjG,MAAM,SAAS,GAAG,GAAG,CAAC,eAAe,EAAE,QAAQ,EAAE,SAAS,IAAI,kBAAkB,CAAA;IAChF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACrC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAA;IACxE,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;IAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,eAAe,EAAE,QAAQ,EAAE,KAAK,IAAI,eAAe,CAAA;IACrE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAC/C,KAAK;QACL,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE;YACzC;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EACL,kDAAkD;oBAClD,KAAK,CAAC,IAAI;aACb;SACF;KACF,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAA;IACxD,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Config } from '../config/types.js';
2
+ import { LLMProvider } from './base.js';
3
+ export * from './base.js';
4
+ export declare function createLLMProvider(config: Config): LLMProvider;
@@ -0,0 +1,41 @@
1
+ import { DeepSeekProvider } from './providers/deepseek.js';
2
+ import { OllamaProvider } from './providers/ollama.js';
3
+ import { OpenAIProvider } from './providers/openai.js';
4
+ import { AnthropicProvider } from './providers/anthropic.js';
5
+ import { GeminiProvider } from './providers/gemini.js';
6
+ import { MistralProvider } from './providers/mistral.js';
7
+ import { CohereProvider } from './providers/cohere.js';
8
+ import { AzureOpenAIProvider } from './providers/azure.js';
9
+ import { AliyunProvider } from './providers/aliyun.js';
10
+ import { VolcengineProvider } from './providers/volcengine.js';
11
+ import { ZhipuProvider } from './providers/zhipu.js';
12
+ export * from './base.js';
13
+ export function createLLMProvider(config) {
14
+ switch (config.provider) {
15
+ case 'deepseek':
16
+ return new DeepSeekProvider(config);
17
+ case 'ollama':
18
+ return new OllamaProvider(config);
19
+ case 'openai':
20
+ return new OpenAIProvider(config);
21
+ case 'anthropic':
22
+ return new AnthropicProvider(config);
23
+ case 'gemini':
24
+ return new GeminiProvider(config);
25
+ case 'mistral':
26
+ return new MistralProvider(config);
27
+ case 'cohere':
28
+ return new CohereProvider(config);
29
+ case 'azureOpenAI':
30
+ return new AzureOpenAIProvider(config);
31
+ case 'aliyun':
32
+ return new AliyunProvider(config);
33
+ case 'volcengine':
34
+ return new VolcengineProvider(config);
35
+ case 'zhipu':
36
+ return new ZhipuProvider(config);
37
+ default:
38
+ throw new Error(`Unsupported provider: ${config.provider}`);
39
+ }
40
+ }
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,cAAc,WAAW,CAAA;AAEzB,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,UAAU;YACb,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAA;QACrC,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;QACnC,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;QACnC,KAAK,WAAW;YACd,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAA;QACtC,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;QACnC,KAAK,SAAS;YACZ,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAA;QACpC,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;QACnC,KAAK,aAAa;YAChB,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAA;QACxC,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;QACnC,KAAK,YAAY;YACf,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAA;QACvC,KAAK,OAAO;YACV,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAA;QAClC;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC/D,CAAC;AACH,CAAC"}
@@ -1,6 +1,6 @@
1
1
  export async function ollamaReview(cfg, input) {
2
- const baseURL = cfg.ollama?.baseURL || 'http://localhost:11434';
3
- const model = cfg.ollama?.model || 'qwen2.5-coder';
2
+ const baseURL = cfg.providerOptions?.ollama?.baseURL || 'http://localhost:11434';
3
+ const model = cfg.providerOptions?.ollama?.model || 'qwen2.5-coder';
4
4
  const chatUrl = `${baseURL}/api/chat`;
5
5
  const chatBody = {
6
6
  model,
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/llm/ollama.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/llm/ollama.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { BaseLLMProvider, ReviewInput } from '../base.js';
2
+ export declare class AliyunProvider extends BaseLLMProvider {
3
+ review(input: ReviewInput): Promise<string>;
4
+ }
@@ -0,0 +1,25 @@
1
+ import OpenAI from 'openai';
2
+ import { BaseLLMProvider } from '../base.js';
3
+ export class AliyunProvider extends BaseLLMProvider {
4
+ async review(input) {
5
+ const opts = this.config.providerOptions?.aliyun;
6
+ const baseURL = (opts?.baseURL || 'https://dashscope.aliyuncs.com/compatible-mode/v1').replace(/`/g, '').trim();
7
+ const apiKeyEnv = opts?.apiKeyEnv || 'DASHSCOPE_API_KEY';
8
+ const apiKey = process.env[apiKeyEnv] || opts?.apiKey;
9
+ if (!apiKey) {
10
+ throw new Error(`Missing Aliyun DashScope API key. Please set ${apiKeyEnv} in environment variables or configure 'apiKey' in .codegate.js`);
11
+ }
12
+ const client = new OpenAI({ baseURL, apiKey });
13
+ const model = opts?.model || 'qwen-plus';
14
+ const res = await client.chat.completions.create({
15
+ model,
16
+ messages: [
17
+ { role: 'system', content: input.prompt },
18
+ { role: 'user', content: this.buildUserPrompt(input.diff) }
19
+ ],
20
+ ...opts?.request
21
+ });
22
+ return res.choices?.[0]?.message?.content || '';
23
+ }
24
+ }
25
+ //# sourceMappingURL=aliyun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aliyun.js","sourceRoot":"","sources":["../../../src/llm/providers/aliyun.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,eAAe,EAAe,MAAM,YAAY,CAAA;AAEzD,MAAM,OAAO,cAAe,SAAQ,eAAe;IACjD,KAAK,CAAC,MAAM,CAAC,KAAkB;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAA;QAChD,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,mDAAmD,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QAC/G,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,mBAAmB,CAAA;QACxD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,MAAM,CAAA;QAErD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,gDAAgD,SAAS,iEAAiE,CAAC,CAAA;QAC7I,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;QAC9C,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,WAAW,CAAA;QAExC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YAC/C,KAAK;YACL,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE;gBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;aAC5D;YACD,GAAG,IAAI,EAAE,OAAO;SACjB,CAAC,CAAA;QAEF,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAA;IACjD,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import { BaseLLMProvider, ReviewInput } from '../base.js';
2
+ export declare class AnthropicProvider extends BaseLLMProvider {
3
+ review(input: ReviewInput): Promise<string>;
4
+ }