@mars167/git-ai 2.3.0
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/LICENSE +22 -0
- package/README.md +364 -0
- package/README.zh-CN.md +361 -0
- package/assets/hooks/post-checkout +28 -0
- package/assets/hooks/post-merge +28 -0
- package/assets/hooks/pre-commit +17 -0
- package/assets/hooks/pre-push +29 -0
- package/dist/bin/git-ai.js +62 -0
- package/dist/src/commands/ai.js +30 -0
- package/dist/src/commands/checkIndex.js +19 -0
- package/dist/src/commands/dsr.js +156 -0
- package/dist/src/commands/graph.js +203 -0
- package/dist/src/commands/hooks.js +125 -0
- package/dist/src/commands/index.js +92 -0
- package/dist/src/commands/pack.js +31 -0
- package/dist/src/commands/query.js +139 -0
- package/dist/src/commands/semantic.js +134 -0
- package/dist/src/commands/serve.js +14 -0
- package/dist/src/commands/status.js +78 -0
- package/dist/src/commands/trae.js +75 -0
- package/dist/src/commands/unpack.js +28 -0
- package/dist/src/core/archive.js +91 -0
- package/dist/src/core/astGraph.js +127 -0
- package/dist/src/core/astGraphQuery.js +142 -0
- package/dist/src/core/cozo.js +266 -0
- package/dist/src/core/cpg/astLayer.js +56 -0
- package/dist/src/core/cpg/callGraph.js +483 -0
- package/dist/src/core/cpg/cfgLayer.js +490 -0
- package/dist/src/core/cpg/dfgLayer.js +237 -0
- package/dist/src/core/cpg/index.js +80 -0
- package/dist/src/core/cpg/types.js +108 -0
- package/dist/src/core/crypto.js +10 -0
- package/dist/src/core/dsr/generate.js +308 -0
- package/dist/src/core/dsr/gitContext.js +74 -0
- package/dist/src/core/dsr/indexMaterialize.js +106 -0
- package/dist/src/core/dsr/paths.js +26 -0
- package/dist/src/core/dsr/query.js +73 -0
- package/dist/src/core/dsr/snapshotParser.js +73 -0
- package/dist/src/core/dsr/state.js +27 -0
- package/dist/src/core/dsr/types.js +2 -0
- package/dist/src/core/embedding/fusion.js +52 -0
- package/dist/src/core/embedding/index.js +43 -0
- package/dist/src/core/embedding/parser.js +14 -0
- package/dist/src/core/embedding/semantic.js +254 -0
- package/dist/src/core/embedding/structural.js +97 -0
- package/dist/src/core/embedding/symbolic.js +117 -0
- package/dist/src/core/embedding/tokenizer.js +91 -0
- package/dist/src/core/embedding/types.js +2 -0
- package/dist/src/core/embedding.js +36 -0
- package/dist/src/core/git.js +49 -0
- package/dist/src/core/gitDiff.js +73 -0
- package/dist/src/core/indexCheck.js +131 -0
- package/dist/src/core/indexer.js +185 -0
- package/dist/src/core/indexerIncremental.js +303 -0
- package/dist/src/core/indexing/config.js +51 -0
- package/dist/src/core/indexing/hnsw.js +568 -0
- package/dist/src/core/indexing/index.js +17 -0
- package/dist/src/core/indexing/monitor.js +82 -0
- package/dist/src/core/indexing/parallel.js +252 -0
- package/dist/src/core/lancedb.js +111 -0
- package/dist/src/core/lfs.js +27 -0
- package/dist/src/core/log.js +62 -0
- package/dist/src/core/manifest.js +88 -0
- package/dist/src/core/parser/adapter.js +2 -0
- package/dist/src/core/parser/c.js +93 -0
- package/dist/src/core/parser/chunkRelations.js +178 -0
- package/dist/src/core/parser/chunker.js +274 -0
- package/dist/src/core/parser/go.js +98 -0
- package/dist/src/core/parser/java.js +80 -0
- package/dist/src/core/parser/markdown.js +76 -0
- package/dist/src/core/parser/python.js +81 -0
- package/dist/src/core/parser/rust.js +103 -0
- package/dist/src/core/parser/typescript.js +98 -0
- package/dist/src/core/parser/utils.js +62 -0
- package/dist/src/core/parser/yaml.js +53 -0
- package/dist/src/core/parser.js +75 -0
- package/dist/src/core/paths.js +10 -0
- package/dist/src/core/repoMap.js +164 -0
- package/dist/src/core/retrieval/cache.js +31 -0
- package/dist/src/core/retrieval/classifier.js +74 -0
- package/dist/src/core/retrieval/expander.js +80 -0
- package/dist/src/core/retrieval/fuser.js +40 -0
- package/dist/src/core/retrieval/index.js +32 -0
- package/dist/src/core/retrieval/reranker.js +304 -0
- package/dist/src/core/retrieval/types.js +2 -0
- package/dist/src/core/retrieval/weights.js +42 -0
- package/dist/src/core/search.js +41 -0
- package/dist/src/core/sq8.js +65 -0
- package/dist/src/core/symbolSearch.js +143 -0
- package/dist/src/core/types.js +2 -0
- package/dist/src/core/workspace.js +116 -0
- package/dist/src/mcp/server.js +794 -0
- package/docs/README.md +44 -0
- package/docs/cross-encoder.md +157 -0
- package/docs/embedding.md +158 -0
- package/docs/logo.png +0 -0
- package/docs/windows-setup.md +67 -0
- package/docs/zh-CN/DESIGN.md +102 -0
- package/docs/zh-CN/README.md +46 -0
- package/docs/zh-CN/advanced.md +26 -0
- package/docs/zh-CN/architecture_explained.md +116 -0
- package/docs/zh-CN/cli.md +109 -0
- package/docs/zh-CN/dsr.md +91 -0
- package/docs/zh-CN/graph_scenarios.md +173 -0
- package/docs/zh-CN/hooks.md +14 -0
- package/docs/zh-CN/manifests.md +136 -0
- package/docs/zh-CN/mcp.md +205 -0
- package/docs/zh-CN/quickstart.md +35 -0
- package/docs/zh-CN/rules.md +7 -0
- package/docs/zh-CN/technical-details.md +454 -0
- package/docs/zh-CN/troubleshooting.md +19 -0
- package/docs/zh-CN/windows-setup.md +67 -0
- package/install.sh +183 -0
- package/package.json +97 -0
- package/skills/git-ai-mcp/SKILL.md +86 -0
- package/skills/git-ai-mcp/references/constraints.md +143 -0
- package/skills/git-ai-mcp/references/tools.md +263 -0
- package/templates/agents/common/documents/Fix EISDIR error and enable multi-language indexing.md +14 -0
- package/templates/agents/common/documents/Fix git-ai index error in CodaGraph directory.md +13 -0
- package/templates/agents/common/skills/git-ai-mcp/SKILL.md +86 -0
- package/templates/agents/common/skills/git-ai-mcp/references/constraints.md +143 -0
- package/templates/agents/common/skills/git-ai-mcp/references/tools.md +263 -0
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
# git-ai
|
|
2
|
+
|
|
3
|
+
[](https://github.com/mars167/git-ai-cli/actions/workflows/ci.yml)
|
|
4
|
+
[](https://github.com/mars167/git-ai-cli/actions/workflows/release.yml)
|
|
5
|
+
[](./LICENSE)
|
|
6
|
+
[](https://github.com/mars167/git-ai-cli/packages)
|
|
7
|
+
[](https://www.npmjs.com/package/%40mars167%2Fgit-ai)
|
|
8
|
+
|
|
9
|
+
**简体中文** | [English](./README.md)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 为代码库添加语义层,让 AI 从"读代码"进化到"懂代码"
|
|
14
|
+
|
|
15
|
+
**代码的语义,应该像代码本身一样版本化、可追溯**
|
|
16
|
+
|
|
17
|
+
git-ai 是一个本地代码理解工具,通过 DSR(确定性语义记录)和 Hyper RAG,为代码库构建可追溯的语义层,让 AI Agent 和开发者真正理解代码的演进与关系。
|
|
18
|
+
|
|
19
|
+
### ✨ 为什么选择 git-ai?
|
|
20
|
+
|
|
21
|
+
- **🔗 Hyper RAG**:融合向量检索 + 图检索 + DSR,多维度语义理解
|
|
22
|
+
- **📜 版本化语义**:每个提交都有语义快照,历史变更清晰可溯
|
|
23
|
+
- **🔄 随时可用**:索引随代码走,checkout 即可用,无需重建
|
|
24
|
+
- **🤖 AI 原生**:MCP Server 让 Claude、Trae 等 Agent 都能深度理解你的代码
|
|
25
|
+
- **🔒 完全本地**:代码永不离开你的机器,安全无忧
|
|
26
|
+
- **⚡ 全流程支持**:从开发到 Review 到重构,索引贯穿整个生命周期
|
|
27
|
+
- **📊 极速性能**:10k 文件索引 < 30 秒,搜索响应 < 100ms
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## ✨ 核心能力
|
|
32
|
+
|
|
33
|
+
### 1️⃣ 语义搜索
|
|
34
|
+
|
|
35
|
+
用自然语言找到代码,无需记忆文件名或函数名:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
git-ai ai semantic "用户认证逻辑"
|
|
39
|
+
git-ai ai semantic "数据库连接池配置"
|
|
40
|
+
git-ai ai semantic "错误处理中间件"
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### 2️⃣ 符号关系分析
|
|
44
|
+
|
|
45
|
+
理解代码之间的调用关系:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# 查找函数调用者
|
|
49
|
+
git-ai ai graph callers authenticateUser
|
|
50
|
+
|
|
51
|
+
# 查找函数调用的其他函数
|
|
52
|
+
git-ai ai graph callees authenticateUser
|
|
53
|
+
|
|
54
|
+
# 追踪完整调用链
|
|
55
|
+
git-ai ai graph chain authenticateUser --max-depth 3
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 3️⃣ 变更历史追溯
|
|
59
|
+
|
|
60
|
+
通过 DSR 追踪符号的历史演变:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# 查看函数的历史变更
|
|
64
|
+
git-ai ai dsr query symbol-evolution authenticateUser --limit 50
|
|
65
|
+
|
|
66
|
+
# 查看某个提交的完整语义快照
|
|
67
|
+
git-ai ai dsr context
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 4️⃣ 跨语言支持
|
|
71
|
+
|
|
72
|
+
支持多种主流编程语言:
|
|
73
|
+
|
|
74
|
+
| 语言 | 文件后缀 |
|
|
75
|
+
|------|----------|
|
|
76
|
+
| JavaScript | `.js`, `.jsx` |
|
|
77
|
+
| TypeScript | `.ts`, `.tsx` |
|
|
78
|
+
| Java | `.java` |
|
|
79
|
+
| Python | `.py` |
|
|
80
|
+
| Go | `.go` |
|
|
81
|
+
| Rust | `.rs` |
|
|
82
|
+
| C | `.c`, `.h` |
|
|
83
|
+
| Markdown | `.md`, `.mdx` |
|
|
84
|
+
| YAML | `.yml`, `.yaml` |
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 💡 设计理念
|
|
89
|
+
|
|
90
|
+
git-ai 不只是一个搜索工具,而是代码库的"语义时间线":
|
|
91
|
+
|
|
92
|
+
### DSR(Deterministic Semantic Record)
|
|
93
|
+
|
|
94
|
+
每个提交对应一份不可变的语义快照,记录当时的代码结构、符号关系、设计意图。代码的语义应该像代码本身一样版本化——可追溯、可比对、可演进。
|
|
95
|
+
|
|
96
|
+
### Hyper RAG
|
|
97
|
+
|
|
98
|
+
融合多种检索方式,让理解更深入:
|
|
99
|
+
- **向量检索**:语义相似度匹配
|
|
100
|
+
- **图检索**:调用关系、继承关系分析
|
|
101
|
+
- **DSR 检索**:历史演变追溯
|
|
102
|
+
|
|
103
|
+
### 去中心化语义
|
|
104
|
+
|
|
105
|
+
索引随代码走,不依赖中央服务器。checkout、branch、tag 都能立即使用一致的语义索引。
|
|
106
|
+
|
|
107
|
+
### Server 模式
|
|
108
|
+
|
|
109
|
+
MCP Server 让任何 AI Agent 都能调用索引,实现真正的 AI 辅助开发。
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 🎯 使用场景
|
|
114
|
+
|
|
115
|
+
### 场景 1:新人快速理解大型项目
|
|
116
|
+
|
|
117
|
+
> "刚加入团队,面对 10 万行代码,从哪里开始?"
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
# 1. 获取项目全局视图
|
|
121
|
+
git-ai ai repo-map --max-files 20
|
|
122
|
+
|
|
123
|
+
# 2. 搜索核心业务逻辑
|
|
124
|
+
git-ai ai semantic "订单处理流程"
|
|
125
|
+
|
|
126
|
+
# 3. 追踪关键函数调用链
|
|
127
|
+
git-ai ai graph chain processOrder --max-depth 5
|
|
128
|
+
```
|
|
129
|
+
*从设计到开发,语义索引始终如一*
|
|
130
|
+
|
|
131
|
+
### 场景 2:重构前的代码影响分析
|
|
132
|
+
|
|
133
|
+
> "要重构这个函数,会影响哪些地方?"
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
# 查找所有调用者
|
|
137
|
+
git-ai ai graph callers deprecatedFunction
|
|
138
|
+
|
|
139
|
+
# 追踪历史变更,了解设计意图
|
|
140
|
+
git-ai ai dsr query symbol-evolution deprecatedFunction --all
|
|
141
|
+
```
|
|
142
|
+
*DSR 追溯历史变更,理解设计意图*
|
|
143
|
+
|
|
144
|
+
### 场景 3:Bug 定位和根因分析
|
|
145
|
+
|
|
146
|
+
> "用户报告了一个错误,但不知道问题出在哪里"
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
# 搜索相关错误处理代码
|
|
150
|
+
git-ai ai semantic "用户登录失败处理"
|
|
151
|
+
|
|
152
|
+
# 查看错误传播路径
|
|
153
|
+
git-ai ai graph chain handleLoginError --direction upstream
|
|
154
|
+
```
|
|
155
|
+
*全流程索引,快速定位问题根源*
|
|
156
|
+
|
|
157
|
+
### 场景 4:AI Agent 辅助开发
|
|
158
|
+
|
|
159
|
+
> "让 Claude Desktop 帮我理解这个项目"
|
|
160
|
+
|
|
161
|
+
在 Claude Desktop 中配置 git-ai MCP Server 后,你可以直接对话:
|
|
162
|
+
|
|
163
|
+
> "帮我分析这个项目的架构,找出所有与支付相关的代码,并解释它们之间的关系"
|
|
164
|
+
|
|
165
|
+
Claude 会自动调用 git-ai 的工具,为你提供深入的分析。*让 AI 从"读代码"进化到"懂代码"*
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 🏗️ 系统架构
|
|
170
|
+
|
|
171
|
+
```mermaid
|
|
172
|
+
graph TB
|
|
173
|
+
A[Git 仓库] -->|每次提交| B["DSR (Deterministic Semantic Record)"]
|
|
174
|
+
B --> C[.git-ai/dsr/<commit>.json<br/>语义快照]
|
|
175
|
+
C -->|索引重建| D[LanceDB 向量库]
|
|
176
|
+
C -->|索引重建| E[CozoDB 图数据库]
|
|
177
|
+
D --> F[MCP Server]
|
|
178
|
+
E --> F
|
|
179
|
+
F -->|工具调用| G["AI Agent<br/>Claude Desktop / Trae"]
|
|
180
|
+
F -->|命令行| H[开发者]
|
|
181
|
+
C -->|跨版本| I{"语义时间线<br/>可追溯、可比对、可演进"}
|
|
182
|
+
|
|
183
|
+
style B fill:#e1f5ff
|
|
184
|
+
style C fill:#e8f5e9
|
|
185
|
+
style D fill:#fff4e1
|
|
186
|
+
style E fill:#fff4e1
|
|
187
|
+
style F fill:#e8f5e9
|
|
188
|
+
style G fill:#f3e5f5
|
|
189
|
+
style I fill:#fce4ec
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
**核心组件**:
|
|
193
|
+
|
|
194
|
+
- **DSR (Deterministic Semantic Record)**:按提交存储的不可变语义快照,版本化语义
|
|
195
|
+
- **LanceDB + SQ8**:高性能向量数据库,支持语义搜索
|
|
196
|
+
- **CozoDB**:图数据库,支持 AST 级关系查询
|
|
197
|
+
- **MCP Server**:标准协议接口,供 AI Agent 调用
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## 📊 与其他工具对比
|
|
202
|
+
|
|
203
|
+
| 特性 | git-ai | GitHub Code Search | Sourcegraph |
|
|
204
|
+
|------|--------|-------------------|-------------|
|
|
205
|
+
| 本地运行 | ✅ | ❌ | ❌ |
|
|
206
|
+
| AST 级分析 | ✅ | ❌ | ✅ |
|
|
207
|
+
| 版本化语义 | ✅ | ❌ | ❌ |
|
|
208
|
+
| 变更历史追溯 | ✅ | ❌ | ❌ |
|
|
209
|
+
| AI Agent 集成 | ✅ | ❌ | ❌ |
|
|
210
|
+
| 免费开源 | ✅ | ❌ | ❌ |
|
|
211
|
+
| 语义搜索 | ✅ | ✅ | ✅ |
|
|
212
|
+
| 调用链分析 | ✅ | ❌ | ✅ |
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## 🚀 快速开始
|
|
217
|
+
|
|
218
|
+
### 1. 安装
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
npm install -g git-ai
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### 2. 初始化仓库
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
cd your-project
|
|
228
|
+
git-ai ai index --overwrite
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### 3. 立即体验
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
# 用自然语言搜索代码
|
|
235
|
+
git-ai ai semantic "用户认证逻辑"
|
|
236
|
+
|
|
237
|
+
# 查看函数调用关系
|
|
238
|
+
git-ai ai graph callers authenticateUser
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
**实际输出示例**:
|
|
242
|
+
```json
|
|
243
|
+
[
|
|
244
|
+
{
|
|
245
|
+
"file": "src/auth/service.ts",
|
|
246
|
+
"line": 45,
|
|
247
|
+
"symbol": "authenticateUser",
|
|
248
|
+
"context": "async function authenticateUser(email: string, password: string)"
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"file": "src/controllers/auth.ts",
|
|
252
|
+
"line": 23,
|
|
253
|
+
"symbol": "loginHandler",
|
|
254
|
+
"context": "const user = await authenticateUser(req.body.email, req.body.password)"
|
|
255
|
+
}
|
|
256
|
+
]
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
就这么简单!3 步上手,立即开始深度理解你的代码库。
|
|
260
|
+
|
|
261
|
+
*从此,索引不再是"一次性产物",而是随代码演进的"语义资产"。*
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## 🤖 AI Agent 集成
|
|
266
|
+
|
|
267
|
+
git-ai 提供标准的 MCP Server,可与以下 AI Agent 无缝集成:
|
|
268
|
+
|
|
269
|
+
- **Claude Desktop**:最流行的本地 AI 编程助手
|
|
270
|
+
- **Trae**:强大的 AI 驱动 IDE
|
|
271
|
+
- **Continue.dev**:VS Code AI 插件
|
|
272
|
+
|
|
273
|
+
### Claude Desktop 配置示例
|
|
274
|
+
|
|
275
|
+
在 `~/.claude/claude_desktop_config.json` 中添加:
|
|
276
|
+
|
|
277
|
+
```json
|
|
278
|
+
{
|
|
279
|
+
"mcpServers": {
|
|
280
|
+
"git-ai": {
|
|
281
|
+
"command": "git-ai",
|
|
282
|
+
"args": ["ai", "serve"]
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
然后重启 Claude Desktop,即可开始对话:
|
|
289
|
+
|
|
290
|
+
> "帮我分析这个项目的架构,找出所有与支付相关的代码"
|
|
291
|
+
|
|
292
|
+
Claude 会自动调用 git-ai 的工具,为你提供深入的分析。
|
|
293
|
+
|
|
294
|
+
### Agent Skills & Rules
|
|
295
|
+
|
|
296
|
+
我们提供了精心设计的 Agent 模版,帮助 AI 更好地使用 git-ai:
|
|
297
|
+
|
|
298
|
+
- [Skill 模版](./templates/agents/common/skills/git-ai-mcp/SKILL.md):指导 Agent 如何使用工具
|
|
299
|
+
- [Rule 模版](./templates/agents/common/rules/git-ai-mcp/RULE.md):约束 Agent 的行为
|
|
300
|
+
|
|
301
|
+
Skills/Rules 文档(Markdown/YAML)会被纳入语义索引,便于通过 `semantic_search` 检索 MCP 指南。
|
|
302
|
+
|
|
303
|
+
一键安装到你的项目:
|
|
304
|
+
|
|
305
|
+
```bash
|
|
306
|
+
git-ai ai agent install
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
## 📚 文档
|
|
312
|
+
|
|
313
|
+
- [快速入门](./docs/zh-CN/README.md)
|
|
314
|
+
- [MCP Server 使用指南](./docs/zh-CN/mcp.md)
|
|
315
|
+
- [技术架构详解](./docs/zh-CN/architecture_explained.md)
|
|
316
|
+
- [设计文档](./docs/zh-CN/design.md)
|
|
317
|
+
- [开发指南](./DEVELOPMENT.zh-CN.md)
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
## 🔧 高级功能
|
|
322
|
+
|
|
323
|
+
### Git Hooks 自动化
|
|
324
|
+
|
|
325
|
+
自动在提交前重建索引,push 前打包校验:
|
|
326
|
+
|
|
327
|
+
```bash
|
|
328
|
+
git-ai ai hooks install
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
- `pre-commit`:自动增量索引 + 打包
|
|
332
|
+
- `pre-push`:校验索引归档
|
|
333
|
+
- `post-checkout`:自动解包索引
|
|
334
|
+
|
|
335
|
+
### Git LFS 集成
|
|
336
|
+
|
|
337
|
+
推荐使用 Git LFS 管理索引归档:
|
|
338
|
+
|
|
339
|
+
```bash
|
|
340
|
+
git lfs track ".git-ai/lancedb.tar.gz"
|
|
341
|
+
git-ai ai pack --lfs
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## 🤝 贡献
|
|
347
|
+
|
|
348
|
+
欢迎贡献代码、报告问题或提出建议!
|
|
349
|
+
|
|
350
|
+
- [贡献指南](./CONTRIBUTING.md)
|
|
351
|
+
- [问题追踪](https://github.com/mars167/git-ai-cli/issues)
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
|
|
355
|
+
## 📄 License
|
|
356
|
+
|
|
357
|
+
[MIT](./LICENSE)
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
**让 AI 从"读代码"进化到"懂代码"** ⭐ Star us on GitHub!
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
ROOT="$(git rev-parse --show-toplevel 2>/dev/null || true)"
|
|
5
|
+
if [ -z "$ROOT" ]; then
|
|
6
|
+
exit 0
|
|
7
|
+
fi
|
|
8
|
+
cd "$ROOT"
|
|
9
|
+
|
|
10
|
+
if [ ! -f ".git-ai/lancedb.tar.gz" ]; then
|
|
11
|
+
exit 0
|
|
12
|
+
fi
|
|
13
|
+
|
|
14
|
+
LFS_REQUIRED="$(git check-attr filter -- .git-ai/lancedb.tar.gz 2>/dev/null | grep -q 'filter: lfs' && echo 1 || echo 0)"
|
|
15
|
+
if [ "$LFS_REQUIRED" = "1" ]; then
|
|
16
|
+
if git lfs version >/dev/null 2>&1; then
|
|
17
|
+
git lfs post-checkout "$@"
|
|
18
|
+
else
|
|
19
|
+
echo "git-ai: repository requires git-lfs to fetch .git-ai/lancedb.tar.gz; please install git-lfs." 1>&2
|
|
20
|
+
exit 0
|
|
21
|
+
fi
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
if ! command -v git-ai >/dev/null 2>&1; then
|
|
25
|
+
exit 0
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
git-ai ai unpack -p "$ROOT" >/dev/null
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
ROOT="$(git rev-parse --show-toplevel 2>/dev/null || true)"
|
|
5
|
+
if [ -z "$ROOT" ]; then
|
|
6
|
+
exit 0
|
|
7
|
+
fi
|
|
8
|
+
cd "$ROOT"
|
|
9
|
+
|
|
10
|
+
if [ ! -f ".git-ai/lancedb.tar.gz" ]; then
|
|
11
|
+
exit 0
|
|
12
|
+
fi
|
|
13
|
+
|
|
14
|
+
LFS_REQUIRED="$(git check-attr filter -- .git-ai/lancedb.tar.gz 2>/dev/null | grep -q 'filter: lfs' && echo 1 || echo 0)"
|
|
15
|
+
if [ "$LFS_REQUIRED" = "1" ]; then
|
|
16
|
+
if git lfs version >/dev/null 2>&1; then
|
|
17
|
+
git lfs post-merge "$@"
|
|
18
|
+
else
|
|
19
|
+
echo "git-ai: repository requires git-lfs to fetch .git-ai/lancedb.tar.gz; please install git-lfs." 1>&2
|
|
20
|
+
exit 0
|
|
21
|
+
fi
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
if ! command -v git-ai >/dev/null 2>&1; then
|
|
25
|
+
exit 0
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
git-ai ai unpack -p "$ROOT" >/dev/null
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
ROOT="$(git rev-parse --show-toplevel 2>/dev/null || true)"
|
|
5
|
+
if [ -z "$ROOT" ]; then
|
|
6
|
+
exit 0
|
|
7
|
+
fi
|
|
8
|
+
cd "$ROOT"
|
|
9
|
+
|
|
10
|
+
if ! command -v git-ai >/dev/null 2>&1; then
|
|
11
|
+
exit 0
|
|
12
|
+
fi
|
|
13
|
+
|
|
14
|
+
git-ai ai index --incremental --staged -p "$ROOT" >/dev/null
|
|
15
|
+
git-ai ai pack -p "$ROOT" >/dev/null
|
|
16
|
+
|
|
17
|
+
git add .git-ai/meta.json .git-ai/lancedb.tar.gz || true
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
ROOT="$(git rev-parse --show-toplevel 2>/dev/null || true)"
|
|
5
|
+
if [ -z "$ROOT" ]; then
|
|
6
|
+
exit 0
|
|
7
|
+
fi
|
|
8
|
+
cd "$ROOT"
|
|
9
|
+
|
|
10
|
+
if ! command -v git-ai >/dev/null 2>&1; then
|
|
11
|
+
exit 0
|
|
12
|
+
fi
|
|
13
|
+
|
|
14
|
+
git-ai ai pack -p "$ROOT" >/dev/null
|
|
15
|
+
|
|
16
|
+
CHANGED="$(git status --porcelain -- .git-ai/lancedb.tar.gz 2>/dev/null || true)"
|
|
17
|
+
if [ -n "$CHANGED" ]; then
|
|
18
|
+
echo "git-ai: .git-ai/lancedb.tar.gz changed during pre-push; please commit it before pushing." 1>&2
|
|
19
|
+
exit 1
|
|
20
|
+
fi
|
|
21
|
+
|
|
22
|
+
LFS_REQUIRED="$(git check-attr filter -- .git-ai/lancedb.tar.gz 2>/dev/null | grep -q 'filter: lfs' && echo 1 || echo 0)"
|
|
23
|
+
if [ "$LFS_REQUIRED" = "1" ]; then
|
|
24
|
+
if ! git lfs version >/dev/null 2>&1; then
|
|
25
|
+
echo "git-ai: repository requires git-lfs to push LFS objects; please install git-lfs." 1>&2
|
|
26
|
+
exit 2
|
|
27
|
+
fi
|
|
28
|
+
git lfs pre-push "$@"
|
|
29
|
+
fi
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const child_process_1 = require("child_process");
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const ai_1 = require("../src/commands/ai");
|
|
12
|
+
function runGit(args) {
|
|
13
|
+
const res = (0, child_process_1.spawnSync)('git', args, { stdio: 'inherit' });
|
|
14
|
+
return res.status ?? 1;
|
|
15
|
+
}
|
|
16
|
+
function findPackageJson(startDir) {
|
|
17
|
+
let dir = startDir;
|
|
18
|
+
for (let i = 0; i < 10; i++) {
|
|
19
|
+
const candidate = path_1.default.join(dir, 'package.json');
|
|
20
|
+
if (fs_1.default.existsSync(candidate))
|
|
21
|
+
return candidate;
|
|
22
|
+
const parent = path_1.default.dirname(dir);
|
|
23
|
+
if (parent === dir)
|
|
24
|
+
break;
|
|
25
|
+
dir = parent;
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
function readVersionFromPackageJson() {
|
|
30
|
+
const pkgPath = findPackageJson(__dirname);
|
|
31
|
+
if (!pkgPath)
|
|
32
|
+
return '0.0.0';
|
|
33
|
+
try {
|
|
34
|
+
const raw = fs_1.default.readFileSync(pkgPath, 'utf-8');
|
|
35
|
+
const parsed = JSON.parse(raw);
|
|
36
|
+
return typeof parsed?.version === 'string' ? parsed.version : '0.0.0';
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return '0.0.0';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function main() {
|
|
43
|
+
const argv = process.argv;
|
|
44
|
+
const sub = argv[2];
|
|
45
|
+
const isHelpFlag = sub === '-h' || sub === '--help';
|
|
46
|
+
const isVersionFlag = sub === '-v' || sub === '--version';
|
|
47
|
+
const isAi = sub === 'ai';
|
|
48
|
+
if (sub && !isAi && !isHelpFlag && !isVersionFlag && sub !== 'help') {
|
|
49
|
+
const code = runGit(argv.slice(2));
|
|
50
|
+
process.exit(code);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const program = new commander_1.Command();
|
|
54
|
+
const version = readVersionFromPackageJson();
|
|
55
|
+
program
|
|
56
|
+
.name('git-ai')
|
|
57
|
+
.description('git-ai: git-compatible CLI with AI indexing tools')
|
|
58
|
+
.version(version);
|
|
59
|
+
program.addCommand(ai_1.aiCommand);
|
|
60
|
+
program.parse(argv);
|
|
61
|
+
}
|
|
62
|
+
main();
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.aiCommand = void 0;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const index_1 = require("./index");
|
|
6
|
+
const query_1 = require("./query");
|
|
7
|
+
const semantic_1 = require("./semantic");
|
|
8
|
+
const serve_1 = require("./serve");
|
|
9
|
+
const pack_1 = require("./pack");
|
|
10
|
+
const unpack_1 = require("./unpack");
|
|
11
|
+
const hooks_1 = require("./hooks");
|
|
12
|
+
const graph_1 = require("./graph");
|
|
13
|
+
const checkIndex_1 = require("./checkIndex");
|
|
14
|
+
const status_1 = require("./status");
|
|
15
|
+
const trae_1 = require("./trae");
|
|
16
|
+
const dsr_1 = require("./dsr");
|
|
17
|
+
exports.aiCommand = new commander_1.Command('ai')
|
|
18
|
+
.description('AI features (indexing, search, hooks, MCP)')
|
|
19
|
+
.addCommand(index_1.indexCommand)
|
|
20
|
+
.addCommand(checkIndex_1.checkIndexCommand)
|
|
21
|
+
.addCommand(status_1.statusCommand)
|
|
22
|
+
.addCommand(dsr_1.dsrCommand)
|
|
23
|
+
.addCommand(query_1.queryCommand)
|
|
24
|
+
.addCommand(semantic_1.semanticCommand)
|
|
25
|
+
.addCommand(graph_1.graphCommand)
|
|
26
|
+
.addCommand(pack_1.packCommand)
|
|
27
|
+
.addCommand(unpack_1.unpackCommand)
|
|
28
|
+
.addCommand(trae_1.agentCommand)
|
|
29
|
+
.addCommand(hooks_1.hooksCommand)
|
|
30
|
+
.addCommand(serve_1.serveCommand);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.checkIndexCommand = void 0;
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const git_1 = require("../core/git");
|
|
10
|
+
const indexCheck_1 = require("../core/indexCheck");
|
|
11
|
+
exports.checkIndexCommand = new commander_1.Command('check-index')
|
|
12
|
+
.description('Deprecated: use `git-ai ai status --json`')
|
|
13
|
+
.option('-p, --path <path>', 'Path inside the repository', '.')
|
|
14
|
+
.action(async (options) => {
|
|
15
|
+
const repoRoot = await (0, git_1.resolveGitRoot)(path_1.default.resolve(options.path));
|
|
16
|
+
const res = await (0, indexCheck_1.checkIndex)(repoRoot);
|
|
17
|
+
console.log(JSON.stringify({ repoRoot, ...res }, null, 2));
|
|
18
|
+
process.exit(res.ok ? 0 : 2);
|
|
19
|
+
});
|