@dongowu/git-ai-cli 1.0.21 â 2.0.1
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/README.md +200 -157
- package/bin/git-ai.cjs +57 -0
- package/install.cjs +107 -0
- package/package.json +27 -28
- package/.claude/settings.local.json +0 -17
- package/CHANGELOG.md +0 -46
- package/README_EN.md +0 -264
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -17
- package/dist/cli.js.map +0 -1
- package/dist/cli_main.d.ts +0 -2
- package/dist/cli_main.d.ts.map +0 -1
- package/dist/cli_main.js +0 -255
- package/dist/cli_main.js.map +0 -1
- package/dist/commands/branch.d.ts +0 -11
- package/dist/commands/branch.d.ts.map +0 -1
- package/dist/commands/branch.js +0 -279
- package/dist/commands/branch.js.map +0 -1
- package/dist/commands/commit.d.ts +0 -9
- package/dist/commands/commit.d.ts.map +0 -1
- package/dist/commands/commit.js +0 -326
- package/dist/commands/commit.js.map +0 -1
- package/dist/commands/config.d.ts +0 -2
- package/dist/commands/config.d.ts.map +0 -1
- package/dist/commands/config.js +0 -164
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/config_manage.d.ts +0 -14
- package/dist/commands/config_manage.d.ts.map +0 -1
- package/dist/commands/config_manage.js +0 -394
- package/dist/commands/config_manage.js.map +0 -1
- package/dist/commands/hook.d.ts +0 -5
- package/dist/commands/hook.d.ts.map +0 -1
- package/dist/commands/hook.js +0 -528
- package/dist/commands/hook.js.map +0 -1
- package/dist/commands/msg.d.ts +0 -20
- package/dist/commands/msg.d.ts.map +0 -1
- package/dist/commands/msg.js +0 -148
- package/dist/commands/msg.js.map +0 -1
- package/dist/commands/pr.d.ts +0 -8
- package/dist/commands/pr.d.ts.map +0 -1
- package/dist/commands/pr.js +0 -96
- package/dist/commands/pr.js.map +0 -1
- package/dist/commands/release.d.ts +0 -8
- package/dist/commands/release.d.ts.map +0 -1
- package/dist/commands/release.js +0 -95
- package/dist/commands/release.js.map +0 -1
- package/dist/commands/report.d.ts +0 -9
- package/dist/commands/report.d.ts.map +0 -1
- package/dist/commands/report.js +0 -162
- package/dist/commands/report.js.map +0 -1
- package/dist/types.d.ts +0 -46
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -86
- package/dist/types.js.map +0 -1
- package/dist/utils/agent.d.ts +0 -5
- package/dist/utils/agent.d.ts.map +0 -1
- package/dist/utils/agent.js +0 -308
- package/dist/utils/agent.js.map +0 -1
- package/dist/utils/agent_lite.d.ts +0 -5
- package/dist/utils/agent_lite.d.ts.map +0 -1
- package/dist/utils/agent_lite.js +0 -263
- package/dist/utils/agent_lite.js.map +0 -1
- package/dist/utils/ai.d.ts +0 -43
- package/dist/utils/ai.d.ts.map +0 -1
- package/dist/utils/ai.js +0 -1103
- package/dist/utils/ai.js.map +0 -1
- package/dist/utils/config.d.ts +0 -11
- package/dist/utils/config.d.ts.map +0 -1
- package/dist/utils/config.js +0 -239
- package/dist/utils/config.js.map +0 -1
- package/dist/utils/git.d.ts +0 -42
- package/dist/utils/git.d.ts.map +0 -1
- package/dist/utils/git.js +0 -456
- package/dist/utils/git.js.map +0 -1
- package/dist/utils/update.d.ts +0 -4
- package/dist/utils/update.d.ts.map +0 -1
- package/dist/utils/update.js +0 -122
- package/dist/utils/update.js.map +0 -1
- package/release_notes.md +0 -9
- package/scripts/release.sh +0 -34
- package/test_agent_feature.ts +0 -1
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<strong>đ¤ AI-Powered Git Assistant: Commit, Context & Report</strong>
|
|
5
5
|
</p>
|
|
6
6
|
<p align="center">
|
|
7
|
-
đ <strong>DeepSeek</strong> æˇąåēĻäŧå | đ <strong>Ollama</strong> éį§äŧå
| đ§ <strong>忝æįĨ</strong> | đ <strong>æēčŊ卿Ĩ</strong>
|
|
7
|
+
đ <strong>DeepSeek</strong> æˇąåēĻäŧå | đ <strong>Ollama</strong> éį§äŧå
| đ§ <strong>忝æįĨ</strong> | đĄī¸ <strong>Copilot åŽæ¤</strong> | đ <strong>æēčŊ卿Ĩ</strong>
|
|
8
8
|
</p>
|
|
9
9
|
</p>
|
|
10
10
|
|
|
@@ -18,223 +18,264 @@
|
|
|
18
18
|
<p align="center">
|
|
19
19
|
<a href="./README_EN.md">English</a> âĸ
|
|
20
20
|
<a href="#-åŋĢéåŧå§">åŋĢéåŧå§</a> âĸ
|
|
21
|
-
<a href="
|
|
22
|
-
<a href="
|
|
23
|
-
<a href="
|
|
21
|
+
<a href="#-æ ¸åŋįšæ§">æ ¸åŋįšæ§</a> âĸ
|
|
22
|
+
<a href="#-git-flow-æäŊŗåŽčˇĩ">Git Flow</a> âĸ
|
|
23
|
+
<a href="#-æēčŊ卿Ĩ">æēčŊ卿Ĩ</a>
|
|
24
24
|
</p>
|
|
25
25
|
|
|
26
26
|
---
|
|
27
27
|
|
|
28
|
-
**git-ai-cli**
|
|
28
|
+
**git-ai-cli** ä¸äģ
äģ
æ¯ä¸ä¸Ē Commit Message įæå¨īŧåŽæ¯äŊ į**å
¨čŊ AI åŧååŠæ**ãåŽčŊč¯ģæäŊ įäģŖį DiffīŧįæäŊ į忝æåžīŧįčŗå¸ŽäŊ ååĨŊ卿Ĩã
|
|
29
29
|
|
|
30
30
|
---
|
|
31
31
|
|
|
32
|
+
## đĻ Rust į蝴æīŧåŊåéģ莤åå¸īŧ
|
|
33
|
+
|
|
34
|
+
äģ **2.x** åŧå§īŧ`git-ai-cli` éģ莤åå¸ **Rust į**īŧæ´åŋĢãåæäģļäēčŋåļīŧãæ¨čéčŋ npm åŽčŖ
īŧäŧčĒå¨ä¸čŊŊ寚åēåšŗå°įäēčŋåļīŧīŧ
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm install -g @dongowu/git-ai-cli
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
> Rust įįŽåå
åĢ **agent-lite**īŧåŊąååæ/įŦĻ县į´ĸīŧīŧåĸåŧēåŽå
¨/æ§čŊåæåčŊäģå¨čŋį§ģä¸ã
|
|
41
|
+
|
|
42
|
+
> åĻéæ§į TypeScriptīŧ1.xīŧ蝎čĒčĄåēåŽįæŦåˇåŽčŖ
ã
|
|
43
|
+
|
|
32
44
|
## đ åŋĢéåŧå§
|
|
33
45
|
|
|
34
46
|
```bash
|
|
35
|
-
# 1
|
|
47
|
+
# 1. åŽčŖ
|
|
36
48
|
npm install -g @dongowu/git-ai-cli
|
|
37
49
|
|
|
38
|
-
# 2
|
|
39
|
-
git-ai
|
|
50
|
+
# 2. åå§å (čĒ卿ĸæĩæŦå°æ¨Ąåæé
įŊŽ API)
|
|
51
|
+
git-ai config
|
|
40
52
|
|
|
41
|
-
# 3
|
|
53
|
+
# 3. äŊŋį¨
|
|
42
54
|
git add .
|
|
43
55
|
git-ai
|
|
44
56
|
```
|
|
45
57
|
|
|
46
58
|
---
|
|
47
59
|
|
|
48
|
-
##
|
|
60
|
+
## â¨ æ ¸åŋįšæ§
|
|
49
61
|
|
|
50
|
-
1
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
62
|
+
### 1. đ¨đŗ æč´æŦåå & éį§äŧå
|
|
63
|
+
- **DeepSeek/Qwen æˇąåēĻäŧå**īŧå
įŊŽä¸åŽļįē§æį¤ēč¯īŧéå¯šä¸æäģŖį č¯åĸäŧåīŧä¸åĒæ¯įŋģč¯ Diffīŧ违įč§Ŗâæåžâã
|
|
64
|
+
- **Ollama éļé
įŊŽ**īŧčĒ卿ĸæĩæŦå°čŋčĄį Ollama æ¨ĄåīŧåĻ `llama3`, `deepseek-coder`īŧīŧæ éæå¨čžå
Ĩæ¨Ąååãæ°æŽåŽå
¨ä¸åēįŊīŧįģ寚åŽå
¨ã
|
|
65
|
+
|
|
66
|
+
### 2. đ§ ä¸ä¸ææįĨ (Context Aware)
|
|
67
|
+
- **éŖæ ŧåĻäš **īŧčĒå¨åææ¨æčŋį 10 æŦĄæäē¤čްåŊīŧæ¨Ąäģŋæ¨į蝿°ãæ ŧåŧīŧåĻ Emoji äŊŋį¨ä𠿝īŧåč¯č¨éŖæ ŧã
|
|
68
|
+
- **忝æįĨ**īŧč¯ģååŊå忝åīŧåĻ `feat/user-login`, `fix/JIRA-123`īŧīŧįæå
åĢ Issue ID æåčŊæ¨Ąåįč§čæäē¤äŋĄæ¯ã
|
|
69
|
+
|
|
70
|
+
### 3. đ¤ Agent æēčŊäŊ
|
|
71
|
+
äģåįē¯į"ææŦįæ"čŋåä¸ē"æēčŊäģŖį ä¸åŽļ"ã
|
|
72
|
+
- **Smart Diff**: éå°čļ
大忴ä¸åįįŧãAgent äŧčĒå¨åæįģčŽĄæ°æŽīŧåĒč¯ģåæ ¸åŋæäģļįäģŖį īŧ大åš
éäŊ Token éåļå¸ĻæĨįåŊąåã
|
|
73
|
+
- **åŊąååæ (Impact Analysis)**: äŋŽæšäēæ ¸åŋ APIīŧAgent äŧä¸ģå¨**æį´ĸæ´ä¸ĒäģŖį åē**īŧ`git grep`īŧīŧæŖæĨč°į¨æšæ¯åĻåæĨäŋŽæšīŧåšļå¨ Commit Body 䏿į¤ēæŊå¨éŖéŠã
|
|
74
|
+
- **Git Flow æ¤čĒ**: å¨ `release/*` æ `hotfix/*` 忝ä¸čĒå¨åŧ坿ˇąåēĻæŖæĨīŧåŽåĢįäē§į¯åĸã
|
|
75
|
+
|
|
76
|
+
### 4. đĄī¸ GitHub Copilot CLI æēčŊåŽæ¤ (New)
|
|
77
|
+
ååą AI æļæīŧä¸ä¸ Commit įæ + æˇąåēĻäģŖį åæã
|
|
78
|
+
- **äģŖį åŊąååæ**: äŊŋ፠GitHub Copilot CLI æˇąåēĻåæäģŖį åæ´įåŊąåčå´åæŊå¨éŖéŠ
|
|
79
|
+
- **éŖéŠæŖæĩ**: čĒå¨č¯åĢį ´åæ§åæ´ãæŊå¨ Bug ååŽå
¨éæŖ
|
|
80
|
+
- **æĩč¯åģē莎**: æēčŊæ¨čéčĻæĩč¯įå翝åį¨äž
|
|
81
|
+
- **ååŊąååēå**: åæåĒä翍Ąååæäģļå¯čŊåå°åŊąå
|
|
82
|
+
- **å¯éå¯į¨**: éčŋ `--copilot` åæ°æéå¯į¨īŧä¸åŧēåļäžčĩ
|
|
83
|
+
|
|
84
|
+
### 5. âī¸ åˇĨį¨åé
įŊŽ (Project Config)
|
|
85
|
+
- **饚įŽįē§é
įŊŽ**īŧæ¯æå¨éĄšįŽæ šįŽåŊååģē `.git-ai.json`īŧåĸéįģä¸å
ąäēĢæ¨Ąåå Prompt é
įŊŽīŧäŧå
įē§ > å
¨åąé
įŊŽīŧã
|
|
86
|
+
- **æēčŊåŋŊįĨ**īŧæ¯æ `.git-aiignore` æäģļīŧæé¤čĒå¨įææäģļīŧåĻ `package-lock.json`īŧæå¤§æäģļīŧčį Token åšļæéĢåįĄŽæ§ã
|
|
87
|
+
|
|
88
|
+
### 6. đĒ æ æéæ (Git Hook)
|
|
89
|
+
- **éļææ°**īŧåŽčŖ
Hook åīŧåĒéæ§čĄ `git commit`īŧä¸å¸Ļ `-m`īŧīŧAI čĒå¨åĄĢå
æļæ¯åšļæåŧįŧčžå¨ã
|
|
90
|
+
- **å
ŧ厚æ§**īŧåŽįžå
ŧåŽšį°æ Git åˇĨäŊæĩīŧæ¯æ `git commit --no-verify` 莺čŋã
|
|
91
|
+
|
|
92
|
+
### 7. đ æēčŊ卿Ĩ (AI Report)
|
|
93
|
+
- **ä¸éŽįæ**īŧ`git-ai report` čĒå¨åæäŊ æčŋįäģŖį æäē¤ã
|
|
94
|
+
- **äģˇåŧå¯ŧå**īŧå°éļįĸį Commit čŊŦåä¸ēįģæåį"æ ¸åŋäē§åē"ã"éŽéĸäŋŽå¤"å"ææ¯äŧå"æĨåã
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## âī¸ éĢįē§é
įŊŽ
|
|
99
|
+
|
|
100
|
+
### 饚įŽįē§é
įŊŽæäģļ `.git-ai.json`
|
|
101
|
+
å¨éĄšįŽæ šįŽåŊååģ翤æäģļīŧå¯čĻįå
¨åąčŽžįŊŽīŧæšäžŋåĸéįģä¸č§čīŧ
|
|
55
102
|
|
|
56
|
-
2) **åĸéé
įŊŽīŧæ¨čīŧ**īŧå¨éĄšįŽæ šįŽåŊå `.git-ai.json`
|
|
57
103
|
```json
|
|
58
104
|
{
|
|
59
105
|
"provider": "deepseek",
|
|
60
106
|
"baseUrl": "https://api.deepseek.com/v1",
|
|
61
107
|
"model": "deepseek-reasoner",
|
|
62
108
|
"agentModel": "deepseek-chat",
|
|
63
|
-
"locale": "
|
|
64
|
-
"enableFooter":
|
|
65
|
-
"rulesPreset": "conventional",
|
|
66
|
-
"fallbackModels": ["deepseek-chat", "qwen-turbo"],
|
|
67
|
-
"policy": { "strict": true },
|
|
68
|
-
"rules": {
|
|
69
|
-
"types": ["feat", "fix", "docs", "refactor", "perf", "test", "chore", "build", "ci"],
|
|
70
|
-
"maxSubjectLength": 50,
|
|
71
|
-
"requireScope": false,
|
|
72
|
-
"issuePattern": "[A-Z]+-\\d+",
|
|
73
|
-
"issuePlacement": "footer",
|
|
74
|
-
"issueFooterPrefix": "Refs",
|
|
75
|
-
"requireIssue": false
|
|
76
|
-
},
|
|
77
|
-
"branch": {
|
|
78
|
-
"types": ["feat", "fix", "docs"],
|
|
79
|
-
"pattern": "{type}/{issue?}{name}",
|
|
80
|
-
"issueSeparator": "-",
|
|
81
|
-
"nameMaxLength": 50
|
|
82
|
-
}
|
|
109
|
+
"locale": "zh",
|
|
110
|
+
"enableFooter": true
|
|
83
111
|
}
|
|
84
112
|
```
|
|
85
113
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
114
|
+
蝴æīŧ
|
|
115
|
+
- `model`īŧåēįĄæ¨Ąåŧįææäē¤äŋĄæ¯įæ¨Ąå
|
|
116
|
+
- `agentModel`īŧAgent æ¨Ąåŧīŧ`-a`īŧä¸į¨æ¨ĄåīŧåģēčŽŽéæŠį¨ŗåŽæ¯æ tools ῍ĄåīŧDeepSeek 叏፠`deepseek-chat`īŧ
|
|
117
|
+
- `locale`īŧäģ
æ¯æ `zh` / `en`
|
|
118
|
+
- `apiKey` åģē莎éčŋį¯åĸåéæå
¨åąé
įŊŽčŽžįŊŽīŧä¸čĻæäē¤å°äģåē
|
|
91
119
|
|
|
92
|
-
|
|
93
|
-
```bash
|
|
94
|
-
git-ai hook install
|
|
95
|
-
# å¤ąč´Ĩéģææäē¤īŧå¯éīŧ
|
|
96
|
-
GIT_AI_HOOK_STRICT=1 git commit
|
|
97
|
-
# å¤ąč´Ĩæļå
ŗéå
åēīŧå¯éīŧ
|
|
98
|
-
GIT_AI_HOOK_FALLBACK=0 git commit
|
|
99
|
-
```
|
|
120
|
+
### åŊäģ¤čĄé
įŊŽīŧå¯čæŦåīŧ
|
|
100
121
|
|
|
101
|
-
5) **čæŦ / CI**
|
|
102
122
|
```bash
|
|
103
|
-
|
|
104
|
-
|
|
123
|
+
# æĨįåŊåįæé
įŊŽīŧå
åĢį¯åĸåéčĻįīŧ
|
|
124
|
+
git-ai config get --json
|
|
105
125
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
126
|
+
# 莞įŊŽå
¨åąé
įŊŽīŧåå
Ĩå
¨åąé
įŊŽæäģļīŧ
|
|
127
|
+
git-ai config set model deepseek-chat
|
|
128
|
+
|
|
129
|
+
# 莞įŊŽéĄšįŽįē§é
įŊŽīŧåå
ĨåŊåéĄšįŽ .git-ai.jsonīŧ
|
|
130
|
+
git-ai config set agentModel deepseek-chat --local
|
|
131
|
+
|
|
132
|
+
# æĨįå¯é
įŊŽéĄš / į¯åĸåéčĻį
|
|
133
|
+
git-ai config describe
|
|
109
134
|
```
|
|
110
135
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
136
|
+
### į¯åĸåéīŧCI/čæŦīŧ
|
|
137
|
+
|
|
138
|
+
常į¨į¯åĸåéīŧäŧå
įē§éĢäēé
įŊŽæäģļīŧīŧ
|
|
139
|
+
- `GIT_AI_PROVIDER` / `GIT_AI_BASE_URL` / `GIT_AI_MODEL` / `GIT_AI_AGENT_MODEL`
|
|
140
|
+
- `GIT_AI_API_KEY`īŧäšæ¯æ `DEEPSEEK_API_KEY`ã`OPENAI_API_KEY`īŧ
|
|
141
|
+
- `GIT_AI_TIMEOUT_MS`īŧ蝎æąčļ
æļīŧéģ莤 120000īŧ
|
|
142
|
+
- `GIT_AI_MAX_DIFF_CHARS`īŧæ§åļ diff æĒæéŋåēĻīŧ
|
|
143
|
+
- `GIT_AI_MAX_OUTPUT_TOKENS`īŧæ§åļčžåē token ä¸éīŧ
|
|
144
|
+
- `GIT_AI_DEBUG=1`īŧæå°æ´č¯Ļįģé蝝īŧ
|
|
145
|
+
|
|
146
|
+
OpenCommit å
ŧ厚åéīŧå¯į´æĨå¤į¨īŧīŧ
|
|
147
|
+
- `OCO_AI_PROVIDER` / `OCO_MODEL` / `OCO_API_KEY`
|
|
148
|
+
- `OCO_TOKENS_MAX_INPUT` / `OCO_TOKENS_MAX_OUTPUT`
|
|
115
149
|
|
|
116
|
-
|
|
117
|
-
|
|
150
|
+
### åŋŊįĨæäģļ `.git-aiignore`
|
|
151
|
+
å¨éĄšįŽæ šįŽåŊååģēīŧį¨äēæé¤ä¸æŗåéįģ AI įæäģļīŧ蝿ŗå `.gitignore`īŧīŧ
|
|
118
152
|
|
|
119
|
-
|
|
120
|
-
|
|
153
|
+
```text
|
|
154
|
+
package-lock.json
|
|
155
|
+
dist/
|
|
156
|
+
*.min.js
|
|
121
157
|
```
|
|
122
158
|
|
|
123
|
-
|
|
159
|
+
åæļå
ŧ厚 OpenCommit į `.opencommitignore`īŧ两č
éŊäŧč¯ģåīŧã
|
|
124
160
|
|
|
125
|
-
|
|
161
|
+
### 常č§éŽéĸ
|
|
162
|
+
|
|
163
|
+
**1) 401 / API Key æ æ**
|
|
164
|
+
- å
įįæé
įŊŽīŧ`git-ai config get --json --local`
|
|
165
|
+
- åæŖæĨį¯åĸå鿝åĻčĻįīŧ`GIT_AI_API_KEY / DEEPSEEK_API_KEY / OPENAI_API_KEY / OCO_API_KEY`
|
|
126
166
|
|
|
127
|
-
|
|
128
|
-
-
|
|
129
|
-
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
-
|
|
133
|
-
- **AI æĨå**īŧæĨæĨ/卿Ĩ/PR/Release Notes ä¸éŽįæ
|
|
167
|
+
**2) Diff čĸ̿ǿ**
|
|
168
|
+
- éčŋ `.git-aiignore` / `.opencommitignore` åŋŊįĨ大æäģļīŧlock/build/mapīŧ
|
|
169
|
+
- æčŽžįŊŽ `GIT_AI_MAX_DIFF_CHARS`īŧäšå
ŧ厚 `OCO_TOKENS_MAX_INPUT`īŧ
|
|
170
|
+
|
|
171
|
+
**3) Agent čĒå¨åéå°åēįĄæ¨Ąåŧ**
|
|
172
|
+
- 莞įŊŽ `GIT_AI_DEBUG=1` å¯äģĨįå°åéåå īŧčļ
æļ/éæĩ/é´æįīŧ
|
|
134
173
|
|
|
135
174
|
---
|
|
136
175
|
|
|
137
|
-
##
|
|
138
|
-
|
|
139
|
-
###
|
|
140
|
-
|
|
141
|
-
- `locale`: `zh` / `en`
|
|
142
|
-
- `outputFormat`: `text` / `json`
|
|
143
|
-
- `rulesPreset`: `conventional` / `angular` / `minimal`
|
|
144
|
-
- `fallbackModels`: ä¸ģæ¨Ąåå¤ąč´Ĩæļįå鿍Ąåå襨
|
|
145
|
-
- `policy.strict`: æ¯åĻéģæä¸åč§æäē¤
|
|
146
|
-
- `rules`: æäē¤č§čīŧįąģåãscopeãéŋåēĻãissue įīŧ
|
|
147
|
-
- `branch`: 忝č§čīŧįąģåãpatternãéŋåēĻįīŧ
|
|
148
|
-
|
|
149
|
-
### č§åä¸įįĨ
|
|
150
|
-
- `issuePattern`: äģģåĄåˇæŖåīŧåĻ `PROJ-123` / `#123`īŧ
|
|
151
|
-
- `issuePlacement`: `scope | subject | footer`
|
|
152
|
-
- `requireIssue`: æ¯åĻåŋ
éĄģå
åĢäģģåĄåˇ
|
|
153
|
-
- `policy.strict`: ä¸åč§åéģææäē¤
|
|
154
|
-
- `branch.pattern`: åæ¯æ¨ĄæŋīŧåĻ `{type}/{issue?}{name}`īŧ
|
|
155
|
-
- `branch.types`: 忝įąģåå襨
|
|
156
|
-
- `branch.issueSeparator`: issue åéįŦĻīŧéģ莤 `-`īŧ
|
|
157
|
-
- `branch.nameMaxLength`: 忝åéŋåēĻä¸é
|
|
158
|
-
|
|
159
|
-
### CLI 莞įŊŽīŧå¯čæŦåīŧ
|
|
176
|
+
## đ äŊŋ፿šåŧ
|
|
177
|
+
|
|
178
|
+
### å翝ä¸īŧäē¤äēåŧæäē¤ (Interactive)
|
|
179
|
+
|
|
160
180
|
```bash
|
|
161
|
-
|
|
162
|
-
git-ai
|
|
181
|
+
git add .
|
|
182
|
+
git-ai
|
|
183
|
+
```
|
|
163
184
|
|
|
164
|
-
|
|
165
|
-
git-ai config set rulesPreset conventional
|
|
166
|
-
git-ai config set policy '{"strict":true}'
|
|
167
|
-
git-ai config set fallbackModels "deepseek-chat,qwen-turbo"
|
|
185
|
+
### å翝äēīŧCopilot æēčŊåŽæ¤æ¨Ąåŧ đ æ¨č
|
|
168
186
|
|
|
169
|
-
|
|
170
|
-
git
|
|
171
|
-
git-ai
|
|
187
|
+
```bash
|
|
188
|
+
git add .
|
|
189
|
+
git-ai --copilot
|
|
190
|
+
# 1. äŊŋ፠DeepSeek/Ollama įæä¸ä¸ commit message
|
|
191
|
+
# 2. GitHub Copilot CLI æˇąåēĻåæäģŖį åŊąå
|
|
192
|
+
# 3. åąį¤ēéŖéŠæį¤ēåæĩč¯åģē莎
|
|
193
|
+
# 4. įĄŽčŽ¤åæäē¤
|
|
194
|
+
```
|
|
172
195
|
|
|
173
|
-
|
|
174
|
-
git-ai config set branch '{"types":["feat","fix"],"pattern":"{type}/{issue?}{name}"}'
|
|
196
|
+
**čžåēį¤ēäžīŧ**
|
|
175
197
|
```
|
|
198
|
+
⨠Generated commit message(s):
|
|
176
199
|
|
|
177
|
-
|
|
200
|
+
feat(auth): implement JWT token refresh mechanism
|
|
178
201
|
|
|
179
|
-
|
|
202
|
+
đ Impact Analysis:
|
|
203
|
+
Modified authentication flow to support automatic token refresh
|
|
180
204
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
| `git-ai config get/set/describe` | é
įŊŽįŽĄį |
|
|
185
|
-
| `git-ai` / `git-ai commit` | äē¤äēåŧæäē¤ |
|
|
186
|
-
| `git-ai -a` | Agent æ¨Ąåŧ |
|
|
187
|
-
| `git-ai msg` | äģ
čžåēæļæ¯īŧčæŦ/Hookīŧ |
|
|
188
|
-
| `git-ai branch` | äē¤äēåŧååģē忝 |
|
|
189
|
-
| `git-ai hook install/remove` | Git Hook įŽĄį |
|
|
190
|
-
| `git-ai report` | įæ AI 卿Ĩ |
|
|
191
|
-
| `git-ai pr` | įæ PR æčŋ° |
|
|
192
|
-
| `git-ai release` | įæ Release Notes |
|
|
205
|
+
â ī¸ Potential Risks:
|
|
206
|
+
âĸ Breaking change: Old tokens will be invalidated
|
|
207
|
+
âĸ Session management logic needs update
|
|
193
208
|
|
|
194
|
-
|
|
209
|
+
đ Affected Areas:
|
|
210
|
+
âĸ Login component
|
|
211
|
+
âĸ API middleware
|
|
212
|
+
âĸ User session store
|
|
195
213
|
|
|
196
|
-
|
|
214
|
+
â
Test Recommendations:
|
|
215
|
+
âĸ Test token expiration handling
|
|
216
|
+
âĸ Verify refresh token rotation
|
|
217
|
+
âĸ Check concurrent request handling
|
|
218
|
+
```
|
|
197
219
|
|
|
198
|
-
|
|
199
|
-
- `GIT_AI_API_KEY`īŧäšæ¯æ `DEEPSEEK_API_KEY`, `OPENAI_API_KEY`īŧ
|
|
200
|
-
- `GIT_AI_TIMEOUT_MS`
|
|
201
|
-
- `GIT_AI_MAX_DIFF_CHARS` / `GIT_AI_MAX_OUTPUT_TOKENS`
|
|
202
|
-
- `GIT_AI_RULES_PRESET`
|
|
203
|
-
- `GIT_AI_FALLBACK_MODELS`
|
|
204
|
-
- `GIT_AI_POLICY_STRICT`
|
|
205
|
-
- `GIT_AI_ISSUE_PATTERN` / `GIT_AI_ISSUE_PLACEMENT` / `GIT_AI_REQUIRE_ISSUE`
|
|
206
|
-
- `GIT_AI_OUTPUT_FORMAT=json`
|
|
207
|
-
- `GIT_AI_MSG_DELIM=<<<GIT_AI_END>>>`
|
|
208
|
-
- `GIT_AI_HOOK_STRICT=1` / `GIT_AI_HOOK_FALLBACK=0`
|
|
209
|
-
- `GIT_AI_BRANCH_PATTERN` / `GIT_AI_BRANCH_TYPES`
|
|
210
|
-
- `GIT_AI_BRANCH_ISSUE_SEPARATOR` / `GIT_AI_BRANCH_NAME_MAXLEN`
|
|
220
|
+
### å翝ä¸īŧGit Flow æäŊŗåŽčˇĩ (Hook)
|
|
211
221
|
|
|
212
|
-
|
|
222
|
+
čŋæ¯ææĩį
įäŊéĒãäŊ ä¸éčĻæšåäģģäŊäš æ¯īŧåĒé䏿ŦĄåŽčŖ
īŧ
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
# å¨åŊå饚įŽåŽčŖ
|
|
226
|
+
git-ai hook install
|
|
213
227
|
|
|
214
|
-
|
|
228
|
+
# æč
å
¨åąåŽčŖ
īŧææéĄšįŽįæīŧ
|
|
229
|
+
git-ai hook install --global
|
|
230
|
+
```
|
|
215
231
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
232
|
+
**äšååĒéīŧ**
|
|
233
|
+
```bash
|
|
234
|
+
git checkout -b feature/awesome-login
|
|
235
|
+
# ... åäģŖį ...
|
|
236
|
+
git add .
|
|
237
|
+
git commit # ⨠AI čĒå¨å¸ŽäŊ ååĨŊäē "feat(login): implement awesome login logic"
|
|
220
238
|
```
|
|
221
239
|
|
|
222
|
-
|
|
240
|
+
### å翝åīŧįæå¨æĨ (Report)
|
|
223
241
|
|
|
224
|
-
|
|
242
|
+
æ¯éĸå¨äē䏿ŗå卿Ĩīŧ
|
|
225
243
|
|
|
226
|
-
|
|
244
|
+
```bash
|
|
245
|
+
# įææŦ卿ĨæĨ/卿Ĩ
|
|
246
|
+
git-ai report
|
|
227
247
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
- æŖæĨį¯åĸå鿝åĻčĻį
|
|
248
|
+
# įææčŋ 30 å¤ŠįæąæĨ
|
|
249
|
+
git-ai report --days 30
|
|
231
250
|
|
|
232
|
-
|
|
233
|
-
-
|
|
234
|
-
|
|
251
|
+
# äģâ䏿ŦĄ tagâå°åŊåäģŖį įæįæŦåčŊæčŋ°
|
|
252
|
+
git-ai report --from-last-tag
|
|
253
|
+
|
|
254
|
+
# æåŽ tag čå´įæåå¸č¯´æīŧäžåĻ v1.0.21 -> v2.0.0īŧ
|
|
255
|
+
git-ai report --from-tag v1.0.21 --to-ref v2.0.0
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## đ åŊäģ¤éæĨ
|
|
235
261
|
|
|
236
|
-
|
|
237
|
-
|
|
262
|
+
| åŊäģ¤ | åĢå | 蝴æ |
|
|
263
|
+
|------|------|------|
|
|
264
|
+
| `git-ai config` | `config` | **åå§åé
įŊŽ**īŧ莞įŊŽæ¨ĄåãKeyãč¯č¨īŧ |
|
|
265
|
+
| `git-ai config get` | | æĨįåŊåįæé
įŊŽīŧæ¯æ `--json` / `--local`īŧ |
|
|
266
|
+
| `git-ai config set <key> <value>` | | 莞įŊŽé
įŊŽīŧæ¯æ `--local` / `--json`īŧ |
|
|
267
|
+
| `git-ai config describe` | | æĨįå¯é
įŊŽéĄšä¸į¯åĸåéčĻį |
|
|
268
|
+
| `git-ai` | | äē¤äēåŧįæåšļæäē¤ |
|
|
269
|
+
| `git-ai --copilot` | | **Copilot åŽæ¤æ¨Ąåŧ** (äģŖį åŊąååæ & éŖéŠæŖæĩ) |
|
|
270
|
+
| `git-ai -a` | | **Agent æ¨Ąåŧ** (æˇąåēĻåæ & åŊąåæŖæĨ) |
|
|
271
|
+
| `git-ai -a --copilot` | | **įģææ¨Ąåŧ** (Agent + Copilot åéäŋé) |
|
|
272
|
+
| `git-ai -y` | | 莺čŋįĄŽčŽ¤į´æĨæäē¤ |
|
|
273
|
+
| `git-ai -n 3` | | įæ 3 æĄåéæļæ¯ |
|
|
274
|
+
| `git-ai -l en` | | åŧēåļčžåēč¯č¨īŧen/zhīŧ |
|
|
275
|
+
| `git-ai hook install` | | **åŽčŖ
Git Hook** (æ¯æ `--global`) |
|
|
276
|
+
| `git-ai hook remove` | | į§ģé¤ Git Hook |
|
|
277
|
+
| `git-ai report` | | **įæ AI 卿Ĩ / įæŦ蝴æ** (æ¯æ `--days` / `--from-last-tag` / `--from-tag --to-ref`) |
|
|
278
|
+
| `git-ai msg` | | äģ
čžåēæļæ¯īŧäžčæŦč°į¨īŧ |
|
|
238
279
|
|
|
239
280
|
---
|
|
240
281
|
|
|
@@ -242,18 +283,20 @@ dist/
|
|
|
242
283
|
|
|
243
284
|
| įąģå | æåĄå | äŧåŋ | é
įŊŽæšåŧ |
|
|
244
285
|
|------|--------|------|----------|
|
|
245
|
-
| **æŦå°éį§** | **Ollama** |
|
|
286
|
+
| **æŦå°éį§** | **Ollama** | å
č´šãįĻģįēŋãįģ寚éį§ | `git-ai config` čĒ卿ĸæĩ |
|
|
246
287
|
| | **LM Studio** | å
ŧ厚æ§åĨŊ | æå¨čžå
Ĩ URL |
|
|
247
|
-
| **åŊå
éĢé** | **DeepSeek** |
|
|
248
|
-
| | **éäšåéŽ** |
|
|
249
|
-
| | **æēč°ą/Moonshot** |
|
|
288
|
+
| **åŊå
éĢé** | **DeepSeek** | **æ§ä쎿¯äšį**īŧäģŖį čŊåæåŧē | API Key |
|
|
289
|
+
| | **éäšåéŽ** | éŋéįæīŧéŋææŦčŊååŧē | API Key |
|
|
290
|
+
| | **æēč°ą/Moonshot** | åŊå
ä¸ģæĩæ¨Ąå | API Key |
|
|
250
291
|
| **åŊé
éį¨** | **OpenAI** | GPT-4o åēåčŊå | API Key |
|
|
251
292
|
|
|
252
293
|
---
|
|
253
294
|
|
|
295
|
+
|
|
296
|
+
|
|
254
297
|
## đ License
|
|
255
298
|
|
|
256
|
-
[
|
|
299
|
+
[Apache 2.0](LICENSE)
|
|
257
300
|
|
|
258
301
|
---
|
|
259
302
|
|
package/bin/git-ai.cjs
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const os = require('os');
|
|
6
|
+
const { spawn } = require('child_process');
|
|
7
|
+
|
|
8
|
+
// Detect platform and architecture
|
|
9
|
+
const platform = os.platform();
|
|
10
|
+
const arch = os.arch();
|
|
11
|
+
|
|
12
|
+
// Map Node.js platform/arch to our naming convention
|
|
13
|
+
const platformMap = {
|
|
14
|
+
'linux-x64': 'linux-x64',
|
|
15
|
+
'linux-arm64': 'linux-arm64',
|
|
16
|
+
'darwin-x64': 'darwin-x64',
|
|
17
|
+
'darwin-arm64': 'darwin-arm64',
|
|
18
|
+
'win32-x64': 'win32-x64',
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const key = `${platform}-${arch}`;
|
|
22
|
+
const platformKey = platformMap[key];
|
|
23
|
+
|
|
24
|
+
if (!platformKey) {
|
|
25
|
+
console.error(`Error: Unsupported platform: ${platform} ${arch}`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Find the binary from the platform-specific package
|
|
30
|
+
const packageName = `@dongowu/git-ai-cli-${platformKey}`;
|
|
31
|
+
const nodeModulesPath = path.join(__dirname, '..', 'node_modules');
|
|
32
|
+
const binaryName = platform === 'win32' ? 'git-ai.exe' : 'git-ai';
|
|
33
|
+
const binaryPath = path.join(nodeModulesPath, packageName, 'bin', binaryName);
|
|
34
|
+
|
|
35
|
+
// Check if binary exists
|
|
36
|
+
if (!fs.existsSync(binaryPath)) {
|
|
37
|
+
console.error(`Error: Binary not found at ${binaryPath}`);
|
|
38
|
+
console.error(`Please ensure the ${packageName} package is installed.`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Spawn the binary with all arguments
|
|
43
|
+
const child = spawn(binaryPath, process.argv.slice(2), {
|
|
44
|
+
stdio: 'inherit',
|
|
45
|
+
shell: false,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Forward exit code
|
|
49
|
+
child.on('exit', (code) => {
|
|
50
|
+
process.exit(code || 0);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// Handle errors
|
|
54
|
+
child.on('error', (err) => {
|
|
55
|
+
console.error(`Error executing binary: ${err.message}`);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
});
|
package/install.cjs
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const os = require('os');
|
|
6
|
+
const { spawnSync } = require('child_process');
|
|
7
|
+
|
|
8
|
+
// Detect platform and architecture
|
|
9
|
+
const platform = os.platform();
|
|
10
|
+
const arch = os.arch();
|
|
11
|
+
|
|
12
|
+
// Map Node.js platform/arch to our naming convention
|
|
13
|
+
const platformMap = {
|
|
14
|
+
'linux-x64': 'linux-x64',
|
|
15
|
+
'linux-arm64': 'linux-arm64',
|
|
16
|
+
'darwin-x64': 'darwin-x64',
|
|
17
|
+
'darwin-arm64': 'darwin-arm64',
|
|
18
|
+
'win32-x64': 'win32-x64',
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const key = platform + '-' + arch;
|
|
22
|
+
const platformKey = platformMap[key];
|
|
23
|
+
const npmjsRegistry = 'https://registry.npmjs.org/';
|
|
24
|
+
|
|
25
|
+
if (!platformKey) {
|
|
26
|
+
console.error('Unsupported platform: ' + platform + ' ' + arch);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Try to find the binary from the platform-specific package
|
|
31
|
+
const packageName = '@dongowu/git-ai-cli-' + platformKey;
|
|
32
|
+
const nodeModulesPath = path.join(__dirname, 'node_modules');
|
|
33
|
+
const binaryName = platform === 'win32' ? 'git-ai.exe' : 'git-ai';
|
|
34
|
+
const binaryPath = path.join(nodeModulesPath, packageName, 'bin', binaryName);
|
|
35
|
+
|
|
36
|
+
function getRootPackageVersion() {
|
|
37
|
+
try {
|
|
38
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, 'package.json'), 'utf8'));
|
|
39
|
+
return pkg.version;
|
|
40
|
+
} catch (err) {
|
|
41
|
+
console.warn('Warning: Failed to read package version: ' + err.message);
|
|
42
|
+
return 'latest';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function installPlatformPackageFromNpmjs(packageSpec) {
|
|
47
|
+
const npmExecPath = process.env.npm_execpath;
|
|
48
|
+
let command = 'npm';
|
|
49
|
+
const args = [];
|
|
50
|
+
|
|
51
|
+
if (npmExecPath && npmExecPath.endsWith('.js')) {
|
|
52
|
+
command = process.execPath;
|
|
53
|
+
args.push(npmExecPath);
|
|
54
|
+
} else if (npmExecPath && fs.existsSync(npmExecPath)) {
|
|
55
|
+
command = npmExecPath;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
args.push(
|
|
59
|
+
'install',
|
|
60
|
+
'--no-save',
|
|
61
|
+
'--no-package-lock',
|
|
62
|
+
'--ignore-scripts',
|
|
63
|
+
'--registry',
|
|
64
|
+
npmjsRegistry,
|
|
65
|
+
packageSpec
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
const result = spawnSync(command, args, {
|
|
69
|
+
cwd: __dirname,
|
|
70
|
+
stdio: 'inherit',
|
|
71
|
+
env: process.env,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
return result.status === 0;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Check if binary exists
|
|
78
|
+
if (!fs.existsSync(binaryPath)) {
|
|
79
|
+
console.warn('Warning: Binary not found at ' + binaryPath);
|
|
80
|
+
|
|
81
|
+
const packageVersion = getRootPackageVersion();
|
|
82
|
+
const packageSpec = packageName + '@' + packageVersion;
|
|
83
|
+
|
|
84
|
+
console.warn('Trying to install ' + packageSpec + ' from ' + npmjsRegistry + '...');
|
|
85
|
+
|
|
86
|
+
const installed = installPlatformPackageFromNpmjs(packageSpec);
|
|
87
|
+
if (!installed || !fs.existsSync(binaryPath)) {
|
|
88
|
+
const detectedRegistry = process.env.npm_config_registry || 'unknown';
|
|
89
|
+
console.error('Failed to install ' + packageSpec + '.');
|
|
90
|
+
console.error('Detected npm registry: ' + detectedRegistry);
|
|
91
|
+
console.error('Please retry with: npm install -g @dongowu/git-ai-cli --registry=' + npmjsRegistry);
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
console.log('â
Installed missing platform package: ' + packageSpec);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Make binary executable on Unix-like systems
|
|
99
|
+
if (process.platform !== 'win32') {
|
|
100
|
+
try {
|
|
101
|
+
fs.chmodSync(binaryPath, 0o755);
|
|
102
|
+
} catch (err) {
|
|
103
|
+
console.warn('Warning: Could not make binary executable: ' + err.message);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
console.log('â
git-ai binary installed for ' + platformKey);
|