@dongowu/git-ai-cli 1.0.14 → 1.0.16
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.
- package/CHANGELOG.md +25 -0
- package/README.md +34 -45
- package/README_EN.md +162 -0
- package/dist/cli.js +7 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/commit.d.ts +1 -0
- package/dist/commands/commit.d.ts.map +1 -1
- package/dist/commands/commit.js +48 -10
- package/dist/commands/commit.js.map +1 -1
- package/dist/commands/msg.d.ts +1 -0
- package/dist/commands/msg.d.ts.map +1 -1
- package/dist/commands/msg.js +18 -6
- package/dist/commands/msg.js.map +1 -1
- package/dist/utils/ai.d.ts +2 -1
- package/dist/utils/ai.d.ts.map +1 -1
- package/dist/utils/ai.js +58 -6
- package/dist/utils/ai.js.map +1 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +24 -5
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/git.d.ts +2 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +51 -1
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/update.d.ts.map +1 -1
- package/dist/utils/update.js +3 -2
- package/dist/utils/update.js.map +1 -1
- package/package.json +5 -2
- package/release_notes.md +3 -2
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
## [1.0.16] - 2026-01-14
|
|
6
|
+
|
|
7
|
+
### ✨ Features
|
|
8
|
+
|
|
9
|
+
- **Style Learning**: Automatically analyzes your recent 10 commits to mimic your personal style (emojis, casing, format).
|
|
10
|
+
- **Project Config**: Added support for `.git-ai.json` in project root for team-wide configuration.
|
|
11
|
+
- **Smart Ignore**: Added support for `.git-aiignore` to exclude specific files from AI analysis.
|
|
12
|
+
- **Batch Optimization**: Optimized `git-ai -n <count>` to use a single API request for multiple choices, reducing token usage.
|
|
13
|
+
|
|
14
|
+
### ⚡ Improvements
|
|
15
|
+
|
|
16
|
+
- **Performance**: Reduced API latency for multi-choice generation.
|
|
17
|
+
- **Docs**: Updated README with comprehensive guides for new features.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## [1.0.15]
|
|
22
|
+
|
|
23
|
+
- Initial release of stable features.
|
|
24
|
+
- Support for DeepSeek, OpenAI, and Ollama.
|
|
25
|
+
- Interactive mode and Git Hook integration.
|
package/README.md
CHANGED
|
@@ -16,11 +16,11 @@
|
|
|
16
16
|
</p>
|
|
17
17
|
|
|
18
18
|
<p align="center">
|
|
19
|
+
<a href="./README_EN.md">English</a> •
|
|
19
20
|
<a href="#-快速开始">快速开始</a> •
|
|
20
21
|
<a href="#-核心特性">核心特性</a> •
|
|
21
22
|
<a href="#-git-flow-最佳实践">Git Flow</a> •
|
|
22
|
-
<a href="#-智能周报">智能周报</a>
|
|
23
|
-
<a href="#english">English</a>
|
|
23
|
+
<a href="#-智能周报">智能周报</a>
|
|
24
24
|
</p>
|
|
25
25
|
|
|
26
26
|
---
|
|
@@ -52,10 +52,14 @@ git-ai
|
|
|
52
52
|
- **Ollama 零配置**:自动探测本地运行的 Ollama 模型(如 `llama3`, `deepseek-coder`),无需手动输入模型名。数据完全不出网,绝对安全。
|
|
53
53
|
|
|
54
54
|
### 2. 🧠 上下文感知 (Context Aware)
|
|
55
|
-
-
|
|
56
|
-
-
|
|
55
|
+
- **风格学习**:自动分析您最近的 10 次提交记录,模仿您的语气、格式(如 Emoji 使用习惯)和语言风格。
|
|
56
|
+
- **分支感知**:读取当前分支名(如 `feat/user-login`, `fix/JIRA-123`),生成包含 Issue ID 或功能模块的规范提交信息。
|
|
57
57
|
|
|
58
|
-
### 3.
|
|
58
|
+
### 3. ⚙️ 工程化配置 (Project Config)
|
|
59
|
+
- **项目级配置**:支持在项目根目录创建 `.git-ai.json`,团队统一共享模型和 Prompt 配置(优先级 > 全局配置)。
|
|
60
|
+
- **智能忽略**:支持 `.git-aiignore` 文件,排除自动生成文件(如 `package-lock.json`)或大文件,节省 Token 并提高准确性。
|
|
61
|
+
|
|
62
|
+
### 4. 🪝 无感集成 (Git Hook)
|
|
59
63
|
- **零打扰**:安装 Hook 后,只需执行 `git commit`(不带 `-m`),AI 自动填充消息并打开编辑器。
|
|
60
64
|
- **兼容性**:完美兼容现有 Git 工作流,支持 `git commit --no-verify` 跳过。
|
|
61
65
|
|
|
@@ -65,6 +69,31 @@ git-ai
|
|
|
65
69
|
|
|
66
70
|
---
|
|
67
71
|
|
|
72
|
+
## ⚙️ 高级配置
|
|
73
|
+
|
|
74
|
+
### 项目级配置文件 `.git-ai.json`
|
|
75
|
+
在项目根目录创建此文件,可覆盖全局设置,方便团队统一规范:
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"model": "deepseek-coder",
|
|
80
|
+
"temperature": 0.5,
|
|
81
|
+
"locale": "zh-CN",
|
|
82
|
+
"customPrompt": "Always start with an emoji."
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 忽略文件 `.git-aiignore`
|
|
87
|
+
在项目根目录创建,用于排除不想发送给 AI 的文件(语法同 `.gitignore`):
|
|
88
|
+
|
|
89
|
+
```text
|
|
90
|
+
package-lock.json
|
|
91
|
+
dist/
|
|
92
|
+
*.min.js
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
68
97
|
## 📖 使用方式
|
|
69
98
|
|
|
70
99
|
### 场景一:交互式提交 (Interactive)
|
|
@@ -136,47 +165,7 @@ git-ai report --days 30
|
|
|
136
165
|
|
|
137
166
|
---
|
|
138
167
|
|
|
139
|
-
## English
|
|
140
168
|
|
|
141
|
-
### Installation
|
|
142
|
-
|
|
143
|
-
```bash
|
|
144
|
-
npm install -g @dongowu/git-ai-cli
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
### Features
|
|
148
|
-
|
|
149
|
-
- **Context Aware**: Understands your Git branch (e.g., `feat/login`) to generate semantically correct commits.
|
|
150
|
-
- **Privacy First**: Seamless support for local **Ollama** models.
|
|
151
|
-
- **Git Hooks**: `git-ai hook install` integrates AI directly into your `git commit` workflow.
|
|
152
|
-
- **AI Reports**: `git-ai report` turns your commit history into professional weekly reports.
|
|
153
|
-
|
|
154
|
-
### Usage
|
|
155
|
-
|
|
156
|
-
**1. Setup**
|
|
157
|
-
```bash
|
|
158
|
-
git-ai init
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
**2. Commit**
|
|
162
|
-
```bash
|
|
163
|
-
git add .
|
|
164
|
-
git-ai
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
**3. Generate Report**
|
|
168
|
-
```bash
|
|
169
|
-
git-ai report
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
### Git Hook Integration (Recommended)
|
|
173
|
-
|
|
174
|
-
```bash
|
|
175
|
-
git-ai hook install --global
|
|
176
|
-
```
|
|
177
|
-
Now just run `git commit` as usual, and AI will handle the rest!
|
|
178
|
-
|
|
179
|
-
---
|
|
180
169
|
|
|
181
170
|
## 📄 License
|
|
182
171
|
|
package/README_EN.md
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<h1 align="center">git-ai-cli</h1>
|
|
3
|
+
<p align="center">
|
|
4
|
+
<strong>🤖 AI-Powered Git Assistant: Commit, Context & Report</strong>
|
|
5
|
+
</p>
|
|
6
|
+
<p align="center">
|
|
7
|
+
🚀 <strong>DeepSeek</strong> Optimized | 🏠 <strong>Ollama</strong> Privacy First | 🧠 <strong>Context Aware</strong> | 📊 <strong>AI Reports</strong>
|
|
8
|
+
</p>
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<a href="https://www.npmjs.com/package/@dongowu/git-ai-cli"><img src="https://img.shields.io/npm/v/@dongowu/git-ai-cli.svg?style=flat-square" alt="npm version"></a>
|
|
13
|
+
<a href="https://www.npmjs.com/package/@dongowu/git-ai-cli"><img src="https://img.shields.io/npm/dm/@dongowu/git-ai-cli.svg?style=flat-square" alt="npm downloads"></a>
|
|
14
|
+
<a href="https://github.com/dongowu/git-ai-cli/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/@dongowu/git-ai-cli.svg?style=flat-square" alt="license"></a>
|
|
15
|
+
<a href="https://nodejs.org"><img src="https://img.shields.io/node/v/@dongowu/git-ai-cli.svg?style=flat-square" alt="node version"></a>
|
|
16
|
+
</p>
|
|
17
|
+
|
|
18
|
+
<p align="center">
|
|
19
|
+
<a href="./README.md">中文文档</a> •
|
|
20
|
+
<a href="#-quick-start">Quick Start</a> •
|
|
21
|
+
<a href="#-features">Features</a> •
|
|
22
|
+
<a href="#-usage">Usage</a> •
|
|
23
|
+
<a href="#-configuration">Configuration</a>
|
|
24
|
+
</p>
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
**git-ai-cli** is more than just a commit message generator. It's your **AI Development Assistant**. It understands your code diffs, recognizes your branch intent, and even writes your weekly reports.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 🚀 Quick Start
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# 1. Install
|
|
36
|
+
npm install -g @dongowu/git-ai-cli
|
|
37
|
+
|
|
38
|
+
# 2. Initialize (Auto-detects local models or configures API)
|
|
39
|
+
git-ai init
|
|
40
|
+
|
|
41
|
+
# 3. Use
|
|
42
|
+
git add .
|
|
43
|
+
git-ai
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## ✨ Features
|
|
49
|
+
|
|
50
|
+
### 1. 🔒 Privacy First & Local Models
|
|
51
|
+
- **Ollama Zero-Config**: Automatically detects locally running Ollama models (like `llama3`, `deepseek-coder`). No manual setup required. Your data never leaves your machine.
|
|
52
|
+
- **DeepSeek/OpenAI**: Built-in support for popular API providers with optimized prompts.
|
|
53
|
+
|
|
54
|
+
### 2. 🧠 Context Aware
|
|
55
|
+
- **Style Learning**: Automatically analyzes your recent 10 commits to mimic your personal tone, format (e.g., emojis), and language style.
|
|
56
|
+
- **Branch Awareness**: Reads your current branch name (e.g., `feat/user-login`, `fix/JIRA-123`) to generate semantic commits with Issue IDs or scopes.
|
|
57
|
+
|
|
58
|
+
### 3. ⚙️ Engineering Ready
|
|
59
|
+
- **Project Config**: Create a `.git-ai.json` in your project root to share settings (model, prompts) with your team.
|
|
60
|
+
- **Smart Ignore**: Use `.git-aiignore` to exclude auto-generated files (like `package-lock.json`) or large files to save tokens and improve accuracy.
|
|
61
|
+
|
|
62
|
+
### 4. 🪝 Seamless Integration (Git Hook)
|
|
63
|
+
- **Zero Distraction**: After installing the hook, just run `git commit` (without `-m`). AI automatically fills in the message and opens your editor.
|
|
64
|
+
- **Compatibility**: Perfectly compatible with existing Git workflows. Supports `git commit --no-verify`.
|
|
65
|
+
|
|
66
|
+
### 5. 📊 AI Reports
|
|
67
|
+
- **One-Click Generation**: `git-ai report` analyzes your recent commits.
|
|
68
|
+
- **Value Driven**: Transforms fragmented commits into structured reports highlighting "Core Outputs", "Bug Fixes", and "Technical Improvements".
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## ⚙️ Configuration
|
|
73
|
+
|
|
74
|
+
### Project-Level Config `.git-ai.json`
|
|
75
|
+
Create this file in your project root to override global settings:
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"model": "deepseek-coder",
|
|
80
|
+
"temperature": 0.5,
|
|
81
|
+
"locale": "en",
|
|
82
|
+
"customPrompt": "Always start with an emoji."
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Ignore File `.git-aiignore`
|
|
87
|
+
Exclude specific files from AI analysis (syntax similar to `.gitignore`):
|
|
88
|
+
|
|
89
|
+
```text
|
|
90
|
+
package-lock.json
|
|
91
|
+
dist/
|
|
92
|
+
*.min.js
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 📖 Usage
|
|
98
|
+
|
|
99
|
+
### Scenario 1: Interactive
|
|
100
|
+
```bash
|
|
101
|
+
git add .
|
|
102
|
+
git-ai
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Scenario 2: Git Hook (Recommended) 🌟
|
|
106
|
+
The smoothest experience. Install once, use forever.
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# Install for current project
|
|
110
|
+
git-ai hook install
|
|
111
|
+
|
|
112
|
+
# Or install globally (for all projects)
|
|
113
|
+
git-ai hook install --global
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Then just run:**
|
|
117
|
+
```bash
|
|
118
|
+
git checkout -b feature/awesome-login
|
|
119
|
+
# ... write code ...
|
|
120
|
+
git add .
|
|
121
|
+
git commit # ✨ AI generates "feat(login): implement awesome login logic"
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Scenario 3: Generate Reports
|
|
125
|
+
Hate writing weekly reports?
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
# Generate report for this week
|
|
129
|
+
git-ai report
|
|
130
|
+
|
|
131
|
+
# Generate report for the last 30 days
|
|
132
|
+
git-ai report --days 30
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## 🛠 Command Reference
|
|
138
|
+
|
|
139
|
+
| Command | Alias | Description |
|
|
140
|
+
|---------|-------|-------------|
|
|
141
|
+
| `git-ai init` | `config` | **Initialize Config** (Provider, Key, Language) |
|
|
142
|
+
| `git-ai` | | Interactive generation & commit |
|
|
143
|
+
| `git-ai -y` | | Skip confirmation and commit directly |
|
|
144
|
+
| `git-ai -n 3` | | Generate 3 options to choose from |
|
|
145
|
+
| `git-ai -l en` | | Force language (en/zh) |
|
|
146
|
+
| `git-ai hook install` | | **Install Git Hook** (supports `--global`) |
|
|
147
|
+
| `git-ai report` | | **Generate AI Report** (supports `--days`) |
|
|
148
|
+
| `git-ai msg` | | Generate message only (stdout for scripts) |
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## 📄 License
|
|
153
|
+
|
|
154
|
+
[MIT](LICENSE)
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
<p align="center">
|
|
159
|
+
Made with ❤️ by git-ai team
|
|
160
|
+
<br>
|
|
161
|
+
<sub>🤖 Generated by git-ai 🚀</sub>
|
|
162
|
+
</p>
|
package/dist/cli.js
CHANGED
|
@@ -29,18 +29,20 @@ cli
|
|
|
29
29
|
.command('', 'Generate AI-powered commit message (interactive)')
|
|
30
30
|
.option('-y, --yes', 'Skip confirmation and commit directly')
|
|
31
31
|
.option('-n, --num <count>', 'Generate multiple commit messages to choose from', { default: 1 })
|
|
32
|
+
.option('-l, --locale <locale>', 'Override locale (zh/en)')
|
|
32
33
|
.option('--hook', '[deprecated] Use `git-ai msg` instead')
|
|
33
34
|
.action(async (options) => {
|
|
34
35
|
try {
|
|
35
36
|
// Deprecated --hook redirects to msg command behavior
|
|
36
37
|
if (options.hook) {
|
|
37
38
|
const { runMsg } = await import('./commands/msg.js');
|
|
38
|
-
await runMsg({ quiet: true });
|
|
39
|
+
await runMsg({ quiet: true, locale: options.locale });
|
|
39
40
|
return;
|
|
40
41
|
}
|
|
41
42
|
await runCommit({
|
|
42
43
|
autoCommit: options.yes ?? false,
|
|
43
44
|
numChoices: Math.min(Math.max(Number(options.num) || 1, 1), 5),
|
|
45
|
+
locale: options.locale,
|
|
44
46
|
});
|
|
45
47
|
}
|
|
46
48
|
catch (error) {
|
|
@@ -54,11 +56,13 @@ cli
|
|
|
54
56
|
.command('commit', 'Generate and commit with AI message (interactive)')
|
|
55
57
|
.option('-y, --yes', 'Skip confirmation and commit directly')
|
|
56
58
|
.option('-n, --num <count>', 'Generate multiple commit messages to choose from', { default: 1 })
|
|
59
|
+
.option('-l, --locale <locale>', 'Override locale (zh/en)')
|
|
57
60
|
.action(async (options) => {
|
|
58
61
|
try {
|
|
59
62
|
await runCommit({
|
|
60
63
|
autoCommit: options.yes ?? false,
|
|
61
64
|
numChoices: Math.min(Math.max(Number(options.num) || 1, 1), 5),
|
|
65
|
+
locale: options.locale,
|
|
62
66
|
});
|
|
63
67
|
}
|
|
64
68
|
catch (error) {
|
|
@@ -73,12 +77,14 @@ cli
|
|
|
73
77
|
.option('-n, --num <count>', 'Generate multiple messages', { default: 1 })
|
|
74
78
|
.option('--json', 'Output as JSON')
|
|
75
79
|
.option('--quiet', 'Suppress spinner and colors')
|
|
80
|
+
.option('-l, --locale <locale>', 'Override locale (zh/en)')
|
|
76
81
|
.action(async (options) => {
|
|
77
82
|
try {
|
|
78
83
|
await runMsg({
|
|
79
84
|
num: Math.min(Math.max(Number(options.num) || 1, 1), 5),
|
|
80
85
|
json: options.json ?? false,
|
|
81
86
|
quiet: options.quiet ?? false,
|
|
87
|
+
locale: options.locale,
|
|
82
88
|
});
|
|
83
89
|
}
|
|
84
90
|
catch (error) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,mDAAmD;AACnD,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;AAClC,8DAA8D;AAC9D,OAAO,CAAC,IAAI,GAAG,UAAU,IAAS,EAAE,IAAS,EAAE,GAAG,IAAW;IAC3D,IACE,IAAI,KAAK,SAAS;QAClB,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,EAAE,IAAI,KAAK,oBAAoB;QACnC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,EACnC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,8DAA8D;IAC9D,OAAO,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAQ,CAAC,CAAC;AACnE,CAAQ,CAAC;AAET,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAyB,CAAC;AAE/D,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;AAE1B,6DAA6D;AAC7D,GAAG;KACA,OAAO,CAAC,EAAE,EAAE,kDAAkD,CAAC;KAC/D,MAAM,CAAC,WAAW,EAAE,uCAAuC,CAAC;KAC5D,MAAM,CAAC,mBAAmB,EAAE,kDAAkD,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;KAC/F,MAAM,CAAC,QAAQ,EAAE,uCAAuC,CAAC;KACzD,MAAM,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAYD,wBAAsB,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4L1E"}
|
package/dist/commands/commit.js
CHANGED
|
@@ -2,7 +2,7 @@ import inquirer from 'inquirer';
|
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import ora from 'ora';
|
|
4
4
|
import { getConfig } from '../utils/config.js';
|
|
5
|
-
import { isGitInstalled, isInGitRepo, getStagedFiles, getFilteredDiff, commit, getBranchName, } from '../utils/git.js';
|
|
5
|
+
import { isGitInstalled, isInGitRepo, getStagedFiles, getFilteredDiff, commit, getBranchName, getRecentCommits, getUnstagedFiles, addFiles, } from '../utils/git.js';
|
|
6
6
|
import { createAIClient, generateCommitMessage, } from '../utils/ai.js';
|
|
7
7
|
function exitWithError(message, hint, silent = false) {
|
|
8
8
|
if (!silent) {
|
|
@@ -14,7 +14,7 @@ function exitWithError(message, hint, silent = false) {
|
|
|
14
14
|
process.exit(1);
|
|
15
15
|
}
|
|
16
16
|
export async function runCommit(options = {}) {
|
|
17
|
-
const { autoCommit = false, numChoices = 1, hookMode = false } = options;
|
|
17
|
+
const { autoCommit = false, numChoices = 1, hookMode = false, locale } = options;
|
|
18
18
|
// Recursion guard - prevent hook from triggering another git-ai
|
|
19
19
|
if (process.env.GIT_AI_RUNNING === '1') {
|
|
20
20
|
if (!hookMode) {
|
|
@@ -30,15 +30,44 @@ export async function runCommit(options = {}) {
|
|
|
30
30
|
if (!(await isInGitRepo())) {
|
|
31
31
|
exitWithError('Not in a git repository.', undefined, hookMode);
|
|
32
32
|
}
|
|
33
|
-
|
|
33
|
+
let stagedFiles = await getStagedFiles();
|
|
34
34
|
if (stagedFiles.length === 0) {
|
|
35
|
-
|
|
35
|
+
// Interactive add
|
|
36
|
+
const unstagedFiles = await getUnstagedFiles();
|
|
37
|
+
if (unstagedFiles.length > 0 && !hookMode) {
|
|
38
|
+
console.log(chalk.yellow('⚠️ No staged changes found.'));
|
|
39
|
+
const { selectedFiles } = await inquirer.prompt([
|
|
40
|
+
{
|
|
41
|
+
type: 'checkbox',
|
|
42
|
+
name: 'selectedFiles',
|
|
43
|
+
message: 'Select files to stage:',
|
|
44
|
+
choices: unstagedFiles,
|
|
45
|
+
pageSize: 15,
|
|
46
|
+
},
|
|
47
|
+
]);
|
|
48
|
+
if (selectedFiles.length > 0) {
|
|
49
|
+
await addFiles(selectedFiles);
|
|
50
|
+
stagedFiles = await getStagedFiles();
|
|
51
|
+
console.log(chalk.green(`✅ Staged ${selectedFiles.length} files.`));
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
console.log(chalk.gray('No files selected. Exiting.'));
|
|
55
|
+
process.exit(0);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
exitWithError('No staged changes found.', 'Use `git add <files>` to stage your changes first.', hookMode);
|
|
60
|
+
}
|
|
36
61
|
}
|
|
37
62
|
// Check config
|
|
38
63
|
const config = getConfig();
|
|
39
64
|
if (!config) {
|
|
40
65
|
exitWithError('Configuration not found.', 'Run `git-ai config` to set up your AI provider.');
|
|
41
66
|
}
|
|
67
|
+
// Override locale if provided
|
|
68
|
+
if (locale && (locale === 'zh' || locale === 'en')) {
|
|
69
|
+
config.locale = locale;
|
|
70
|
+
}
|
|
42
71
|
// Show staged files (skip in hook mode)
|
|
43
72
|
if (!hookMode) {
|
|
44
73
|
console.log(chalk.cyan('\n📁 Staged files:'));
|
|
@@ -49,6 +78,7 @@ export async function runCommit(options = {}) {
|
|
|
49
78
|
// Get filtered diff
|
|
50
79
|
const { diff, truncated, ignoredFiles } = await getFilteredDiff(stagedFiles);
|
|
51
80
|
const branchName = await getBranchName();
|
|
81
|
+
const recentCommits = await getRecentCommits(10); // Get last 10 commits for style reference
|
|
52
82
|
if (!hookMode) {
|
|
53
83
|
if (ignoredFiles.length > 0) {
|
|
54
84
|
const preview = ignoredFiles.slice(0, 8).join(', ');
|
|
@@ -61,13 +91,21 @@ export async function runCommit(options = {}) {
|
|
|
61
91
|
}
|
|
62
92
|
// Create AI client
|
|
63
93
|
const client = createAIClient(config);
|
|
64
|
-
const input = {
|
|
94
|
+
const input = {
|
|
95
|
+
diff,
|
|
96
|
+
stagedFiles,
|
|
97
|
+
ignoredFiles,
|
|
98
|
+
truncated,
|
|
99
|
+
branchName,
|
|
100
|
+
recentCommits,
|
|
101
|
+
};
|
|
65
102
|
// Generate commit message(s)
|
|
66
103
|
let commitMessage;
|
|
67
104
|
if (hookMode) {
|
|
68
105
|
// Hook mode: silent generation, output only the message
|
|
69
106
|
try {
|
|
70
|
-
|
|
107
|
+
const messages = await generateCommitMessage(client, input, config);
|
|
108
|
+
commitMessage = messages[0];
|
|
71
109
|
console.log(commitMessage);
|
|
72
110
|
return;
|
|
73
111
|
}
|
|
@@ -171,9 +209,9 @@ async function generateWithSpinner(client, input, config) {
|
|
|
171
209
|
color: 'cyan',
|
|
172
210
|
}).start();
|
|
173
211
|
try {
|
|
174
|
-
const
|
|
212
|
+
const messages = await generateCommitMessage(client, input, config);
|
|
175
213
|
spinner.succeed('Commit message generated!');
|
|
176
|
-
return
|
|
214
|
+
return messages[0];
|
|
177
215
|
}
|
|
178
216
|
catch (error) {
|
|
179
217
|
spinner.fail('Failed to generate commit message');
|
|
@@ -187,8 +225,8 @@ async function generateMultipleWithSpinner(client, input, config, count) {
|
|
|
187
225
|
color: 'cyan',
|
|
188
226
|
}).start();
|
|
189
227
|
try {
|
|
190
|
-
|
|
191
|
-
const messages = await
|
|
228
|
+
// Optimized: Single request for multiple choices
|
|
229
|
+
const messages = await generateCommitMessage(client, input, config, count);
|
|
192
230
|
// Dedupe
|
|
193
231
|
const unique = [...new Set(messages)];
|
|
194
232
|
spinner.succeed(`Generated ${unique.length} commit message(s)!`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EACL,cAAc,EACd,WAAW,EACX,cAAc,EACd,eAAe,EACf,MAAM,EACN,aAAa,
|
|
1
|
+
{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/msg.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"msg.d.ts","sourceRoot":"","sources":["../../src/commands/msg.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"msg.d.ts","sourceRoot":"","sources":["../../src/commands/msg.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE;QACT,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,SAAS,EAAE,OAAO,CAAC;QACnB,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;CACH;AAYD,wBAAsB,MAAM,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA0GpE"}
|
package/dist/commands/msg.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import ora from 'ora';
|
|
3
3
|
import { getConfig } from '../utils/config.js';
|
|
4
|
-
import { isGitInstalled, isInGitRepo, getStagedFiles, getFilteredDiff, getBranchName, } from '../utils/git.js';
|
|
4
|
+
import { isGitInstalled, isInGitRepo, getStagedFiles, getFilteredDiff, getBranchName, getRecentCommits, } from '../utils/git.js';
|
|
5
5
|
import { createAIClient, generateCommitMessage, } from '../utils/ai.js';
|
|
6
6
|
function exitWithError(message, options) {
|
|
7
7
|
if (options.json) {
|
|
@@ -14,7 +14,7 @@ function exitWithError(message, options) {
|
|
|
14
14
|
process.exit(1);
|
|
15
15
|
}
|
|
16
16
|
export async function runMsg(options = {}) {
|
|
17
|
-
const { json = false, quiet = false, num = 1 } = options;
|
|
17
|
+
const { json = false, quiet = false, num = 1, locale } = options;
|
|
18
18
|
// Environment checks
|
|
19
19
|
if (!(await isGitInstalled())) {
|
|
20
20
|
exitWithError('Git is not installed.', options);
|
|
@@ -31,12 +31,24 @@ export async function runMsg(options = {}) {
|
|
|
31
31
|
if (!config) {
|
|
32
32
|
exitWithError('Configuration not found. Run `git-ai config` first.', options);
|
|
33
33
|
}
|
|
34
|
+
// Override locale if provided
|
|
35
|
+
if (locale && (locale === 'zh' || locale === 'en')) {
|
|
36
|
+
config.locale = locale;
|
|
37
|
+
}
|
|
34
38
|
// Get filtered diff
|
|
35
39
|
const { diff, truncated, ignoredFiles } = await getFilteredDiff(stagedFiles);
|
|
36
40
|
const branchName = await getBranchName();
|
|
41
|
+
const recentCommits = await getRecentCommits(10);
|
|
37
42
|
// Create AI client
|
|
38
43
|
const client = createAIClient(config);
|
|
39
|
-
const input = {
|
|
44
|
+
const input = {
|
|
45
|
+
diff,
|
|
46
|
+
stagedFiles,
|
|
47
|
+
ignoredFiles,
|
|
48
|
+
truncated,
|
|
49
|
+
branchName,
|
|
50
|
+
recentCommits,
|
|
51
|
+
};
|
|
40
52
|
// Generate message(s)
|
|
41
53
|
try {
|
|
42
54
|
let spinner = null;
|
|
@@ -48,8 +60,7 @@ export async function runMsg(options = {}) {
|
|
|
48
60
|
}
|
|
49
61
|
if (num > 1) {
|
|
50
62
|
// Generate multiple messages
|
|
51
|
-
const
|
|
52
|
-
const messages = await Promise.all(promises);
|
|
63
|
+
const messages = await generateCommitMessage(client, input, config, num);
|
|
53
64
|
const unique = [...new Set(messages)];
|
|
54
65
|
if (spinner) {
|
|
55
66
|
spinner.stop();
|
|
@@ -75,7 +86,8 @@ export async function runMsg(options = {}) {
|
|
|
75
86
|
}
|
|
76
87
|
else {
|
|
77
88
|
// Single message
|
|
78
|
-
const
|
|
89
|
+
const messages = await generateCommitMessage(client, input, config);
|
|
90
|
+
const message = messages[0];
|
|
79
91
|
if (spinner) {
|
|
80
92
|
spinner.stop();
|
|
81
93
|
}
|
package/dist/commands/msg.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"msg.js","sourceRoot":"","sources":["../../src/commands/msg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EACL,cAAc,EACd,WAAW,EACX,cAAc,EACd,eAAe,EACf,aAAa,
|
|
1
|
+
{"version":3,"file":"msg.js","sourceRoot":"","sources":["../../src/commands/msg.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/ai.d.ts
CHANGED
|
@@ -7,7 +7,8 @@ export interface CommitMessageGenerationInput {
|
|
|
7
7
|
ignoredFiles?: string[];
|
|
8
8
|
truncated?: boolean;
|
|
9
9
|
branchName?: string;
|
|
10
|
+
recentCommits?: string[];
|
|
10
11
|
}
|
|
11
|
-
export declare function generateCommitMessage(client: OpenAI, input: CommitMessageGenerationInput, config: AIConfig): Promise<string>;
|
|
12
|
+
export declare function generateCommitMessage(client: OpenAI, input: CommitMessageGenerationInput, config: AIConfig, numChoices?: number): Promise<string[]>;
|
|
12
13
|
export declare function generateWeeklyReport(client: OpenAI, commits: string[], config: AIConfig): Promise<string>;
|
|
13
14
|
//# sourceMappingURL=ai.d.ts.map
|
package/dist/utils/ai.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/utils/ai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/utils/ai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAmE5C,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAOvD;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,4BAA4B,EACnC,MAAM,EAAE,QAAQ,EAChB,UAAU,SAAI,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CA+FnB;AAuCD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,QAAQ,GACf,OAAO,CAAC,MAAM,CAAC,CAkBjB"}
|
package/dist/utils/ai.js
CHANGED
|
@@ -10,6 +10,14 @@ Rules:
|
|
|
10
10
|
4. Use imperative mood ("add" not "added")
|
|
11
11
|
5. Don't end the subject line with a period
|
|
12
12
|
6. If needed, add a blank line followed by a body for more details
|
|
13
|
+
7. Git Flow Branch Mapping (Priority):
|
|
14
|
+
- feature/* -> type: feat
|
|
15
|
+
- bugfix/* -> type: fix
|
|
16
|
+
- hotfix/* -> type: fix
|
|
17
|
+
- release/* -> type: chore
|
|
18
|
+
- docs/* -> type: docs
|
|
19
|
+
- If branch name matches, infer <scope> from it (e.g. feature/login -> feat(login): ...)
|
|
20
|
+
- If branch name doesn't match these patterns, ignore it and infer type/scope strictly from the code changes.
|
|
13
21
|
|
|
14
22
|
Only output the commit message, nothing else.`;
|
|
15
23
|
const DEFAULT_SYSTEM_PROMPT_ZH = `你是一个专业的 Git commit message 编写专家,遵循 Conventional Commits 规范。
|
|
@@ -23,6 +31,14 @@ const DEFAULT_SYSTEM_PROMPT_ZH = `你是一个专业的 Git commit message 编
|
|
|
23
31
|
4. 使用祈使语气
|
|
24
32
|
5. subject 末尾不要加句号
|
|
25
33
|
6. 如需要,空一行后添加 body 提供更多细节
|
|
34
|
+
7. Git Flow 分支映射规则 (优先级最高):
|
|
35
|
+
- feature/* -> type: feat
|
|
36
|
+
- bugfix/* -> type: fix
|
|
37
|
+
- hotfix/* -> type: fix
|
|
38
|
+
- release/* -> type: chore
|
|
39
|
+
- docs/* -> type: docs
|
|
40
|
+
- 如果分支名匹配,请从中推断 <scope> (例如: feature/login -> feat(login): ...)
|
|
41
|
+
- 如果分支名不符合上述标准前缀,请忽略分支名,仅依据代码变更内容(diff)来决定 type 和 scope。
|
|
26
42
|
|
|
27
43
|
只输出 commit message,不要输出其他内容。`;
|
|
28
44
|
const DEEPSEEK_PROMPT_ZH = `你是一个智能编程助手,专注于生成高质量的 Git 提交信息。
|
|
@@ -35,6 +51,14 @@ const DEEPSEEK_PROMPT_ZH = `你是一个智能编程助手,专注于生成高
|
|
|
35
51
|
3. 描述(subject)需简洁有力,50字符以内,使用中文。
|
|
36
52
|
4. 如果变更复杂,请在 subject 后空一行,添加详细的 body 说明。
|
|
37
53
|
5. 专注于*为什么*变更,而不仅仅是*改了什么*。
|
|
54
|
+
6. Git Flow 分支映射规则 (优先级最高):
|
|
55
|
+
- feature/* -> type: feat
|
|
56
|
+
- bugfix/* -> type: fix
|
|
57
|
+
- hotfix/* -> type: fix
|
|
58
|
+
- release/* -> type: chore
|
|
59
|
+
- docs/* -> type: docs
|
|
60
|
+
- 如果分支名匹配,请从中推断 <scope> (例如: feature/login -> feat(login): ...)
|
|
61
|
+
- 如果分支名不符合上述标准前缀,请忽略分支名,仅依据代码变更内容(diff)来决定 type 和 scope。
|
|
38
62
|
|
|
39
63
|
只输出最终的 Commit Message,不包含 Markdown 代码块或其他解释。`;
|
|
40
64
|
export function createAIClient(config) {
|
|
@@ -45,7 +69,7 @@ export function createAIClient(config) {
|
|
|
45
69
|
maxRetries: 2, // Built-in retry support
|
|
46
70
|
});
|
|
47
71
|
}
|
|
48
|
-
export async function generateCommitMessage(client, input, config) {
|
|
72
|
+
export async function generateCommitMessage(client, input, config, numChoices = 1) {
|
|
49
73
|
let systemPrompt = config.customPrompt;
|
|
50
74
|
if (!systemPrompt) {
|
|
51
75
|
const isZh = config.locale === 'zh';
|
|
@@ -58,6 +82,30 @@ export async function generateCommitMessage(client, input, config) {
|
|
|
58
82
|
}
|
|
59
83
|
const isZh = config.locale === 'zh';
|
|
60
84
|
const lines = [];
|
|
85
|
+
if (numChoices > 1) {
|
|
86
|
+
// Add instruction for multiple choices
|
|
87
|
+
const multiInstruction = isZh
|
|
88
|
+
? `\n请生成 ${numChoices} 个不同的 commit message 选项,每个选项用 "---" 分隔。`
|
|
89
|
+
: `\nPlease generate ${numChoices} distinct commit message options, separated by "---".`;
|
|
90
|
+
systemPrompt += multiInstruction;
|
|
91
|
+
}
|
|
92
|
+
if (input.recentCommits?.length) {
|
|
93
|
+
const header = isZh
|
|
94
|
+
? '参考历史提交风格 (请模仿以下风格):'
|
|
95
|
+
: 'Reference recent commits (please mimic the style):';
|
|
96
|
+
// Extract subject from "hash date subject" format
|
|
97
|
+
// Format is "%h %cd %s", so we take everything after the second space
|
|
98
|
+
const cleanCommits = input.recentCommits
|
|
99
|
+
.map((line) => {
|
|
100
|
+
const parts = line.split(' ');
|
|
101
|
+
if (parts.length >= 3) {
|
|
102
|
+
return parts.slice(2).join(' ');
|
|
103
|
+
}
|
|
104
|
+
return line;
|
|
105
|
+
})
|
|
106
|
+
.slice(0, 10); // Limit to 10 to save tokens
|
|
107
|
+
lines.push(`${header}\n${cleanCommits.map((c) => `- ${c}`).join('\n')}`);
|
|
108
|
+
}
|
|
61
109
|
if (input.branchName) {
|
|
62
110
|
const header = isZh ? '当前分支:' : 'Current branch:';
|
|
63
111
|
lines.push(`${header} ${input.branchName}`);
|
|
@@ -86,16 +134,20 @@ export async function generateCommitMessage(client, input, config) {
|
|
|
86
134
|
{ role: 'user', content: lines.join('\n\n') },
|
|
87
135
|
],
|
|
88
136
|
temperature: 0.7,
|
|
89
|
-
max_tokens: 500,
|
|
137
|
+
max_tokens: 500 * numChoices, // Increase token limit for multiple choices
|
|
90
138
|
});
|
|
91
|
-
const
|
|
92
|
-
if (!
|
|
139
|
+
const content = response.choices[0]?.message?.content?.trim();
|
|
140
|
+
if (!content) {
|
|
93
141
|
throw new Error('Failed to generate commit message: empty response');
|
|
94
142
|
}
|
|
143
|
+
const messages = content
|
|
144
|
+
.split('---')
|
|
145
|
+
.map((msg) => msg.trim())
|
|
146
|
+
.filter(Boolean);
|
|
95
147
|
if (config.enableFooter) {
|
|
96
|
-
return `${
|
|
148
|
+
return messages.map((msg) => `${msg}\n\n🤖 Generated by git-ai 🚀`);
|
|
97
149
|
}
|
|
98
|
-
return
|
|
150
|
+
return messages;
|
|
99
151
|
}
|
|
100
152
|
const REPORT_PROMPT_ZH = `你是一位资深技术专家,擅长撰写高质量的周报/日报。
|
|
101
153
|
|
package/dist/utils/ai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/utils/ai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,MAAM,wBAAwB,GAAG
|
|
1
|
+
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/utils/ai.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA8C5C,wBAAgB,SAAS,IAAI,QAAQ,GAAG,IAAI,CAoB3C;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAM5D;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
|
package/dist/utils/config.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import Conf from 'conf';
|
|
2
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
2
4
|
const config = new Conf({
|
|
3
5
|
projectName: 'git-ai-cli',
|
|
4
6
|
schema: {
|
|
@@ -29,19 +31,36 @@ const config = new Conf({
|
|
|
29
31
|
},
|
|
30
32
|
},
|
|
31
33
|
});
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
if (
|
|
35
|
-
|
|
34
|
+
function getLocalConfig() {
|
|
35
|
+
const localPath = join(process.cwd(), '.git-ai.json');
|
|
36
|
+
if (existsSync(localPath)) {
|
|
37
|
+
try {
|
|
38
|
+
const content = readFileSync(localPath, 'utf-8');
|
|
39
|
+
return JSON.parse(content);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Ignore invalid config
|
|
43
|
+
}
|
|
36
44
|
}
|
|
37
|
-
return {
|
|
45
|
+
return {};
|
|
46
|
+
}
|
|
47
|
+
export function getConfig() {
|
|
48
|
+
const globalConfig = {
|
|
38
49
|
provider: config.get('provider'),
|
|
39
50
|
apiKey: config.get('apiKey'),
|
|
40
51
|
baseUrl: config.get('baseUrl'),
|
|
41
52
|
model: config.get('model'),
|
|
42
53
|
locale: config.get('locale'),
|
|
43
54
|
customPrompt: config.get('customPrompt'),
|
|
55
|
+
enableFooter: config.get('enableFooter'),
|
|
44
56
|
};
|
|
57
|
+
const localConfig = getLocalConfig();
|
|
58
|
+
const finalConfig = { ...globalConfig, ...localConfig };
|
|
59
|
+
// Provider is mandatory (either global or local)
|
|
60
|
+
if (!finalConfig.provider) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
return finalConfig;
|
|
45
64
|
}
|
|
46
65
|
export function setConfig(newConfig) {
|
|
47
66
|
for (const [key, value] of Object.entries(newConfig)) {
|
package/dist/utils/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAW;IAChC,WAAW,EAAE,YAAY;IACzB,MAAM,EAAE;QACN,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;SACZ;QACD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;SACZ;QACD,OAAO,EAAE;YACP,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;SACZ;QACD,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;SACZ;QACD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;YAClB,OAAO,EAAE,IAAI;SACd;QACD,YAAY,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;SACZ;KACF;CACF,CAAC,CAAC;AAEH,SAAS,cAAc;IACrB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,YAAY,GAAG;QACnB,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;QAChC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;QAC9B,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC1B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC5B,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC;QACxC,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC;KACzC,CAAC;IAEF,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,EAAE,GAAG,YAAY,EAAE,GAAG,WAAW,EAAE,CAAC;IAExD,iDAAiD;IACjD,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,WAAuB,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,SAA4B;IACpD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,CAAC,GAAqB,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,CAAC,KAAK,EAAE,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
|
package/dist/utils/git.d.ts
CHANGED
|
@@ -12,4 +12,6 @@ export declare function getFilteredDiff(files: string[]): Promise<{
|
|
|
12
12
|
export declare function commit(message: string): Promise<void>;
|
|
13
13
|
export declare function getUserName(): Promise<string>;
|
|
14
14
|
export declare function getRecentCommits(days: number): Promise<string[]>;
|
|
15
|
+
export declare function getUnstagedFiles(): Promise<string[]>;
|
|
16
|
+
export declare function addFiles(files: string[]): Promise<void>;
|
|
15
17
|
//# sourceMappingURL=git.d.ts.map
|
package/dist/utils/git.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AA8BA,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAOvD;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAOpD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAOrD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAGrD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAGxD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAYvD;AAkCD,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA0BvE;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAOnD;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAoBtE;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAkB1D;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7D"}
|
package/dist/utils/git.js
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
import { execa } from 'execa';
|
|
2
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
2
4
|
import { DIFF_BLACKLIST, MAX_DIFF_LENGTH } from '../types.js';
|
|
5
|
+
let cachedIgnorePatterns = null;
|
|
6
|
+
function getIgnorePatterns() {
|
|
7
|
+
if (cachedIgnorePatterns)
|
|
8
|
+
return cachedIgnorePatterns;
|
|
9
|
+
const patterns = [...DIFF_BLACKLIST];
|
|
10
|
+
const ignorePath = join(process.cwd(), '.git-aiignore');
|
|
11
|
+
if (existsSync(ignorePath)) {
|
|
12
|
+
try {
|
|
13
|
+
const content = readFileSync(ignorePath, 'utf-8');
|
|
14
|
+
const lines = content
|
|
15
|
+
.split('\n')
|
|
16
|
+
.map((l) => l.trim())
|
|
17
|
+
.filter((l) => l && !l.startsWith('#'));
|
|
18
|
+
patterns.push(...lines);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// ignore error
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
cachedIgnorePatterns = patterns;
|
|
25
|
+
return patterns;
|
|
26
|
+
}
|
|
3
27
|
export async function isGitInstalled() {
|
|
4
28
|
try {
|
|
5
29
|
await execa('git', ['--version']);
|
|
@@ -36,7 +60,8 @@ export async function getStagedFiles() {
|
|
|
36
60
|
return stdout.split('\n').filter(Boolean);
|
|
37
61
|
}
|
|
38
62
|
export function isBlacklisted(filename) {
|
|
39
|
-
|
|
63
|
+
const patterns = getIgnorePatterns();
|
|
64
|
+
return patterns.some((pattern) => {
|
|
40
65
|
if (pattern.endsWith('/')) {
|
|
41
66
|
return filename.startsWith(pattern) || filename.includes(`/${pattern}`);
|
|
42
67
|
}
|
|
@@ -125,4 +150,29 @@ export async function getRecentCommits(days) {
|
|
|
125
150
|
return [];
|
|
126
151
|
}
|
|
127
152
|
}
|
|
153
|
+
export async function getUnstagedFiles() {
|
|
154
|
+
try {
|
|
155
|
+
const { stdout } = await execa('git', ['status', '--porcelain']);
|
|
156
|
+
if (!stdout)
|
|
157
|
+
return [];
|
|
158
|
+
return stdout
|
|
159
|
+
.split('\n')
|
|
160
|
+
.filter((line) => line.trim())
|
|
161
|
+
.filter((line) => {
|
|
162
|
+
// Check if there are unstaged changes
|
|
163
|
+
// Index 1 is the worktree status. ' ' means unmodified in worktree (relative to index).
|
|
164
|
+
// ?? is untracked.
|
|
165
|
+
return line[1] !== ' ' || line.startsWith('??');
|
|
166
|
+
})
|
|
167
|
+
.map((line) => line.substring(3).trim());
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return [];
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
export async function addFiles(files) {
|
|
174
|
+
if (files.length === 0)
|
|
175
|
+
return;
|
|
176
|
+
await execa('git', ['add', ...files]);
|
|
177
|
+
}
|
|
128
178
|
//# sourceMappingURL=git.js.map
|
package/dist/utils/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3E,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;IAC3E,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,OAAO,
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/utils/update.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/utils/update.ts"],"names":[],"mappings":"AASA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAkCjD"}
|
package/dist/utils/update.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import https from 'node:https';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
2
3
|
import chalk from 'chalk';
|
|
3
|
-
|
|
4
|
-
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
const packageJson = require('../../package.json');
|
|
5
6
|
const REGISTRY_URL = 'https://registry.npmjs.org/@dongowu/git-ai-cli/latest';
|
|
6
7
|
export async function checkUpdate() {
|
|
7
8
|
return new Promise((resolve) => {
|
package/dist/utils/update.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/utils/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/utils/update.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dongowu/git-ai-cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.16",
|
|
4
4
|
"description": "Fast, privacy-first, bring-your-own-model Git commit message generator",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/cli.js",
|
|
@@ -26,7 +26,10 @@
|
|
|
26
26
|
"cli",
|
|
27
27
|
"openai",
|
|
28
28
|
"deepseek",
|
|
29
|
-
"ollama"
|
|
29
|
+
"ollama",
|
|
30
|
+
"style-learning",
|
|
31
|
+
"git-hook",
|
|
32
|
+
"productivity"
|
|
30
33
|
],
|
|
31
34
|
"author": "",
|
|
32
35
|
"license": "MIT",
|