autosnippet 1.2.17 → 1.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/README.md +114 -175
- package/bin/asnip.js +191 -116
- package/bin/create.js +79 -49
- package/bin/findPath.js +33 -2
- package/bin/init.js +2 -2
- package/bin/share.js +4 -3
- package/bin/ui.js +476 -0
- package/dashboard/index.html +23 -0
- package/dashboard/package-lock.json +3231 -0
- package/dashboard/package.json +28 -0
- package/dashboard/src/App.tsx +1045 -0
- package/dashboard/src/main.tsx +9 -0
- package/dashboard/src/types.ts +69 -0
- package/dashboard/tsconfig.json +22 -0
- package/dashboard/tsconfig.node.json +9 -0
- package/dashboard/vite.config.ts +13 -0
- package/lib/ai/AiFactory.js +29 -0
- package/lib/ai/AiProvider.js +27 -0
- package/lib/ai/candidateService.js +88 -0
- package/lib/ai/headerResolution.js +89 -0
- package/lib/ai/providers/GoogleGeminiProvider.js +157 -0
- package/lib/infra/paths.js +27 -1
- package/lib/injection/directiveParser.js +3 -3
- package/lib/snippet/markerLine.js +26 -0
- package/lib/snippet/snippetFactory.js +15 -4
- package/lib/snippet/snippetInstaller.js +5 -6
- package/lib/snippet/specRepository.js +158 -19
- package/lib/spm/spmDepMapUpdater.js +5 -1
- package/lib/spm/spmDepsService.js +5 -4
- package/lib/spm/targetScanner.js +113 -0
- package/lib/watch/fileWatcher.js +44 -3
- package/package.json +10 -5
- package/skills/README.md +77 -0
- package/ARCHITECTURE.md +0 -305
- package/SPEC_STORAGE_AND_SKILLS.md +0 -324
- package/TEST.md +0 -631
- package/scripts/test-cross-directory.js +0 -1101
package/README.md
CHANGED
|
@@ -1,267 +1,206 @@
|
|
|
1
1
|
# AutoSnippet
|
|
2
2
|
|
|
3
|
-
基于 SPM 的 iOS 模块 Snippet
|
|
3
|
+
基于 SPM 的 iOS 模块 Snippet 与 AI 知识库工具。将模块使用示范写入 Xcode CodeSnippets,支持分类检索、头文件注入,以及基于 AI 的知识沉淀与可视化管理。
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/autosnippet)
|
|
6
6
|
[](https://www.npmjs.com/package/autosnippet)
|
|
7
|
-
[](https://www.npmjs.com/package/autosnippet)
|
|
8
|
-
[](https://github.com/GxFn/AutoSnippet)
|
|
9
|
-
[](https://github.com/GxFn/AutoSnippet)
|
|
10
7
|
[](https://github.com/GxFn/AutoSnippet/blob/main/LICENSE)
|
|
11
8
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
模块开发者提供了Toast模块,可以将这一段使用代码写入模块的配置文件(参照下文命令)
|
|
15
|
-
|
|
16
|
-
```objectivec
|
|
17
|
-
[[ASUIKitAlertToast sharedInstance] alertWithMessage:@"<#object#>"];
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
模块被工程引入时,业务开发者可以在Xcode里,敲击`@toast`来获取这段标准的使用代码
|
|
21
|
-
|
|
22
|
-
Toast模块添加配置时可以选择分类,使用者可以通过`@view`或者`@tool`联想出同类别模块列表
|
|
23
|
-
|
|
24
|
-
代码量大的UI模块,能一键获取全部标准代码
|
|
9
|
+
---
|
|
25
10
|
|
|
26
11
|
## 安装
|
|
27
12
|
|
|
28
13
|
```bash
|
|
29
|
-
|
|
14
|
+
npm install -g autosnippet
|
|
30
15
|
```
|
|
31
16
|
|
|
32
17
|
## 快速开始
|
|
33
18
|
|
|
34
|
-
|
|
19
|
+
在**项目根目录**执行(需能找到 `AutoSnippetRoot.boxspec.json`,没有会自己创建,关键是首次创建一定要在根目录):
|
|
35
20
|
|
|
36
21
|
```bash
|
|
37
|
-
#
|
|
22
|
+
# 一键初始化
|
|
38
23
|
asd setup
|
|
39
24
|
|
|
40
|
-
#
|
|
41
|
-
asd
|
|
42
|
-
|
|
43
|
-
# 3) 安装到 Xcode CodeSnippets
|
|
44
|
-
asd install
|
|
45
|
-
|
|
46
|
-
# 4) 开启监听(用于头文件注入/依赖补齐/ALink 跳转)
|
|
47
|
-
asd watch
|
|
25
|
+
# 启动 Web 管理后台
|
|
26
|
+
asd ui
|
|
48
27
|
```
|
|
49
28
|
|
|
50
|
-
|
|
29
|
+
浏览器会自动打开 Dashboard,可在 **使用说明** 页查看完整说明。
|
|
30
|
+
|
|
31
|
+
---
|
|
51
32
|
|
|
52
|
-
|
|
53
|
-
- **`--yes`**:非交互模式;缺少必要输入会直接报错退出。
|
|
33
|
+
## AI 支持与配置
|
|
54
34
|
|
|
55
|
-
|
|
35
|
+
### 当前支持的 AI
|
|
56
36
|
|
|
57
|
-
|
|
37
|
+
| 提供商 | 默认模型 | 说明 |
|
|
38
|
+
|--------|----------|------|
|
|
39
|
+
| **Google Gemini** | `gemini-2.0-flash` | 用于 Snippet 提取、摘要、RAG 问答等 |
|
|
58
40
|
|
|
59
|
-
|
|
41
|
+
当前仅支持 **Google Gemini**。`asd create`、`asd ais`、Dashboard 的「按路径/剪贴板创建」与 AI Assistant 均使用该模型。
|
|
60
42
|
|
|
61
|
-
|
|
43
|
+
### 配置指南
|
|
62
44
|
|
|
63
|
-
|
|
45
|
+
**1. 必填:API Key**
|
|
64
46
|
|
|
65
|
-
在
|
|
47
|
+
在 [Google AI Studio](https://aistudio.google.com/) 申请 API Key,然后通过环境变量传入(勿写入仓库):
|
|
66
48
|
|
|
67
49
|
```bash
|
|
68
|
-
|
|
50
|
+
export ASD_GOOGLE_API_KEY="你的 API Key"
|
|
69
51
|
```
|
|
70
52
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
### init
|
|
74
|
-
|
|
75
|
-
在 Xcode 项目的spm模块目录执行此命令以创建模块工作空间:
|
|
53
|
+
或在项目根目录创建 `.env` 文件(已加入 `.gitignore`,勿提交):
|
|
76
54
|
|
|
77
55
|
```bash
|
|
78
|
-
|
|
56
|
+
# .env
|
|
57
|
+
ASD_GOOGLE_API_KEY=你的API_Key
|
|
79
58
|
```
|
|
80
59
|
|
|
81
|
-
|
|
60
|
+
**2. 可选:模型与提供商**
|
|
82
61
|
|
|
83
|
-
|
|
62
|
+
| 环境变量 | 说明 | 默认值 |
|
|
63
|
+
|----------|------|--------|
|
|
64
|
+
| `ASD_GOOGLE_API_KEY` | Google Gemini API Key(必填) | — |
|
|
65
|
+
| `ASD_AI_PROVIDER` | 提供商,目前仅 `google` | `google` |
|
|
66
|
+
| `ASD_AI_MODEL` | 模型名 | `gemini-2.0-flash` |
|
|
67
|
+
|
|
68
|
+
示例:使用 Pro 模型
|
|
84
69
|
|
|
85
70
|
```bash
|
|
86
|
-
|
|
71
|
+
export ASD_AI_MODEL="gemini-1.5-pro"
|
|
87
72
|
```
|
|
88
73
|
|
|
89
|
-
|
|
74
|
+
**3. 可选:代理**
|
|
90
75
|
|
|
91
|
-
|
|
76
|
+
若需走代理访问 Google API,可设置:
|
|
92
77
|
|
|
93
78
|
```bash
|
|
94
|
-
|
|
95
|
-
#
|
|
96
|
-
|
|
79
|
+
export https_proxy="http://127.0.0.1:7890"
|
|
80
|
+
# 或
|
|
81
|
+
export http_proxy="http://127.0.0.1:7890"
|
|
97
82
|
```
|
|
98
83
|
|
|
99
|
-
|
|
84
|
+
---
|
|
100
85
|
|
|
101
|
-
|
|
86
|
+
## Web Dashboard(asd ui)
|
|
102
87
|
|
|
103
|
-
|
|
104
|
-
// as:code
|
|
105
|
-
UIView *view = [[UIView alloc] init];
|
|
106
|
-
// as:code
|
|
107
|
-
```
|
|
88
|
+
启动后访问 `http://localhost:3000`,主要能力:
|
|
108
89
|
|
|
109
|
-
|
|
90
|
+
| 页面 | 说明 |
|
|
91
|
+
|------|------|
|
|
92
|
+
| **Snippets** | 查看、编辑、删除代码片段;同步到 Xcode |
|
|
93
|
+
| **Knowledge Base** | 管理 Markdown 技术文档(Skills),与 Snippet 关联 |
|
|
94
|
+
| **SPM Explorer** | 按 Target 扫描源码,AI 提取候选;从路径/剪贴板创建知识 |
|
|
95
|
+
| **Candidates** | 审核 CLI 批量扫描(`asd ais`)产生的候选,入库或忽略 |
|
|
96
|
+
| **AI Assistant** | 基于本地 Snippets/Skills 的 RAG 问答 |
|
|
97
|
+
| **使用说明** | 本说明的 Web 版,随 Dashboard 常驻 |
|
|
110
98
|
|
|
111
|
-
|
|
99
|
+
### 新建知识(与 CLI 对齐)
|
|
112
100
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
asd create --clipboard
|
|
101
|
+
- **按路径**:输入相对路径(如 `Sources/MyMod/Foo.m`)→ 扫描文件,AI 提取标题/摘要/触发键/头文件,审核后保存。
|
|
102
|
+
- **按剪贴板**:复制代码后点击「Use Copied Code」→ AI 分析并填充;若由 `// as:create` 打开会带当前文件路径,自动解析头文件。
|
|
116
103
|
|
|
117
|
-
|
|
118
|
-
asd c -p
|
|
104
|
+
### 头文件与标记
|
|
119
105
|
|
|
120
|
-
|
|
121
|
-
asd create --clipboard --lang swift
|
|
122
|
-
```
|
|
106
|
+
保存时可勾选「引入头文件」。会写入 `// as:include <TargetName/Header.h> path` 等标记,配合 `asd watch` 在编辑时自动注入 `#import`。
|
|
123
107
|
|
|
124
|
-
|
|
108
|
+
---
|
|
125
109
|
|
|
126
|
-
|
|
110
|
+
## 命令行
|
|
127
111
|
|
|
128
|
-
|
|
129
|
-
$ asd install
|
|
130
|
-
# 或短别名
|
|
131
|
-
$ asd i
|
|
132
|
-
```
|
|
112
|
+
### 常用
|
|
133
113
|
|
|
134
|
-
|
|
114
|
+
| 命令 | 说明 |
|
|
115
|
+
|------|------|
|
|
116
|
+
| `asd ui` | 启动 Web Dashboard |
|
|
117
|
+
| `asd create` | 从带 `// as:code` 的文件用 **AI** 提取并创建 Snippet(默认 AI 模式) |
|
|
118
|
+
| `asd create --clipboard` | 从剪贴板用 **AI** 创建;可选 `--path 相对路径` 解析头文件 |
|
|
119
|
+
| `asd create --no-ai` | 关闭 AI,使用传统交互/预置输入 |
|
|
120
|
+
| `asd install` / `asd i` | 将 Snippets 同步到 Xcode |
|
|
121
|
+
| `asd ais [Target]` | AI 扫描 SPM Target,结果进 Candidates,在 Dashboard 审核 |
|
|
122
|
+
| `asd watch` / `asd w` | 监听源码,执行头文件注入、ALink、`// as:create` 等 |
|
|
135
123
|
|
|
136
|
-
|
|
137
|
-
// view 是创建时输入的代码键
|
|
138
|
-
@view
|
|
139
|
-
```
|
|
124
|
+
### create 详解
|
|
140
125
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
共享本地代码片段:
|
|
126
|
+
**AI 模式(默认,与 Web 一致):**
|
|
144
127
|
|
|
145
128
|
```bash
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
$ asd s
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
### update
|
|
152
|
-
|
|
153
|
-
更新已创建的 snippet(按 trigger 查找,例如 `cover` 或 `@cover`):
|
|
154
|
-
|
|
155
|
-
```bash
|
|
156
|
-
asd update <word> [key] [value]
|
|
157
|
-
# 或短别名
|
|
158
|
-
asd u <word> [key] [value]
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
### watch
|
|
162
|
-
|
|
163
|
-
在模块化项目中监听文件变更,识别 `autosnippet:*` 指令并执行:
|
|
164
|
-
- 头文件注入(ObjC `#import` / Swift `import`)
|
|
165
|
-
- ALink 跳转
|
|
166
|
-
-(可选)SPM 依赖自动补齐(见下文)
|
|
129
|
+
# 从文件:选中含 // as:code 的文件,AI 分析代码并带头文件
|
|
130
|
+
asd create
|
|
167
131
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
#
|
|
171
|
-
|
|
132
|
+
# 从剪贴板
|
|
133
|
+
asd create --clipboard
|
|
134
|
+
asd create -p --path Sources/MyMod/Foo.m # 带头文件解析
|
|
135
|
+
asd create --clipboard --lang swift
|
|
172
136
|
```
|
|
173
137
|
|
|
174
|
-
|
|
138
|
+
**传统模式(预置或交互):**
|
|
175
139
|
|
|
176
140
|
```bash
|
|
177
|
-
|
|
178
|
-
asd
|
|
179
|
-
asd watch --file ./Services/Services/ASNetworkCheck/Code/ASSimplePing.m
|
|
180
|
-
|
|
181
|
-
# 降噪/退出时打印汇总
|
|
182
|
-
asd watch --quiet --summary
|
|
141
|
+
asd create --no-ai
|
|
142
|
+
asd --preset preset.json create
|
|
183
143
|
```
|
|
184
144
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
开启监听后,如果想要追加头文件,请执行以下操作:
|
|
188
|
-
|
|
189
|
-
1. 向下箭头选择代码片段的 headerVersion
|
|
190
|
-
2. 按 `Enter` 键
|
|
191
|
-
3. `Command + S` 保存文件
|
|
192
|
-
|
|
193
|
-
在 1 秒内,头文件会自动添加到文件头部。
|
|
145
|
+
**文件内标记:**
|
|
194
146
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
```
|
|
200
|
-
// as:include <ModuleName/Header.h> [optional/relative/path/Header.h]
|
|
147
|
+
```text
|
|
148
|
+
// as:code
|
|
149
|
+
UIView *view = [[UIView alloc] init];
|
|
150
|
+
// as:code
|
|
201
151
|
```
|
|
202
152
|
|
|
203
|
-
-
|
|
153
|
+
### ai-scan(Candidates)
|
|
204
154
|
|
|
155
|
+
```bash
|
|
156
|
+
asd ais <TargetName> # 扫描单个 Target
|
|
157
|
+
asd ais --all # 扫描全部
|
|
158
|
+
asd ais --batch 5 # 每批 5 个未扫描的 Target
|
|
205
159
|
```
|
|
206
|
-
// as:import ModuleName
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
#### 浏览器查看
|
|
210
160
|
|
|
211
|
-
|
|
161
|
+
结果写入 `Knowledge/.autosnippet/candidates.json`,在 Dashboard **Candidates** 页审核后入库或删除。
|
|
212
162
|
|
|
213
|
-
|
|
214
|
-
2. 输入 `#` 和 `ALink`
|
|
215
|
-
3. `Command + S` 保存文件
|
|
163
|
+
### watch 监听
|
|
216
164
|
|
|
217
|
-
|
|
165
|
+
- **头文件注入**:在 Xcode 中选中 Snippet 的 headerVersion,保存后自动在文件头部插入对应 `#import`。
|
|
166
|
+
- **ALink**:输入 `#模块键#ALink` 并保存,可打开配置的链接或 README。
|
|
167
|
+
- **// as:create**:在源码中写一行 `// as:create`,复制要提炼的代码到剪贴板并保存;watch 会打开 Dashboard 并带当前文件路径,用剪贴板 + 路径创建(自动解析头文件)。
|
|
218
168
|
|
|
219
|
-
|
|
169
|
+
### 标记格式
|
|
220
170
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
```
|
|
171
|
+
- ObjC 头文件:`// as:include <ModuleName/Header.h> [相对路径]`
|
|
172
|
+
- Swift:`// as:import ModuleName`
|
|
224
173
|
|
|
225
|
-
|
|
174
|
+
---
|
|
226
175
|
|
|
227
|
-
|
|
176
|
+
## 全局选项
|
|
228
177
|
|
|
229
|
-
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
- **`ASD_FIX_SPM_DEPS_MODE=fix`**:直接修改 `Package.swift` 自动补齐
|
|
178
|
+
- `--preset <path>`:预置输入 JSON(非交互/自动化)。
|
|
179
|
+
- `--yes`:非交互;缺必要输入则报错退出。
|
|
180
|
+
- 环境变量:`ASD_PRESET` / `ASD_TEST_PRESET` 指定预置路径。
|
|
233
181
|
|
|
234
|
-
|
|
235
|
-
- `AutoSnippet.spmmap.json`
|
|
182
|
+
---
|
|
236
183
|
|
|
237
|
-
##
|
|
184
|
+
## 其他命令
|
|
238
185
|
|
|
239
|
-
|
|
186
|
+
- `asd root`:在项目根创建/更新工作空间,聚合子模块 Snippet。
|
|
187
|
+
- `asd init`:在 SPM 模块目录创建模块工作空间。
|
|
188
|
+
- `asd setup`:等价于 `init` + `root`。
|
|
189
|
+
- `asd share`:共享本地 Snippet。
|
|
190
|
+
- `asd u <word> [key] [value]`:按 trigger 更新 Snippet 字段。
|
|
240
191
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
```
|
|
244
|
-
<#placeholder#>
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
例如:上面的占位符可以写成:
|
|
248
|
-
|
|
249
|
-
```
|
|
250
|
-
<#view: UIView#>
|
|
251
|
-
```
|
|
192
|
+
---
|
|
252
193
|
|
|
253
|
-
|
|
194
|
+
## 占位符
|
|
254
195
|
|
|
255
|
-
|
|
196
|
+
在 Snippet 代码中使用 `<#placeholder#>`,Xcode 会识别为占位符,用 Tab 切换。多相同占位符可用 ⌥⌘E 连续选择后统一修改。
|
|
256
197
|
|
|
257
|
-
|
|
258
|
-
2. `⌥⌘E` 选择下一个占位符,`⌥⇧⌘E` 选择上一个占位符
|
|
259
|
-
3. 输入修改的内容,所有选中的占位符都会被修改
|
|
198
|
+
---
|
|
260
199
|
|
|
261
|
-
##
|
|
200
|
+
## 贡献
|
|
262
201
|
|
|
263
|
-
欢迎提交
|
|
202
|
+
欢迎提交 Issue 与 Pull Request。
|
|
264
203
|
|
|
265
|
-
##
|
|
204
|
+
## 许可证
|
|
266
205
|
|
|
267
|
-
|
|
206
|
+
MIT,见 [LICENSE](LICENSE)。
|