@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.
Files changed (82) hide show
  1. package/README.md +200 -157
  2. package/bin/git-ai.cjs +57 -0
  3. package/install.cjs +107 -0
  4. package/package.json +27 -28
  5. package/.claude/settings.local.json +0 -17
  6. package/CHANGELOG.md +0 -46
  7. package/README_EN.md +0 -264
  8. package/dist/cli.d.ts +0 -3
  9. package/dist/cli.d.ts.map +0 -1
  10. package/dist/cli.js +0 -17
  11. package/dist/cli.js.map +0 -1
  12. package/dist/cli_main.d.ts +0 -2
  13. package/dist/cli_main.d.ts.map +0 -1
  14. package/dist/cli_main.js +0 -255
  15. package/dist/cli_main.js.map +0 -1
  16. package/dist/commands/branch.d.ts +0 -11
  17. package/dist/commands/branch.d.ts.map +0 -1
  18. package/dist/commands/branch.js +0 -279
  19. package/dist/commands/branch.js.map +0 -1
  20. package/dist/commands/commit.d.ts +0 -9
  21. package/dist/commands/commit.d.ts.map +0 -1
  22. package/dist/commands/commit.js +0 -326
  23. package/dist/commands/commit.js.map +0 -1
  24. package/dist/commands/config.d.ts +0 -2
  25. package/dist/commands/config.d.ts.map +0 -1
  26. package/dist/commands/config.js +0 -164
  27. package/dist/commands/config.js.map +0 -1
  28. package/dist/commands/config_manage.d.ts +0 -14
  29. package/dist/commands/config_manage.d.ts.map +0 -1
  30. package/dist/commands/config_manage.js +0 -394
  31. package/dist/commands/config_manage.js.map +0 -1
  32. package/dist/commands/hook.d.ts +0 -5
  33. package/dist/commands/hook.d.ts.map +0 -1
  34. package/dist/commands/hook.js +0 -528
  35. package/dist/commands/hook.js.map +0 -1
  36. package/dist/commands/msg.d.ts +0 -20
  37. package/dist/commands/msg.d.ts.map +0 -1
  38. package/dist/commands/msg.js +0 -148
  39. package/dist/commands/msg.js.map +0 -1
  40. package/dist/commands/pr.d.ts +0 -8
  41. package/dist/commands/pr.d.ts.map +0 -1
  42. package/dist/commands/pr.js +0 -96
  43. package/dist/commands/pr.js.map +0 -1
  44. package/dist/commands/release.d.ts +0 -8
  45. package/dist/commands/release.d.ts.map +0 -1
  46. package/dist/commands/release.js +0 -95
  47. package/dist/commands/release.js.map +0 -1
  48. package/dist/commands/report.d.ts +0 -9
  49. package/dist/commands/report.d.ts.map +0 -1
  50. package/dist/commands/report.js +0 -162
  51. package/dist/commands/report.js.map +0 -1
  52. package/dist/types.d.ts +0 -46
  53. package/dist/types.d.ts.map +0 -1
  54. package/dist/types.js +0 -86
  55. package/dist/types.js.map +0 -1
  56. package/dist/utils/agent.d.ts +0 -5
  57. package/dist/utils/agent.d.ts.map +0 -1
  58. package/dist/utils/agent.js +0 -308
  59. package/dist/utils/agent.js.map +0 -1
  60. package/dist/utils/agent_lite.d.ts +0 -5
  61. package/dist/utils/agent_lite.d.ts.map +0 -1
  62. package/dist/utils/agent_lite.js +0 -263
  63. package/dist/utils/agent_lite.js.map +0 -1
  64. package/dist/utils/ai.d.ts +0 -43
  65. package/dist/utils/ai.d.ts.map +0 -1
  66. package/dist/utils/ai.js +0 -1103
  67. package/dist/utils/ai.js.map +0 -1
  68. package/dist/utils/config.d.ts +0 -11
  69. package/dist/utils/config.d.ts.map +0 -1
  70. package/dist/utils/config.js +0 -239
  71. package/dist/utils/config.js.map +0 -1
  72. package/dist/utils/git.d.ts +0 -42
  73. package/dist/utils/git.d.ts.map +0 -1
  74. package/dist/utils/git.js +0 -456
  75. package/dist/utils/git.js.map +0 -1
  76. package/dist/utils/update.d.ts +0 -4
  77. package/dist/utils/update.d.ts.map +0 -1
  78. package/dist/utils/update.js +0 -122
  79. package/dist/utils/update.js.map +0 -1
  80. package/release_notes.md +0 -9
  81. package/scripts/release.sh +0 -34
  82. 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="#-äŊŋį”¨æŒ‡å—æŽ¨čæĩį¨‹">äŊŋį”¨æŒ‡å—</a> â€ĸ
22
- <a href="#-配įŊŽ">配įŊŽ</a> â€ĸ
23
- <a href="#-å‘Ŋäģ¤é€ŸæŸĨ">å‘Ŋäģ¤</a>
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** 不åĒ是 Commit Message į”Ÿæˆå™¨īŧŒåŽƒæ˜¯äŊ įš„**全čƒŊ AI åŧ€å‘劊手**īŧšį†č§Ŗ diffã€č¯†åˆĢ分支意回、įģŸä¸€å›ĸé˜Ÿč§„čŒƒã€č‡ĒåŠ¨į”Ÿæˆå‘¨æŠĨ/PR/Release Notes。
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) 初始化 (č‡Ē动æŽĸæĩ‹æœŦåœ°æ¨Ąåž‹æˆ–é…įŊŽ API)
39
- git-ai init
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
- ```bash
52
- npm install -g @dongowu/git-ai-cli
53
- git-ai init
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": "en",
64
- "enableFooter": false,
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
- 3) **æ—Ĩ常提äē¤**
87
- ```bash
88
- git add .
89
- git-ai
90
- ```
114
+ č¯´æ˜Žīŧš
115
+ - `model`īŧšåŸēįĄ€æ¨Ąåŧį”Ÿæˆæäē¤äŋĄæ¯įš„æ¨Ąåž‹
116
+ - `agentModel`īŧšAgent æ¨Ąåŧīŧˆ`-a`īŧ‰ä¸“į”¨æ¨Ąåž‹īŧˆåģēčŽŽé€‰æ‹Šį¨ŗåŽšæ”¯æŒ tools įš„æ¨Ąåž‹īŧ›DeepSeek 叏ᔍ `deepseek-chat`īŧ‰
117
+ - `locale`īŧšäģ…æ”¯æŒ `zh` / `en`
118
+ - `apiKey` åģē议通čŋ‡įޝåĸƒå˜é‡æˆ–å…¨åą€é…įŊŽčŽžįŊŽīŧŒä¸čĻæäē¤åˆ°äģ“åē“
91
119
 
92
- 4) **Hook 无感集成īŧˆåŧēįƒˆæŽ¨čīŧ‰**
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
- git-ai msg --json
104
- ```
123
+ # æŸĨįœ‹åŊ“å‰į”Ÿæ•ˆé…įŊŽīŧˆåŒ…åĢįŽ¯åĸƒå˜é‡čφᛖīŧ‰
124
+ git-ai config get --json
105
125
 
106
- 6) **创åģē分支īŧˆäē¤äē’åŧīŧ‰**
107
- ```bash
108
- git-ai branch
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
- 7) **PR / Release / Report**
112
- ```bash
113
- # PR 描čŋ°
114
- git-ai pr --base main --head HEAD
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
- # Release Notes
117
- git-ai release --from v1.0.0 --to HEAD
150
+ ### åŋŊį•Ĩ文äģļ `.git-aiignore`
151
+ åœ¨éĄšį›Žæ šį›ŽåŊ•创åģēīŧŒį”¨äēŽæŽ’é™¤ä¸æƒŗå‘é€įģ™ AI įš„æ–‡äģļīŧˆč¯­æŗ•同 `.gitignore`īŧ‰īŧš
118
152
 
119
- # 周æŠĨ
120
- git-ai report --days 7
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
- - **DeepSeek/Qwen æˇąåēĻäŧ˜åŒ–**īŧšį†č§Ŗæ„å›žč€Œä¸æ˜¯įŽ€å•įŋģ蝑 diff
128
- - **æœŦåœ°æ¨Ąåž‹éšį§äŧ˜å…ˆ**īŧšOllama / LM Studio åŗæ’åŗį”¨
129
- - **上下文感įŸĨ**īŧšåˆ†æ”¯č§„则、提äē¤éŖŽæ ŧå­Ļ䚠、æ™ēčƒŊ scope
130
- - **Agent æ™ēčƒŊäŊ“**īŧšå¤§æ”šåЍæ—ļč‡Ē动做åŊąå“åˆ†æž
131
- - **å›ĸé˜Ÿč§„åˆ™**īŧšč§„åˆ™æ¨Ąæŋ + åŧēæ Ąénjīŧˆpolicyīŧ‰
132
- - **Hook 集成**īŧšæ— æ„Ÿį”Ÿæˆæäē¤äŋĄæ¯
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
- ### éĄšį›Žįē§é…įŊŽ `.git-ai.json`
140
- - `provider / baseUrl / model / agentModel`
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 config get --json
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
- # 莞įŊŽč§„则īŧˆJSON 或 @文äģļīŧ‰
170
- git-ai config set rules '{"types":["feat","fix"]}'
171
- git-ai config set rules @rules.json --local
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
- | `git-ai init` | 初始化配įŊŽ |
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
- - `GIT_AI_PROVIDER` / `GIT_AI_BASE_URL` / `GIT_AI_MODEL` / `GIT_AI_AGENT_MODEL`
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
- ## 🧩 åŋŊį•Ĩ文äģļ `.git-aiignore`
228
+ # æˆ–č€…å…¨åą€åŽ‰čŖ…īŧˆæ‰€æœ‰éĄšį›Žį”Ÿæ•ˆīŧ‰
229
+ git-ai hook install --global
230
+ ```
215
231
 
216
- ```text
217
- package-lock.json
218
- dist/
219
- *.min.js
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
- 同æ—ļå…ŧ厚 OpenCommit įš„ `.opencommitignore`。
240
+ ### åœē景四īŧšį”Ÿæˆå‘¨æŠĨ (Report)
223
241
 
224
- ---
242
+ 每é€ĸ周äē”ä¸æƒŗå†™å‘¨æŠĨīŧŸ
225
243
 
226
- ## â“å¸¸č§é—Žéĸ˜
244
+ ```bash
245
+ # į”ŸæˆæœŦ周æ—ĨæŠĨ/周æŠĨ
246
+ git-ai report
227
247
 
228
- **1) 401 / API Key 无效**
229
- - å…ˆįœ‹é…įŊŽīŧš`git-ai config get --json --local`
230
- - æŖ€æŸĨįŽ¯åĸƒå˜é‡æ˜¯åĻčφᛖ
248
+ # į”Ÿæˆæœ€čŋ‘ 30 å¤Šįš„æą‡æŠĨ
249
+ git-ai report --days 30
231
250
 
232
- **2) Diff čĸĢæˆĒ断**
233
- - ᔍ `.git-aiignore` åŋŊį•Ĩ大文äģļ
234
- - æˆ–čŽžįŊŽ `GIT_AI_MAX_DIFF_CHARS`
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
- **3) Agent č‡Ē动回退**
237
- - 莞įŊŽ `GIT_AI_DEBUG=1` æŸĨįœ‹åŽŸå› 
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** | å…č´šã€įĻģįēŋã€éšį§ | `git-ai init` č‡Ē动æŽĸæĩ‹ |
286
+ | **æœŦ地隐ᧁ** | **Ollama** | å…č´šã€įĻģįēŋ、įģå¯šéšį§ | `git-ai config` č‡Ē动æŽĸæĩ‹ |
246
287
  | | **LM Studio** | å…ŧ厚性åĨŊ | æ‰‹åŠ¨čž“å…Ĩ URL |
247
- | **å›Ŋ内éĢ˜é€Ÿ** | **DeepSeek** | 性ä쎿¯”é̘ | API Key |
248
- | | **通䚉千闎** | é•ŋ文æœŦčƒŊ力åŧē | API Key |
249
- | | **æ™ēč°ą/Moonshot** | å›Ŋ内ä¸ģæĩ | API Key |
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
- [MIT](LICENSE)
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);