acm-cli 0.1.0__tar.gz

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.
@@ -0,0 +1,72 @@
1
+ # Log
2
+ log/
3
+ logs/
4
+ *.log
5
+
6
+ # VSCode
7
+ .vscode/
8
+
9
+ # Pipenv
10
+ Pipfile
11
+ Pipfile.lock
12
+
13
+ # Byte-compiled / optimized / DLL files
14
+ __pycache__/
15
+ *.py[cod]
16
+ *$py.class
17
+
18
+ # C extensions
19
+ *.so
20
+
21
+ # Distribution / packaging
22
+ .Python
23
+ build/
24
+ develop-eggs/
25
+ dist/
26
+ downloads/
27
+ eggs/
28
+ .eggs/
29
+ lib/
30
+ lib64/
31
+ parts/
32
+ sdist/
33
+ var/
34
+ wheels/
35
+ *.egg-info/
36
+ .installed.cfg
37
+ *.egg
38
+ MANIFEST
39
+
40
+ # Environments
41
+ .env
42
+ .venv
43
+ env/
44
+ venv/
45
+ ENV/
46
+ env.bak/
47
+ venv.bak/
48
+
49
+ # development project config
50
+ .settings
51
+ .project
52
+ .pydevproject
53
+ .idea
54
+ *.swp
55
+ .DS_Store
56
+ *.db
57
+ .pytest_cache
58
+
59
+ # application config
60
+ app.properties
61
+ antx.properties
62
+ ali-cvecenter.properties
63
+ acm-data
64
+ nacos-data/
65
+
66
+ # test dir and files
67
+ test
68
+ cvecenter/views/test_*.py
69
+
70
+ .qoder
71
+ *.toml
72
+ !pyproject.toml
acm_cli-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 huangzhao
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
acm_cli-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,369 @@
1
+ Metadata-Version: 2.4
2
+ Name: acm-cli
3
+ Version: 0.1.0
4
+ Summary: 基于 LLM 的 Git Commit Message 自动生成工具
5
+ Project-URL: Homepage, https://github.com/hz-lxt/auto_commit_cli
6
+ Project-URL: Repository, https://github.com/hz-lxt/auto_commit_cli
7
+ Project-URL: Issues, https://github.com/hz-lxt/auto_commit_cli/issues
8
+ Author-email: huangzhao <572478035@qq.com>
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: ai,automation,commit,commit-message,git,llm
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.10
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Topic :: Software Development :: Version Control :: Git
22
+ Requires-Python: >=3.10
23
+ Requires-Dist: click>=8.0
24
+ Requires-Dist: openai>=1.0
25
+ Requires-Dist: rich>=13.0
26
+ Requires-Dist: tomli-w>=1.0
27
+ Requires-Dist: tomli>=2.0; python_version < '3.11'
28
+ Description-Content-Type: text/markdown
29
+
30
+ # ACM-CLI
31
+
32
+ 基于 LLM 的 Git Commit Message 自动生成工具。分析暂存区代码变更,自动生成符合规范的中文 commit message。
33
+
34
+ ## 功能特性
35
+
36
+ - 自动分析 `git diff --staged` 内容,调用 LLM 生成规范的 commit message
37
+ - 遵循 `type(scope): 描述` 格式,scope 根据文件目录自动推断,描述默认中文
38
+ - 支持确认提交、编辑、根据反馈多次重新生成、放弃等交互操作
39
+ - 智能 diff 截断:大变更自动截断并附加摘要,避免超出 token 限制
40
+ - 智能拆分提交:将一次大变更拆分为多个原子提交
41
+ - 多提供商支持:内置通义千问,兼容所有 OpenAI 接口的提供商
42
+ - 彩色终端界面(基于 rich)
43
+ - 流式输出:LLM 生成过程实时逐字显示,无需等待完整响应
44
+ - 全局配置 + 项目级配置,TOML 格式
45
+ - 反馈学习:自动记录用户反馈,动态优化后续生成的 prompt
46
+ - 自动暂存:暂存区为空时提示自动执行 `git add`
47
+
48
+ ## 环境要求
49
+
50
+ - Python >= 3.10
51
+ - Git
52
+
53
+ ## 安装
54
+
55
+ ```bash
56
+ # 使用 pip
57
+ pip install acm-cli
58
+
59
+ # 使用 uv
60
+ uv pip install acm-cli
61
+
62
+ # 从源码安装(开发模式)
63
+ git clone <repo-url> && cd auto_commit
64
+ uv venv --python 3.10 && source .venv/bin/activate
65
+ uv pip install -e .
66
+ ```
67
+
68
+ 安装完成后,终端即可使用 `acm` 命令。
69
+
70
+ ## 快速开始
71
+
72
+ ### 1. 初始化配置
73
+
74
+ 首次使用需要配置 LLM 提供商和 API Key:
75
+
76
+ ```bash
77
+ acm init
78
+ ```
79
+
80
+ 按提示依次完成:
81
+
82
+ ```
83
+ ACM 配置初始化
84
+
85
+ 可选提供商:
86
+ 1. qwen
87
+ 2. other
88
+ 选择提供商: 1
89
+ 输入 API Key: ****
90
+ 输入模型名称 (必填): qwen-plus
91
+ 自定义 Base URL (留空使用默认):
92
+ 输出语言 (zh-CN, en) [zh-CN]: zh-CN
93
+
94
+ v 配置已保存到: .acm.toml
95
+ ```
96
+
97
+ 生成全局配置(所有项目共用):
98
+
99
+ ```bash
100
+ acm init --global
101
+ ```
102
+
103
+ ### 2. 日常使用
104
+
105
+ ```bash
106
+ # 先暂存要提交的文件
107
+ git add .
108
+
109
+ # 自动生成 commit message
110
+ acm
111
+ ```
112
+
113
+ 工具会展示变更摘要,然后**实时流式显示**生成的 message,最后等待你选择操作:
114
+
115
+ ```
116
+ > 分析暂存区变更...
117
+
118
+ 修改了 3 个文件 (+45, -12)
119
+ ├── src/auth/login.py (+30, -5)
120
+ ├── src/auth/models.py (+10, -2)
121
+ └── tests/test_login.py (+5, -5)
122
+
123
+ > 生成 commit message...
124
+
125
+ ╭─────── Commit Message ───────╮
126
+ │ │
127
+ │ feat(auth): 实现用户登录认证功能 │
128
+ │ │
129
+ │ - 新增基于JWT的登录接口 │
130
+ │ - 添加用户模型字段校验 │
131
+ │ - 更新登录相关单元测试 │
132
+ │ │
133
+ ╰──────────────────────────────╯
134
+
135
+ [y] 确认提交 [e] 编辑 [r] 反馈重新生成 [q] 放弃
136
+ >
137
+ ```
138
+
139
+ | 操作 | 说明 |
140
+ |------|------|
141
+ | `y` | 确认,执行 `git commit` |
142
+ | `e` | 打开编辑器修改 message 后提交 |
143
+ | `r` | 输入反馈,LLM 根据反馈重新生成(可多次) |
144
+ | `q` | 放弃,不提交 |
145
+
146
+ ### 3. 反馈重新生成
147
+
148
+ 输入 `r` 后可以告诉 AI 如何改进:
149
+
150
+ ```
151
+ > r
152
+ > 请输入你的反馈(告诉AI如何改进):
153
+ > type应该是refactor不是feat
154
+
155
+ > 根据反馈重新生成...
156
+
157
+ ╭─────── Commit Message ───────╮
158
+ │ refactor(auth): 重构用户登录认证逻辑 │
159
+ ╰──────────────────────────────╯
160
+ ```
161
+
162
+ 反馈可以多次进行,直到满意为止。
163
+
164
+ ### 4. 自动暂存
165
+
166
+ 当暂存区为空但工作区存在未暂存的修改或未跟踪文件时,acm 会提示你是否自动执行 `git add -A`:
167
+
168
+ ```
169
+ ! 暂存区为空,但检测到未暂存的修改
170
+ 是否执行 git add . 将所有变更添加到暂存区并继续? [Y/n]: y
171
+ v 已执行 git add -A,所有变更已添加到暂存区
172
+
173
+ > 分析暂存区变更...
174
+ ```
175
+
176
+ 选择 `y` 后工具会自动暂存所有变更并继续生成 commit message,无需手动执行 `git add`。
177
+
178
+ ### 5. 同类变更收敛
179
+
180
+ 当多个文件的变更属于同一类操作时,生成的 commit message 会自动合并 scope,避免冗余:
181
+
182
+ ```
183
+ # 多个文件都是优化导入 -> 合并为一条
184
+ refactor(cve_service, cve_serializer): 优化导入和移除未使用模块
185
+
186
+ # 多个文件都是格式调整 -> 合并为一条
187
+ style(auth, api, utils): 统一代码格式化
188
+ ```
189
+
190
+ ### 6. 反馈学习
191
+
192
+ acm 会自动记录你的偏好到本地(`~/.acm/feedback.json`),包括:
193
+
194
+ - 使用反馈重新生成(`r`)时:记录原始 message、反馈内容、改进后 message
195
+ - 手动编辑(`e`)时:记录编辑前后的 message 差异
196
+
197
+ 后续生成时,acm 会**智能匹配**与当前 diff 最相关的历史反馈(按 scope/关键词匹配,最多注入 5 条),注入 prompt 让 LLM 学习你的偏好。最多保留最近 20 条记录。
198
+
199
+ ```
200
+ # 第一次使用:LLM 生成了 feat(auth): 添加登录功能
201
+ # 你反馈:type 应该是 fix 不是 feat
202
+ # LLM 改进为:fix(auth): 修复登录功能
203
+
204
+ # 之后修改 auth 相关代码时,LLM 会自动参考这条反馈
205
+ ```
206
+
207
+ 管理反馈记录:
208
+
209
+ ```bash
210
+ acm feedback list # 查看所有历史反馈
211
+ acm feedback clear # 清空所有反馈记录
212
+ ```
213
+
214
+ ## 命令参考
215
+
216
+ ### `acm` — 生成 commit message(默认命令)
217
+
218
+ ```bash
219
+ acm # 生成并交互式提交
220
+ acm --dry-run # 仅生成,不执行 git commit
221
+ acm --verbose # 输出调试信息(配置、prompt、LLM 响应等)
222
+ acm --split # 智能拆分为多个原子提交
223
+ acm --version # 查看版本
224
+ ```
225
+
226
+ ### `acm init` — 交互式初始化配置
227
+
228
+ ```bash
229
+ acm init # 生成项目级配置 .acm.toml
230
+ acm init --global # 生成全局配置 ~/.acm/config.toml
231
+ ```
232
+
233
+ ### `acm config` — 配置管理
234
+
235
+ ```bash
236
+ acm config list # 列出当前生效的所有配置
237
+ acm config get llm.model # 查看某个配置项
238
+ acm config set llm.model qwen-turbo # 修改项目级配置
239
+ acm config set llm.model qwen-turbo --global # 修改全局配置
240
+ ```
241
+
242
+ ### `acm feedback` — 反馈记录管理
243
+
244
+ ```bash
245
+ acm feedback list # 列出所有历史反馈记录
246
+ acm feedback clear # 清空所有反馈记录
247
+ ```
248
+
249
+ ## 配置文件
250
+
251
+ ### 配置文件位置
252
+
253
+ | 优先级 | 路径 | 说明 |
254
+ |--------|------|------|
255
+ | 高 | 项目根目录 `.acm.toml` | 项目级配置,仅当前项目生效 |
256
+ | 低 | `~/.acm/config.toml` | 全局配置,所有项目生效 |
257
+
258
+ 项目级配置会覆盖全局配置中的同名字段。
259
+
260
+ ### 配置文件示例
261
+
262
+ ```toml
263
+ [llm]
264
+ provider = "qwen" # 提供商名称
265
+ api_key = "sk-xxx" # API Key(建议改用环境变量)
266
+ model = "qwen-plus" # 模型名称(必填)
267
+ base_url = "" # 自定义 API 地址(留空使用提供商默认值)
268
+
269
+ [commit]
270
+ language = "zh-CN" # 描述语言,默认中文
271
+ max_diff_lines = 500 # diff 截断阈值(行数)
272
+ types = ["build", "ci"] # 自定义类型(追加到内置标准类型之上)
273
+
274
+ [prompt]
275
+ system = "" # 自定义 system prompt(留空使用内置默认)
276
+ extra = "" # 追加到默认 prompt 之后的额外指令
277
+ ```
278
+
279
+ ### API Key 管理
280
+
281
+ API Key 按以下优先级读取(高到低):
282
+
283
+ 1. 环境变量 `ACM_API_KEY`
284
+ 2. 提供商专用环境变量(如通义千问的 `DASHSCOPE_API_KEY`)
285
+ 3. 配置文件中的 `llm.api_key`
286
+
287
+ 推荐使用环境变量,避免将密钥写入配置文件:
288
+
289
+ ```bash
290
+ export ACM_API_KEY="sk-your-key-here"
291
+ # 或通义千问专用
292
+ export DASHSCOPE_API_KEY="sk-your-key-here"
293
+ ```
294
+
295
+ ## Commit Message 规范
296
+
297
+ 生成的 message 格式为 `type(scope): 中文描述`。
298
+
299
+ ### 内置 type 类型
300
+
301
+ | Type | 说明 |
302
+ |------|------|
303
+ | `feat` | 新功能 |
304
+ | `fix` | 缺陷修复 |
305
+ | `docs` | 文档变更 |
306
+ | `style` | 代码风格(不影响逻辑) |
307
+ | `refactor` | 重构 |
308
+ | `perf` | 性能优化 |
309
+ | `test` | 测试相关 |
310
+ | `chore` | 构建/工具变更 |
311
+
312
+ 可通过 `commit.types` 配置项追加自定义类型。
313
+
314
+ ### Scope 自动推断
315
+
316
+ 根据变更文件所在目录自动推断。例如修改了 `src/auth/login.py`,scope 为 `auth`。
317
+
318
+ 多模块变更时会用逗号分隔并分行描述:
319
+
320
+ ```
321
+ feat(auth,api): 添加用户认证模块
322
+
323
+ - auth: 实现基于JWT的登录认证逻辑
324
+ - api: 新增 /login 和 /logout 接口
325
+ ```
326
+
327
+ ## 提供商配置
328
+
329
+ ### 通义千问(内置)
330
+
331
+ ```toml
332
+ [llm]
333
+ provider = "qwen"
334
+ model = "qwen-plus" # 或 qwen-turbo, qwen-max 等
335
+ ```
336
+
337
+ ### 其他 OpenAI 兼容提供商
338
+
339
+ 任何兼容 OpenAI Chat API 的服务都可以使用,只需配置 `base_url`:
340
+
341
+ ```toml
342
+ # DeepSeek
343
+ [llm]
344
+ provider = "deepseek"
345
+ model = "deepseek-chat"
346
+ base_url = "https://api.deepseek.com/v1"
347
+
348
+ # Ollama 本地模型
349
+ [llm]
350
+ provider = "ollama"
351
+ model = "qwen2.5:7b"
352
+ base_url = "http://localhost:11434/v1"
353
+
354
+ # 智谱 AI
355
+ [llm]
356
+ provider = "zhipu"
357
+ model = "glm-4-flash"
358
+ base_url = "https://open.bigmodel.cn/api/paas/v4"
359
+ ```
360
+
361
+ ## 运行测试
362
+
363
+ ```bash
364
+ python -m unittest discover -s tests -v
365
+ ```
366
+
367
+ ## License
368
+
369
+ MIT