@ibotor/smart-trellis 0.5.21 → 0.5.23
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 +255 -119
- package/dist/cli/smart.js +3 -1
- package/dist/cli/smart.js.map +1 -1
- package/dist/commands/smart-init.d.ts +4 -1
- package/dist/commands/smart-init.d.ts.map +1 -1
- package/dist/commands/smart-init.js +96 -1
- package/dist/commands/smart-init.js.map +1 -1
- package/dist/migrations/manifests/0.5.22.json +9 -0
- package/dist/templates/common/commands/joint-debugger.md +94 -2
- package/dist/templates/trellis/index.d.ts +1 -0
- package/dist/templates/trellis/index.d.ts.map +1 -1
- package/dist/templates/trellis/index.js +2 -0
- package/dist/templates/trellis/index.js.map +1 -1
- package/dist/templates/trellis/scripts/apifox_token.py +128 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,152 +1,192 @@
|
|
|
1
1
|
# Smart Trellis
|
|
2
2
|
|
|
3
|
-
`smart-trellis`
|
|
3
|
+
`smart-trellis` 是 Trellis 的智能初始化入口。它不替换 Trellis 的核心能力,而是在 `trellis init` 之前帮你做默认选择,减少初始化时的重复确认。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
这个 npm 包同时提供三个命令:
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
```text
|
|
8
|
+
smart-trellis # 智能初始化入口
|
|
9
|
+
trellis # 原 Trellis CLI
|
|
10
|
+
tl # trellis 的短别名
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
当前 npm latest:`0.5.22`。
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
- 自动开启非交互初始化,跳过 monorepo 和 spec source 的大量选择。
|
|
17
|
-
- 自动检测 monorepo 项目结构。
|
|
18
|
-
- 自动检测开发者名称,优先使用 `--user`,其次使用 `git config user.name`,最后使用系统用户名。
|
|
19
|
-
- 默认工具为 `codex,cursor`。
|
|
20
|
-
- 如果没有传 `--tools`、没有传具体工具参数、也没有传 `--yes`,只会弹出一次工具选择。
|
|
15
|
+
## 0.5.20 以来的功能迭代
|
|
21
16
|
|
|
22
|
-
|
|
17
|
+
| 版本 | 新增能力 | 解决的问题 | 怎么使用 |
|
|
18
|
+
| --- | --- | --- | --- |
|
|
19
|
+
| `0.5.20` | `trellis.activation_mode` | 有些团队希望 Trellis 不要自动接管普通开发对话,只在明确要求时启动 | 新项目用 `--trellis-activation explicit`;旧项目运行 `trellis update` 后在 `.trellis/config.yaml` 设置 |
|
|
20
|
+
| `0.5.21` | `trellis-joint-debugger` 联调入口 | 前后端联调时,只给 Apifox 链接就能进入接口分析流程 | Cursor 用 `/trellis-joint-debugger`,Codex / `.agents/skills` 用 `$trellis-joint-debugger` |
|
|
21
|
+
| `0.5.22` | Apifox Web API 联调流程 + 用户级 token 存储 | 自动解析 Apifox 接口详情、schema、入参/出参,并避免每个项目重复配置 token | 运行 `python3 ./.trellis/scripts/apifox_token.py save` 保存 token |
|
|
22
|
+
| 当前工作区 | `smart-trellis init` 生成目录写入 `.gitignore` 的多选项 | 初始化后可选择把 `.trellis/` 和 AI 工具配置目录加入 `.gitignore`,默认全选且不重复添加 | 交互初始化时选择目录;脚本模式用 `--gitignore-config` 或 `--no-gitignore-config` |
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
| --- | --- | --- |
|
|
26
|
-
| `trellis init` | 需要完整手动控制 Trellis 初始化选项 | 会询问 monorepo、每个包的 spec source、工具等 |
|
|
27
|
-
| `smart-trellis init` | 希望快速初始化一个项目,并保留 Trellis 原完整结构 | 通常只确认工具,或完全无交互 |
|
|
24
|
+
上面这些都是补丁级增强,没有破坏性迁移。已初始化项目通常只需要:
|
|
28
25
|
|
|
29
|
-
|
|
26
|
+
```bash
|
|
27
|
+
npm install -g @ibotor/smart-trellis@latest
|
|
28
|
+
trellis update
|
|
29
|
+
```
|
|
30
30
|
|
|
31
|
-
##
|
|
31
|
+
## 快速开始
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
新设备安装:
|
|
34
34
|
|
|
35
35
|
```bash
|
|
36
|
-
npm install -g @ibotor/smart-trellis
|
|
36
|
+
npm install -g @ibotor/smart-trellis@latest
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
进入项目根目录:
|
|
40
40
|
|
|
41
41
|
```bash
|
|
42
42
|
smart-trellis init
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
默认交互流程:
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
1. 选择要配置的 AI 工具。
|
|
48
|
+
2. 选择要加入 `.gitignore` 的生成目录,默认全选。
|
|
49
|
+
3. 选择 Trellis activation mode。
|
|
50
|
+
4. 调用原始 `trellis init`,生成 `.trellis/`、平台配置目录和 `AGENTS.md`。
|
|
50
51
|
|
|
51
|
-
|
|
52
|
+
如果你希望完全无交互,并使用默认工具 `codex,cursor`:
|
|
52
53
|
|
|
53
54
|
```bash
|
|
54
|
-
|
|
55
|
+
smart-trellis init --yes
|
|
55
56
|
```
|
|
56
57
|
|
|
57
|
-
|
|
58
|
+
`--yes` 会使用默认工具,并把 `.trellis/` 和默认工具生成的配置目录写入 `.gitignore`。
|
|
58
59
|
|
|
59
|
-
|
|
60
|
+
## 常用命令
|
|
61
|
+
|
|
62
|
+
### 指定工具
|
|
63
|
+
|
|
64
|
+
逗号形式:
|
|
60
65
|
|
|
61
66
|
```bash
|
|
62
|
-
smart-trellis init
|
|
67
|
+
smart-trellis init --tools codex,cursor,claude
|
|
63
68
|
```
|
|
64
69
|
|
|
65
|
-
|
|
70
|
+
独立参数形式:
|
|
66
71
|
|
|
67
72
|
```bash
|
|
68
|
-
smart-trellis init --
|
|
73
|
+
smart-trellis init --codex --cursor --claude
|
|
69
74
|
```
|
|
70
75
|
|
|
71
|
-
|
|
76
|
+
当前支持的工具名:
|
|
72
77
|
|
|
73
|
-
|
|
74
|
-
|
|
78
|
+
```text
|
|
79
|
+
claude
|
|
80
|
+
cursor
|
|
81
|
+
opencode
|
|
82
|
+
codex
|
|
83
|
+
kilo
|
|
84
|
+
kiro
|
|
85
|
+
gemini
|
|
86
|
+
antigravity
|
|
87
|
+
windsurf
|
|
88
|
+
qoder
|
|
89
|
+
codebuddy
|
|
90
|
+
copilot
|
|
91
|
+
droid
|
|
92
|
+
pi
|
|
93
|
+
```
|
|
75
94
|
|
|
76
|
-
|
|
95
|
+
### 指定开发者名称
|
|
77
96
|
|
|
78
97
|
```bash
|
|
79
|
-
smart-trellis init --tools codex,cursor
|
|
98
|
+
smart-trellis init --tools codex,cursor --user adong
|
|
80
99
|
```
|
|
81
100
|
|
|
82
|
-
|
|
101
|
+
如果不传 `--user`,会优先读取 `git config user.name`,再回退到系统用户名。
|
|
102
|
+
|
|
103
|
+
### 完全脚本化初始化
|
|
83
104
|
|
|
84
105
|
```bash
|
|
85
|
-
smart-trellis init
|
|
106
|
+
smart-trellis init \
|
|
107
|
+
--yes \
|
|
108
|
+
--user adong \
|
|
109
|
+
--trellis-activation explicit \
|
|
110
|
+
--gitignore-config
|
|
86
111
|
```
|
|
87
112
|
|
|
88
|
-
|
|
113
|
+
`smart-trellis init` 内部会把 Trellis 初始化切到非交互模式,相当于帮你执行一个带默认值的 `trellis init --yes ...`。
|
|
114
|
+
|
|
115
|
+
## Activation Mode
|
|
116
|
+
|
|
117
|
+
`0.5.20` 新增了 Trellis activation mode,用来控制“没有 active task 时,Trellis 是否主动接管”。
|
|
118
|
+
|
|
119
|
+
| 模式 | 行为 | 适合场景 |
|
|
120
|
+
| --- | --- | --- |
|
|
121
|
+
| `auto` | 默认行为。Trellis 会判断当前请求是否需要创建任务流程 | 希望 AI 自动进入 Trellis 工作流 |
|
|
122
|
+
| `explicit` | Trellis 保持空闲,除非用户明确说 `/trellis start`、`$trellis-start`、`走 Trellis` 等 | 希望普通问答和小改动不被流程接管 |
|
|
123
|
+
|
|
124
|
+
新项目直接指定:
|
|
89
125
|
|
|
90
126
|
```bash
|
|
91
127
|
smart-trellis init --tools codex,cursor --trellis-activation explicit
|
|
92
128
|
```
|
|
93
129
|
|
|
94
|
-
|
|
130
|
+
旧项目先更新模板:
|
|
95
131
|
|
|
96
132
|
```bash
|
|
97
|
-
trellis
|
|
133
|
+
trellis update
|
|
98
134
|
```
|
|
99
135
|
|
|
100
|
-
|
|
136
|
+
然后在 `.trellis/config.yaml` 中设置:
|
|
101
137
|
|
|
102
|
-
|
|
138
|
+
```yaml
|
|
139
|
+
trellis:
|
|
140
|
+
activation_mode: explicit
|
|
141
|
+
```
|
|
103
142
|
|
|
104
|
-
|
|
143
|
+
## `.gitignore` 生成目录选择
|
|
105
144
|
|
|
106
|
-
|
|
107
|
-
|
|
145
|
+
当前 `smart-trellis init` 会在选择工具之后,提示是否把生成目录加入 `.gitignore`。默认全选。
|
|
146
|
+
|
|
147
|
+
以 `codex,cursor` 为例,候选项通常是:
|
|
148
|
+
|
|
149
|
+
```text
|
|
150
|
+
.trellis/
|
|
151
|
+
.codex/
|
|
152
|
+
.agents/skills/
|
|
153
|
+
.cursor/
|
|
108
154
|
```
|
|
109
155
|
|
|
110
|
-
|
|
156
|
+
规则:
|
|
157
|
+
|
|
158
|
+
- 没有 `.gitignore` 时会创建。
|
|
159
|
+
- 已有 `.codex` 或 `.codex/` 时不会重复添加 `.codex/`。
|
|
160
|
+
- 已有 `.agents/` 时,不会再重复添加 `.agents/skills/`。
|
|
161
|
+
- 候选目录来自 Trellis 的 AI 工具注册表,不手写平台清单。
|
|
162
|
+
|
|
163
|
+
脚本模式下直接全选:
|
|
111
164
|
|
|
112
165
|
```bash
|
|
113
|
-
smart-trellis init --codex
|
|
166
|
+
smart-trellis init --tools codex,cursor --gitignore-config
|
|
114
167
|
```
|
|
115
168
|
|
|
116
|
-
|
|
169
|
+
完全不修改 `.gitignore`:
|
|
117
170
|
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
cursor
|
|
121
|
-
opencode
|
|
122
|
-
codex
|
|
123
|
-
kilo
|
|
124
|
-
kiro
|
|
125
|
-
gemini
|
|
126
|
-
antigravity
|
|
127
|
-
windsurf
|
|
128
|
-
qoder
|
|
129
|
-
codebuddy
|
|
130
|
-
copilot
|
|
131
|
-
droid
|
|
132
|
-
pi
|
|
171
|
+
```bash
|
|
172
|
+
smart-trellis init --tools codex,cursor --no-gitignore-config
|
|
133
173
|
```
|
|
134
174
|
|
|
135
|
-
|
|
175
|
+
注意:如果你把 `.trellis/` 加入 `.gitignore`,Trellis 的 spec、tasks、workspace 等状态默认不会被 Git 跟踪。适合把 Trellis 配置当本地工作区的团队;如果你的团队希望提交 `.trellis/spec/` 或任务记录,请在多选时取消 `.trellis/`。
|
|
136
176
|
|
|
137
|
-
|
|
177
|
+
## Registry 和模板
|
|
138
178
|
|
|
139
|
-
|
|
179
|
+
`smart-trellis init` 兼容原 `trellis init --registry` 能力,可以从自定义 GitHub、GitLab、Bitbucket 仓库拉取 spec。
|
|
140
180
|
|
|
141
|
-
|
|
181
|
+
直接下载 spec 目录:
|
|
142
182
|
|
|
143
183
|
```bash
|
|
144
|
-
smart-trellis init
|
|
184
|
+
smart-trellis init \
|
|
185
|
+
--tools codex,cursor \
|
|
186
|
+
--registry gh:myorg/myrepo/my-team-spec
|
|
145
187
|
```
|
|
146
188
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
如果 registry 目录里有 `index.json`,并且里面定义了多个模板,非交互模式下必须指定 `--template`:
|
|
189
|
+
Marketplace 模式指定模板:
|
|
150
190
|
|
|
151
191
|
```bash
|
|
152
192
|
smart-trellis init \
|
|
@@ -155,9 +195,7 @@ smart-trellis init \
|
|
|
155
195
|
--template my-template
|
|
156
196
|
```
|
|
157
197
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
### 指定分支
|
|
198
|
+
指定分支:
|
|
161
199
|
|
|
162
200
|
```bash
|
|
163
201
|
smart-trellis init \
|
|
@@ -165,110 +203,208 @@ smart-trellis init \
|
|
|
165
203
|
--registry gh:myorg/myrepo/specs#develop
|
|
166
204
|
```
|
|
167
205
|
|
|
168
|
-
|
|
206
|
+
GitLab 和 Bitbucket:
|
|
169
207
|
|
|
170
208
|
```bash
|
|
171
209
|
smart-trellis init --tools codex,cursor --registry gitlab:myorg/myrepo/specs
|
|
172
210
|
smart-trellis init --tools codex,cursor --registry bitbucket:myorg/myrepo/specs
|
|
173
211
|
```
|
|
174
212
|
|
|
175
|
-
|
|
213
|
+
远程模板写入策略:
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
smart-trellis init --tools codex,cursor --registry gh:myorg/myrepo/specs --overwrite
|
|
217
|
+
smart-trellis init --tools codex,cursor --registry gh:myorg/myrepo/specs --append
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## 文件覆盖和 Monorepo
|
|
176
221
|
|
|
177
|
-
|
|
222
|
+
默认写入策略偏安全:遇到已有文件会跳过,避免覆盖本地配置。
|
|
178
223
|
|
|
179
|
-
|
|
224
|
+
强制覆盖:
|
|
180
225
|
|
|
181
226
|
```bash
|
|
182
227
|
smart-trellis init --tools codex,cursor --force
|
|
183
228
|
```
|
|
184
229
|
|
|
185
|
-
|
|
230
|
+
明确跳过已有文件:
|
|
186
231
|
|
|
187
232
|
```bash
|
|
188
233
|
smart-trellis init --tools codex,cursor --skip-existing
|
|
189
234
|
```
|
|
190
235
|
|
|
191
|
-
|
|
236
|
+
Monorepo 默认自动检测。也可以手动指定:
|
|
192
237
|
|
|
193
238
|
```bash
|
|
194
|
-
smart-trellis init --tools codex,cursor --
|
|
195
|
-
smart-trellis init --tools codex,cursor --
|
|
239
|
+
smart-trellis init --tools codex,cursor --monorepo
|
|
240
|
+
smart-trellis init --tools codex,cursor --no-monorepo
|
|
196
241
|
```
|
|
197
242
|
|
|
198
|
-
##
|
|
243
|
+
## 初始化后会生成什么
|
|
199
244
|
|
|
200
|
-
|
|
245
|
+
根据工具不同,生成内容会略有差异。常见输出包括:
|
|
201
246
|
|
|
202
|
-
|
|
247
|
+
| 路径 | 作用 |
|
|
248
|
+
| --- | --- |
|
|
249
|
+
| `.trellis/` | Trellis workflow、spec、tasks、workspace、脚本等核心目录 |
|
|
250
|
+
| `.agents/skills/` | 跨工具复用的 Trellis skills,Codex/Gemini/Copilot 等可读取 |
|
|
251
|
+
| `.codex/` | Codex 专用配置、agents、hooks、skills |
|
|
252
|
+
| `.cursor/` | Cursor 专用 commands、skills、agents、hooks |
|
|
253
|
+
| `.github/` | GitHub Copilot prompts、agents、hooks 等 |
|
|
254
|
+
| `AGENTS.md` | 项目级 AI 助手协作说明 |
|
|
203
255
|
|
|
204
|
-
|
|
205
|
-
smart-trellis init --tools codex,cursor --monorepo
|
|
206
|
-
```
|
|
256
|
+
`smart-trellis init` 的目标不是生成一个轻量配置,而是用更少确认步骤生成完整 Trellis 项目结构。
|
|
207
257
|
|
|
208
|
-
|
|
258
|
+
## Apifox 前后端联调
|
|
209
259
|
|
|
210
|
-
|
|
211
|
-
|
|
260
|
+
`0.5.21` 新增了 `trellis-joint-debugger`,`0.5.22` 将它扩展为 Apifox Web API 驱动的联调流程。
|
|
261
|
+
|
|
262
|
+
### 什么时候用
|
|
263
|
+
|
|
264
|
+
当用户提供 Apifox 接口链接,并提到“联调”“接口”“参数”“详情”“完成它”等开发意图时使用。
|
|
265
|
+
|
|
266
|
+
支持的 Apifox 链接:
|
|
267
|
+
|
|
268
|
+
```text
|
|
269
|
+
app.apifox.com/link/project/{projectId}/apis/api-{apiId}
|
|
270
|
+
app.apifox.com/project/{projectId}/apis/api-{apiId}
|
|
212
271
|
```
|
|
213
272
|
|
|
214
|
-
|
|
273
|
+
### 怎么触发
|
|
215
274
|
|
|
216
|
-
|
|
275
|
+
Cursor:
|
|
217
276
|
|
|
218
|
-
|
|
219
|
-
-
|
|
220
|
-
|
|
221
|
-
- `.cursor/`:Cursor 专用配置、commands、skills、agents、hooks。
|
|
222
|
-
- `AGENTS.md`:项目级 AI 助手协作说明。
|
|
277
|
+
```text
|
|
278
|
+
/trellis-joint-debugger
|
|
279
|
+
```
|
|
223
280
|
|
|
224
|
-
|
|
281
|
+
Codex / `.agents/skills`:
|
|
225
282
|
|
|
226
|
-
|
|
283
|
+
```text
|
|
284
|
+
$trellis-joint-debugger
|
|
285
|
+
```
|
|
227
286
|
|
|
228
|
-
|
|
287
|
+
如果你是旧项目,先运行:
|
|
229
288
|
|
|
230
289
|
```bash
|
|
231
|
-
|
|
290
|
+
trellis update
|
|
232
291
|
```
|
|
233
292
|
|
|
234
|
-
|
|
293
|
+
### 第一次配置 Apifox Token
|
|
294
|
+
|
|
295
|
+
检查是否已配置:
|
|
235
296
|
|
|
236
297
|
```bash
|
|
237
|
-
|
|
298
|
+
python3 ./.trellis/scripts/apifox_token.py check
|
|
238
299
|
```
|
|
239
300
|
|
|
240
|
-
|
|
301
|
+
保存 token:
|
|
241
302
|
|
|
242
303
|
```bash
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
304
|
+
python3 ./.trellis/scripts/apifox_token.py save
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
`save` 使用隐藏输入,并保存到用户级配置:
|
|
308
|
+
|
|
309
|
+
```text
|
|
310
|
+
~/.trellis/apifox.env
|
|
247
311
|
```
|
|
248
312
|
|
|
313
|
+
读取优先级:
|
|
314
|
+
|
|
315
|
+
1. `APIFOX_ACCESS_TOKEN` 环境变量
|
|
316
|
+
2. `~/.trellis/apifox.env`
|
|
317
|
+
3. 旧项目内 `.trellis/.runtime/apifox.env`
|
|
318
|
+
|
|
319
|
+
token 只用于请求 header,不会被命令打印。
|
|
320
|
+
|
|
321
|
+
### 联调流程会做什么
|
|
322
|
+
|
|
323
|
+
1. 从 Apifox 链接解析 `projectId` 和 `apiId`。
|
|
324
|
+
2. 请求 Apifox Web API:
|
|
325
|
+
|
|
326
|
+
```text
|
|
327
|
+
GET https://api.apifox.com/api/v1/projects/{projectId}/http-apis/{apiId}
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
3. 提取 method、path、query/path/header/body、responses。
|
|
331
|
+
4. 如果请求体或响应体里有 `$ref: #/definitions/{schemaId}`,继续请求 data-schemas 并展开字段。
|
|
332
|
+
5. 在当前项目里搜索已有 API 封装、请求客户端、代理配置和环境配置。
|
|
333
|
+
6. 对比 Apifox 的 method/path/字段与本地 API wrapper。
|
|
334
|
+
7. 如果要真实请求业务后端,根据项目代理和环境配置发请求;如果返回 `401` 或缺少登录态,明确报告未登录,不猜测数据。
|
|
335
|
+
|
|
249
336
|
## 推荐团队用法
|
|
250
337
|
|
|
251
|
-
|
|
338
|
+
新项目默认推荐:
|
|
252
339
|
|
|
253
340
|
```bash
|
|
254
|
-
smart-trellis init
|
|
341
|
+
smart-trellis init \
|
|
342
|
+
--tools codex,cursor \
|
|
343
|
+
--user <developer-name> \
|
|
344
|
+
--gitignore-config
|
|
255
345
|
```
|
|
256
346
|
|
|
257
|
-
|
|
347
|
+
如果团队希望 Trellis 只在明确调用时启动:
|
|
258
348
|
|
|
259
349
|
```bash
|
|
260
350
|
smart-trellis init \
|
|
261
351
|
--tools codex,cursor \
|
|
262
352
|
--user <developer-name> \
|
|
263
|
-
--
|
|
353
|
+
--trellis-activation explicit \
|
|
354
|
+
--gitignore-config
|
|
264
355
|
```
|
|
265
356
|
|
|
266
|
-
|
|
357
|
+
如果团队维护了统一 spec registry:
|
|
358
|
+
|
|
359
|
+
```bash
|
|
360
|
+
smart-trellis init \
|
|
361
|
+
--tools codex,cursor \
|
|
362
|
+
--user <developer-name> \
|
|
363
|
+
--registry gh:<org>/<repo>/<spec-path> \
|
|
364
|
+
--trellis-activation explicit \
|
|
365
|
+
--gitignore-config
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
Marketplace registry:
|
|
267
369
|
|
|
268
370
|
```bash
|
|
269
371
|
smart-trellis init \
|
|
270
372
|
--tools codex,cursor \
|
|
271
373
|
--user <developer-name> \
|
|
272
374
|
--registry gh:<org>/<repo>/<marketplace-path> \
|
|
273
|
-
--template <template-id>
|
|
375
|
+
--template <template-id> \
|
|
376
|
+
--trellis-activation explicit \
|
|
377
|
+
--gitignore-config
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
## 本地开发验证
|
|
381
|
+
|
|
382
|
+
在本仓库开发时,先构建 CLI:
|
|
383
|
+
|
|
384
|
+
```bash
|
|
385
|
+
pnpm --filter @ibotor/smart-trellis build
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
直接用本地 bin 测试:
|
|
389
|
+
|
|
390
|
+
```bash
|
|
391
|
+
node packages/cli/bin/smart-trellis.js init --tools codex,cursor --user adong
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
也可以在临时项目里验证:
|
|
395
|
+
|
|
396
|
+
```bash
|
|
397
|
+
mkdir /tmp/smart-trellis-demo
|
|
398
|
+
cd /tmp/smart-trellis-demo
|
|
399
|
+
echo '{"name":"smart-trellis-demo"}' > package.json
|
|
400
|
+
node /path/to/smart-trellis/packages/cli/bin/smart-trellis.js init --tools codex,cursor --user adong
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
发布前建议至少运行:
|
|
404
|
+
|
|
405
|
+
```bash
|
|
406
|
+
pnpm --filter @ibotor/smart-trellis test
|
|
407
|
+
pnpm --filter @ibotor/smart-trellis build
|
|
408
|
+
pnpm --filter @ibotor/smart-trellis lint
|
|
409
|
+
pnpm --filter @ibotor/smart-trellis typecheck
|
|
274
410
|
```
|
package/dist/cli/smart.js
CHANGED
|
@@ -22,7 +22,9 @@ const initCommand = program
|
|
|
22
22
|
.option("--overwrite", "Overwrite existing spec directory when using template")
|
|
23
23
|
.option("--append", "Only add missing files when using template")
|
|
24
24
|
.option("-r, --registry <source>", "Use a custom template registry (e.g., gh:myorg/myrepo/specs)")
|
|
25
|
-
.option("--trellis-activation <mode>", "Set no-task Trellis activation mode: auto or explicit")
|
|
25
|
+
.option("--trellis-activation <mode>", "Set no-task Trellis activation mode: auto or explicit")
|
|
26
|
+
.option("--gitignore-config", "Add generated config directories to .gitignore without prompting")
|
|
27
|
+
.option("--no-gitignore-config", "Do not add generated config directories to .gitignore");
|
|
26
28
|
for (const tool of getInitToolChoices()) {
|
|
27
29
|
initCommand.option(`--${tool.key}`, `Include ${tool.name}`);
|
|
28
30
|
}
|
package/dist/cli/smart.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smart.js","sourceRoot":"","sources":["../../src/cli/smart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAyB,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAElD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,wCAAwC,CAAC;KACrD,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,2BAA2B,CAAC,CAAC;AAElE,MAAM,WAAW,GAAG,OAAO;KACxB,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,iBAAiB,EAAE,6CAA6C,CAAC;KACxE,MAAM,CAAC,WAAW,EAAE,6CAA6C,CAAC;KAClE,MAAM,CACL,mBAAmB,EACnB,mDAAmD,CACpD;KACA,MAAM,CAAC,aAAa,EAAE,yCAAyC,CAAC;KAChE,MAAM,CAAC,qBAAqB,EAAE,oCAAoC,CAAC;KACnE,MAAM,CAAC,YAAY,EAAE,qBAAqB,CAAC;KAC3C,MAAM,CAAC,eAAe,EAAE,yBAAyB,CAAC;KAClD,MAAM,CACL,uBAAuB,EACvB,uDAAuD,CACxD;KACA,MAAM,CACL,aAAa,EACb,uDAAuD,CACxD;KACA,MAAM,CAAC,UAAU,EAAE,4CAA4C,CAAC;KAChE,MAAM,CACL,yBAAyB,EACzB,8DAA8D,CAC/D;KACA,MAAM,CACL,6BAA6B,EAC7B,uDAAuD,CACxD,CAAC;AAEJ,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,EAAE,CAAC;IACxC,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;IACrD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EACnB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;QACF,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACnD,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"smart.js","sourceRoot":"","sources":["../../src/cli/smart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAyB,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAElD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,wCAAwC,CAAC;KACrD,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,2BAA2B,CAAC,CAAC;AAElE,MAAM,WAAW,GAAG,OAAO;KACxB,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,iBAAiB,EAAE,6CAA6C,CAAC;KACxE,MAAM,CAAC,WAAW,EAAE,6CAA6C,CAAC;KAClE,MAAM,CACL,mBAAmB,EACnB,mDAAmD,CACpD;KACA,MAAM,CAAC,aAAa,EAAE,yCAAyC,CAAC;KAChE,MAAM,CAAC,qBAAqB,EAAE,oCAAoC,CAAC;KACnE,MAAM,CAAC,YAAY,EAAE,qBAAqB,CAAC;KAC3C,MAAM,CAAC,eAAe,EAAE,yBAAyB,CAAC;KAClD,MAAM,CACL,uBAAuB,EACvB,uDAAuD,CACxD;KACA,MAAM,CACL,aAAa,EACb,uDAAuD,CACxD;KACA,MAAM,CAAC,UAAU,EAAE,4CAA4C,CAAC;KAChE,MAAM,CACL,yBAAyB,EACzB,8DAA8D,CAC/D;KACA,MAAM,CACL,6BAA6B,EAC7B,uDAAuD,CACxD;KACA,MAAM,CACL,oBAAoB,EACpB,kEAAkE,CACnE;KACA,MAAM,CACL,uBAAuB,EACvB,uDAAuD,CACxD,CAAC;AAEJ,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,EAAE,CAAC;IACxC,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;IACrD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EACnB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;QACF,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACnD,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { type InitOptions } from "./init.js";
|
|
2
|
-
import type
|
|
2
|
+
import { type CliFlag } from "../types/ai-tools.js";
|
|
3
3
|
type SmartToolFlagOptions = Partial<Record<CliFlag, boolean>>;
|
|
4
4
|
export type TrellisActivationMode = "auto" | "explicit";
|
|
5
5
|
export type SmartInitOptions = SmartToolFlagOptions & {
|
|
6
6
|
append?: boolean;
|
|
7
7
|
force?: boolean;
|
|
8
|
+
gitignoreConfig?: boolean;
|
|
8
9
|
monorepo?: boolean;
|
|
9
10
|
overwrite?: boolean;
|
|
10
11
|
registry?: string;
|
|
@@ -19,6 +20,8 @@ export declare const SMART_DEFAULT_TOOLS: CliFlag[];
|
|
|
19
20
|
export declare function parseSmartToolsOption(value: string): CliFlag[];
|
|
20
21
|
export declare function parseSmartTrellisActivationMode(value: string | undefined): TrellisActivationMode | undefined;
|
|
21
22
|
export declare function patchTrellisActivationConfig(content: string, mode: TrellisActivationMode): string;
|
|
23
|
+
export declare function getSmartGitignoreCandidates(tools: CliFlag[]): string[];
|
|
24
|
+
export declare function patchGitignoreConfigDirs(content: string, entries: string[]): string;
|
|
22
25
|
export declare function createSmartInitOptions(options: SmartInitOptions, tools: CliFlag[], detectedUser?: string): InitOptions;
|
|
23
26
|
export declare function detectDeveloperName(cwd?: string): string | undefined;
|
|
24
27
|
export declare function smartInit(options: SmartInitOptions): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smart-init.d.ts","sourceRoot":"","sources":["../../src/commands/smart-init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"smart-init.d.ts","sourceRoot":"","sources":["../../src/commands/smart-init.ts"],"names":[],"mappings":"AASA,OAAO,EAAQ,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAmB,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAErE,KAAK,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAC9D,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,UAAU,CAAC;AAExD,MAAM,MAAM,gBAAgB,GAAG,oBAAoB,GAAG;IACpD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,OAAO,EAAwB,CAAC;AAiBlE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CAkB9D;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,qBAAqB,GAAG,SAAS,CAWnC;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,qBAAqB,GAC1B,MAAM,CAwCR;AA2CD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAUtE;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EAAE,GAChB,MAAM,CAmBR;AAiED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,OAAO,EAAE,EAChB,YAAY,CAAC,EAAE,MAAM,GACpB,WAAW,CA6Bb;AAED,wBAAgB,mBAAmB,CACjC,GAAG,GAAE,MAAsB,GAC1B,MAAM,GAAG,SAAS,CAoBpB;AAmGD,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBxE"}
|
|
@@ -3,9 +3,11 @@ import fs from "node:fs";
|
|
|
3
3
|
import os from "node:os";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import inquirer from "inquirer";
|
|
6
|
-
import { getInitToolChoices } from "../configurators/index.js";
|
|
6
|
+
import { getInitToolChoices, resolveCliFlag, } from "../configurators/index.js";
|
|
7
7
|
import { init } from "./init.js";
|
|
8
|
+
import { getManagedPaths } from "../types/ai-tools.js";
|
|
8
9
|
export const SMART_DEFAULT_TOOLS = ["codex", "cursor"];
|
|
10
|
+
const TRELLIS_GITIGNORE_ENTRY = ".trellis/";
|
|
9
11
|
function supportedToolFlags() {
|
|
10
12
|
return getInitToolChoices().map((tool) => tool.key);
|
|
11
13
|
}
|
|
@@ -71,6 +73,75 @@ export function patchTrellisActivationConfig(content, mode) {
|
|
|
71
73
|
const separator = content.endsWith("\n") ? "\n" : "\n\n";
|
|
72
74
|
return `${content}${separator}trellis:\n activation_mode: ${mode}\n`;
|
|
73
75
|
}
|
|
76
|
+
function normalizeGitignoreDirEntry(value) {
|
|
77
|
+
const trimmed = value.trim();
|
|
78
|
+
if (!trimmed || trimmed.startsWith("#") || trimmed.startsWith("!")) {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
const normalized = trimmed
|
|
82
|
+
.replace(/\\/g, "/")
|
|
83
|
+
.replace(/^\/+/, "")
|
|
84
|
+
.replace(/\/+$/g, "");
|
|
85
|
+
if (!normalized) {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
return `${normalized}/`;
|
|
89
|
+
}
|
|
90
|
+
function uniqueDirEntries(entries) {
|
|
91
|
+
const seen = new Set();
|
|
92
|
+
const unique = [];
|
|
93
|
+
for (const entry of entries) {
|
|
94
|
+
const normalized = normalizeGitignoreDirEntry(entry);
|
|
95
|
+
if (!normalized || seen.has(normalized)) {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
seen.add(normalized);
|
|
99
|
+
unique.push(normalized);
|
|
100
|
+
}
|
|
101
|
+
return unique;
|
|
102
|
+
}
|
|
103
|
+
function gitignoreEntryCoversCandidate(gitignoreEntry, candidate) {
|
|
104
|
+
const normalized = normalizeGitignoreDirEntry(gitignoreEntry);
|
|
105
|
+
return (normalized === candidate ||
|
|
106
|
+
Boolean(normalized && candidate.startsWith(normalized)));
|
|
107
|
+
}
|
|
108
|
+
export function getSmartGitignoreCandidates(tools) {
|
|
109
|
+
const entries = [TRELLIS_GITIGNORE_ENTRY];
|
|
110
|
+
for (const tool of tools) {
|
|
111
|
+
const platformId = resolveCliFlag(tool);
|
|
112
|
+
if (!platformId) {
|
|
113
|
+
throw new Error(`Unknown tool "${tool}".`);
|
|
114
|
+
}
|
|
115
|
+
entries.push(...getManagedPaths(platformId));
|
|
116
|
+
}
|
|
117
|
+
return uniqueDirEntries(entries);
|
|
118
|
+
}
|
|
119
|
+
export function patchGitignoreConfigDirs(content, entries) {
|
|
120
|
+
const candidates = uniqueDirEntries(entries);
|
|
121
|
+
if (candidates.length === 0) {
|
|
122
|
+
return content;
|
|
123
|
+
}
|
|
124
|
+
const existingLines = content.split(/\r?\n/);
|
|
125
|
+
const missing = candidates.filter((candidate) => !existingLines.some((line) => gitignoreEntryCoversCandidate(line, candidate)));
|
|
126
|
+
if (missing.length === 0) {
|
|
127
|
+
return content;
|
|
128
|
+
}
|
|
129
|
+
const prefix = content && !content.endsWith("\n") ? `${content}\n` : content;
|
|
130
|
+
return `${prefix}${missing.join("\n")}\n`;
|
|
131
|
+
}
|
|
132
|
+
function applyGitignoreConfigDirs(cwd, entries) {
|
|
133
|
+
if (entries.length === 0) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const gitignorePath = path.join(cwd, ".gitignore");
|
|
137
|
+
const content = fs.existsSync(gitignorePath)
|
|
138
|
+
? fs.readFileSync(gitignorePath, "utf-8")
|
|
139
|
+
: "";
|
|
140
|
+
const patched = patchGitignoreConfigDirs(content, entries);
|
|
141
|
+
if (patched !== content) {
|
|
142
|
+
fs.writeFileSync(gitignorePath, patched, "utf-8");
|
|
143
|
+
}
|
|
144
|
+
}
|
|
74
145
|
function applyTrellisActivationConfig(cwd, mode) {
|
|
75
146
|
if (!mode) {
|
|
76
147
|
return;
|
|
@@ -169,6 +240,28 @@ async function resolveSmartTools(options) {
|
|
|
169
240
|
]);
|
|
170
241
|
return answers.tools;
|
|
171
242
|
}
|
|
243
|
+
async function resolveSmartGitignoreConfigDirs(options, tools) {
|
|
244
|
+
const candidates = getSmartGitignoreCandidates(tools);
|
|
245
|
+
if (options.gitignoreConfig === false || candidates.length === 0) {
|
|
246
|
+
return [];
|
|
247
|
+
}
|
|
248
|
+
if (options.gitignoreConfig === true || options.yes) {
|
|
249
|
+
return candidates;
|
|
250
|
+
}
|
|
251
|
+
const answers = await inquirer.prompt([
|
|
252
|
+
{
|
|
253
|
+
type: "checkbox",
|
|
254
|
+
name: "gitignoreConfigDirs",
|
|
255
|
+
message: "Select generated config directories to add to .gitignore:",
|
|
256
|
+
choices: candidates.map((entry) => ({
|
|
257
|
+
checked: true,
|
|
258
|
+
name: entry,
|
|
259
|
+
value: entry,
|
|
260
|
+
})),
|
|
261
|
+
},
|
|
262
|
+
]);
|
|
263
|
+
return answers.gitignoreConfigDirs ?? [];
|
|
264
|
+
}
|
|
172
265
|
async function resolveSmartTrellisActivation(options) {
|
|
173
266
|
const parsed = parseSmartTrellisActivationMode(options.trellisActivation);
|
|
174
267
|
const hasExplicitTools = !!options.tools ||
|
|
@@ -198,9 +291,11 @@ async function resolveSmartTrellisActivation(options) {
|
|
|
198
291
|
}
|
|
199
292
|
export async function smartInit(options) {
|
|
200
293
|
const tools = await resolveSmartTools(options);
|
|
294
|
+
const gitignoreConfigDirs = await resolveSmartGitignoreConfigDirs(options, tools);
|
|
201
295
|
const activationMode = await resolveSmartTrellisActivation(options);
|
|
202
296
|
const initOptions = createSmartInitOptions(options, tools, detectDeveloperName());
|
|
203
297
|
await init(initOptions);
|
|
204
298
|
applyTrellisActivationConfig(process.cwd(), activationMode);
|
|
299
|
+
applyGitignoreConfigDirs(process.cwd(), gitignoreConfigDirs);
|
|
205
300
|
}
|
|
206
301
|
//# sourceMappingURL=smart-init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smart-init.js","sourceRoot":"","sources":["../../src/commands/smart-init.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"smart-init.js","sourceRoot":"","sources":["../../src/commands/smart-init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.5.22",
|
|
3
|
+
"description": "Patch: expand the Apifox joint debugger workflow and add user-level Apifox token storage.",
|
|
4
|
+
"breaking": false,
|
|
5
|
+
"recommendMigrate": false,
|
|
6
|
+
"changelog": "**Enhancements:**\n- feat(joint-debugger): expand `trellis-joint-debugger` into an Apifox-backed frontend-backend joint debugging workflow. It parses Apifox API links, fetches API details through the Apifox Web API, resolves referenced schemas, and compares method/path/fields with local API wrappers.\n- feat(scripts): add `.trellis/scripts/apifox_token.py` so users can configure `APIFOX_ACCESS_TOKEN` once per machine at `~/.trellis/apifox.env`. Environment variables still take precedence, and legacy project-local `.trellis/.runtime/apifox.env` files remain readable as a fallback.",
|
|
7
|
+
"migrations": [],
|
|
8
|
+
"notes": "No migration required. Run `trellis update` to receive the expanded joint debugger command/skill and the Apifox token helper script. Run `python3 ./.trellis/scripts/apifox_token.py save` once to store the Apifox token for all Trellis projects on this machine."
|
|
9
|
+
}
|
|
@@ -1,5 +1,97 @@
|
|
|
1
1
|
# Joint Debugger
|
|
2
2
|
|
|
3
|
-
Frontend-backend joint debugging entry point.
|
|
3
|
+
Frontend-backend joint debugging entry point for Apifox-backed API work.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Use this command when the user provides an Apifox API link and asks about
|
|
6
|
+
joint debugging, interface details, parameters, implementation, or completion.
|
|
7
|
+
|
|
8
|
+
## Step 0: Load Trellis Context
|
|
9
|
+
|
|
10
|
+
Run the same startup context that `/trellis start` would load, but do not create
|
|
11
|
+
a task unless the user explicitly asks for Trellis task management.
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
{{PYTHON_CMD}} ./.trellis/scripts/get_context.py
|
|
15
|
+
{{PYTHON_CMD}} ./.trellis/scripts/get_context.py --mode phase
|
|
16
|
+
{{PYTHON_CMD}} ./.trellis/scripts/get_context.py --mode packages
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Step 1: Ensure Apifox Token
|
|
20
|
+
|
|
21
|
+
Before calling Apifox APIs, check whether `APIFOX_ACCESS_TOKEN` is already
|
|
22
|
+
configured. The token must only be used in request headers and must never be
|
|
23
|
+
printed.
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
{{PYTHON_CMD}} ./.trellis/scripts/apifox_token.py check
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
If the check fails, ask the user to get an Apifox access token and run:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
{{PYTHON_CMD}} ./.trellis/scripts/apifox_token.py save
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
The save prompt hides input and stores the token in the user-level config
|
|
36
|
+
`~/.trellis/apifox.env`, so it works across projects. After the user saves it,
|
|
37
|
+
rerun the check before continuing. Do not ask the user to paste the token into
|
|
38
|
+
chat. Legacy project-local `.trellis/.runtime/apifox.env` files are still read
|
|
39
|
+
as a fallback, but new saves are global.
|
|
40
|
+
|
|
41
|
+
## Step 2: Parse Apifox Link
|
|
42
|
+
|
|
43
|
+
Recognize these link forms:
|
|
44
|
+
|
|
45
|
+
- `app.apifox.com/link/project/{projectId}/apis/api-{apiId}`
|
|
46
|
+
- `app.apifox.com/project/{projectId}/apis/api-{apiId}`
|
|
47
|
+
|
|
48
|
+
Extract `projectId` and `apiId`. Do not open the Apifox page in a browser by
|
|
49
|
+
default.
|
|
50
|
+
|
|
51
|
+
## Step 3: Fetch API Detail
|
|
52
|
+
|
|
53
|
+
Load the token without printing it, then request the Apifox Web API:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
set -a
|
|
57
|
+
if [ -z "${APIFOX_ACCESS_TOKEN:-}" ]; then
|
|
58
|
+
APIFOX_TOKEN_FILE="$({{PYTHON_CMD}} ./.trellis/scripts/apifox_token.py path)"
|
|
59
|
+
[ -f "$APIFOX_TOKEN_FILE" ] && . "$APIFOX_TOKEN_FILE"
|
|
60
|
+
fi
|
|
61
|
+
set +a
|
|
62
|
+
curl -sS \
|
|
63
|
+
-H "Authorization: Bearer ${APIFOX_ACCESS_TOKEN}" \
|
|
64
|
+
-H "X-Branch-Id: 0" \
|
|
65
|
+
-H "X-Client-Version: 100.100.100" \
|
|
66
|
+
"https://api.apifox.com/api/v1/projects/{projectId}/http-apis/{apiId}"
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Capture `method`, `path`, `moduleId`, request parameters, `requestBody`, and
|
|
70
|
+
`responses`.
|
|
71
|
+
|
|
72
|
+
## Step 4: Resolve Schema References
|
|
73
|
+
|
|
74
|
+
If `requestBody` or `responses` contains `$ref: #/definitions/{schemaId}`, use
|
|
75
|
+
the API detail's `moduleId` to fetch schemas:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
curl -sS \
|
|
79
|
+
-H "Authorization: Bearer ${APIFOX_ACCESS_TOKEN}" \
|
|
80
|
+
-H "X-Branch-Id: 0" \
|
|
81
|
+
-H "X-Client-Version: 100.100.100" \
|
|
82
|
+
"https://api.apifox.com/api/v1/projects/{projectId}/data-schemas?moduleId={moduleId}"
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Match definitions by schema id and expand request/response fields before
|
|
86
|
+
summarizing the interface.
|
|
87
|
+
|
|
88
|
+
## Step 5: Compare With Code
|
|
89
|
+
|
|
90
|
+
Search the current codebase for existing API wrappers, request clients,
|
|
91
|
+
environment proxy settings, and matching paths. Compare the parsed
|
|
92
|
+
`method/path` and request/response fields with the local API encapsulation.
|
|
93
|
+
|
|
94
|
+
If the user wants real backend joint debugging, use the project's proxy and
|
|
95
|
+
environment configuration to call the business backend. If the backend returns
|
|
96
|
+
`401` or requires a login session, report that clearly as unauthenticated
|
|
97
|
+
instead of inventing data.
|
|
@@ -42,6 +42,7 @@ export declare const initDeveloperScript: string;
|
|
|
42
42
|
export declare const taskScript: string;
|
|
43
43
|
export declare const getContextScript: string;
|
|
44
44
|
export declare const addSessionScript: string;
|
|
45
|
+
export declare const apifoxTokenScript: string;
|
|
45
46
|
export declare const workflowMdTemplate: string;
|
|
46
47
|
export declare const configYamlTemplate: string;
|
|
47
48
|
export declare const gitignoreTemplate: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/templates/trellis/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAcH,eAAO,MAAM,WAAW,QAAsC,CAAC;AAG/D,eAAO,MAAM,UAAU,QAA6C,CAAC;AACrE,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,eAAe,QAA8C,CAAC;AAC3E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,YAAY,QAA2C,CAAC;AACrE,eAAO,MAAM,QAAQ,QAAuC,CAAC;AAC7D,eAAO,MAAM,SAAS,QAAwC,CAAC;AAC/D,eAAO,MAAM,SAAS,QAAwC,CAAC;AAC/D,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,iBAAiB,QAAiD,CAAC;AAChF,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AACF,eAAO,MAAM,qBAAqB,QAEjC,CAAC;AACF,eAAO,MAAM,mBAAmB,QAE/B,CAAC;AACF,eAAO,MAAM,mBAAmB,QAE/B,CAAC;AACF,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAG9E,eAAO,MAAM,kBAAkB,QAA2C,CAAC;AAC3E,eAAO,MAAM,mBAAmB,QAA4C,CAAC;AAC7E,eAAO,MAAM,UAAU,QAAkC,CAAC;AAC1D,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AACvE,eAAO,MAAM,gBAAgB,QAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/templates/trellis/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAcH,eAAO,MAAM,WAAW,QAAsC,CAAC;AAG/D,eAAO,MAAM,UAAU,QAA6C,CAAC;AACrE,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,eAAe,QAA8C,CAAC;AAC3E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,YAAY,QAA2C,CAAC;AACrE,eAAO,MAAM,QAAQ,QAAuC,CAAC;AAC7D,eAAO,MAAM,SAAS,QAAwC,CAAC;AAC/D,eAAO,MAAM,SAAS,QAAwC,CAAC;AAC/D,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,iBAAiB,QAAiD,CAAC;AAChF,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AACF,eAAO,MAAM,qBAAqB,QAEjC,CAAC;AACF,eAAO,MAAM,mBAAmB,QAE/B,CAAC;AACF,eAAO,MAAM,mBAAmB,QAE/B,CAAC;AACF,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAG9E,eAAO,MAAM,kBAAkB,QAA2C,CAAC;AAC3E,eAAO,MAAM,mBAAmB,QAA4C,CAAC;AAC7E,eAAO,MAAM,UAAU,QAAkC,CAAC;AAC1D,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AACvE,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AACvE,eAAO,MAAM,iBAAiB,QAA0C,CAAC;AAGzE,eAAO,MAAM,kBAAkB,QAA8B,CAAC;AAC9D,eAAO,MAAM,kBAAkB,QAA8B,CAAC;AAC9D,eAAO,MAAM,iBAAiB,QAAgC,CAAC;AAE/D;;GAEG;AACH,wBAAgB,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAsCnD"}
|
|
@@ -53,6 +53,7 @@ export const initDeveloperScript = readTemplate("scripts/init_developer.py");
|
|
|
53
53
|
export const taskScript = readTemplate("scripts/task.py");
|
|
54
54
|
export const getContextScript = readTemplate("scripts/get_context.py");
|
|
55
55
|
export const addSessionScript = readTemplate("scripts/add_session.py");
|
|
56
|
+
export const apifoxTokenScript = readTemplate("scripts/apifox_token.py");
|
|
56
57
|
// Configuration files
|
|
57
58
|
export const workflowMdTemplate = readTemplate("workflow.md");
|
|
58
59
|
export const configYamlTemplate = readTemplate("config.yaml");
|
|
@@ -92,6 +93,7 @@ export function getAllScripts() {
|
|
|
92
93
|
scripts.set("task.py", taskScript);
|
|
93
94
|
scripts.set("get_context.py", getContextScript);
|
|
94
95
|
scripts.set("add_session.py", addSessionScript);
|
|
96
|
+
scripts.set("apifox_token.py", apifoxTokenScript);
|
|
95
97
|
return scripts;
|
|
96
98
|
}
|
|
97
99
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/templates/trellis/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/templates/trellis/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Manage the user-level Apifox access token for Trellis joint debugging."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
import getpass
|
|
8
|
+
import os
|
|
9
|
+
import shlex
|
|
10
|
+
import sys
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
TOKEN_NAME = "APIFOX_ACCESS_TOKEN"
|
|
15
|
+
GLOBAL_CONFIG_PATH = Path(
|
|
16
|
+
os.environ.get("TRELLIS_APIFOX_TOKEN_FILE", "~/.trellis/apifox.env")
|
|
17
|
+
).expanduser()
|
|
18
|
+
LEGACY_PROJECT_CONFIG_PATH = Path(".trellis/.runtime/apifox.env")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def parse_env_value(value: str) -> str:
|
|
22
|
+
try:
|
|
23
|
+
parts = shlex.split(value, comments=False, posix=True)
|
|
24
|
+
except ValueError:
|
|
25
|
+
return value.strip().strip("'\"")
|
|
26
|
+
if len(parts) == 1:
|
|
27
|
+
return parts[0]
|
|
28
|
+
return value.strip().strip("'\"")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def read_token_file(path: Path) -> str | None:
|
|
32
|
+
try:
|
|
33
|
+
content = path.read_text(encoding="utf-8")
|
|
34
|
+
except OSError:
|
|
35
|
+
return None
|
|
36
|
+
|
|
37
|
+
for raw_line in content.splitlines():
|
|
38
|
+
line = raw_line.strip()
|
|
39
|
+
if not line or line.startswith("#") or "=" not in line:
|
|
40
|
+
continue
|
|
41
|
+
key, value = line.split("=", 1)
|
|
42
|
+
if key.strip() != TOKEN_NAME:
|
|
43
|
+
continue
|
|
44
|
+
value = parse_env_value(value.strip())
|
|
45
|
+
return value or None
|
|
46
|
+
return None
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def configured_source() -> str | None:
|
|
50
|
+
if os.environ.get(TOKEN_NAME):
|
|
51
|
+
return "environment"
|
|
52
|
+
if read_token_file(GLOBAL_CONFIG_PATH):
|
|
53
|
+
return "user config"
|
|
54
|
+
if read_token_file(LEGACY_PROJECT_CONFIG_PATH):
|
|
55
|
+
return "project-local config (legacy)"
|
|
56
|
+
return None
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def cmd_check(_args: argparse.Namespace) -> int:
|
|
60
|
+
source = configured_source()
|
|
61
|
+
if source:
|
|
62
|
+
print(f"{TOKEN_NAME} is configured via {source}. Token value hidden.")
|
|
63
|
+
return 0
|
|
64
|
+
|
|
65
|
+
print(f"{TOKEN_NAME} is not configured.")
|
|
66
|
+
print("Run: python3 ./.trellis/scripts/apifox_token.py save")
|
|
67
|
+
print("Then paste the token into the hidden prompt.")
|
|
68
|
+
return 1
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def cmd_save(_args: argparse.Namespace) -> int:
|
|
72
|
+
token = getpass.getpass(f"Paste {TOKEN_NAME} (input hidden): ").strip()
|
|
73
|
+
if not token:
|
|
74
|
+
print("No token provided; nothing saved.", file=sys.stderr)
|
|
75
|
+
return 1
|
|
76
|
+
if "\n" in token or "\r" in token:
|
|
77
|
+
print("Token must be a single line.", file=sys.stderr)
|
|
78
|
+
return 1
|
|
79
|
+
|
|
80
|
+
GLOBAL_CONFIG_PATH.parent.mkdir(parents=True, exist_ok=True)
|
|
81
|
+
try:
|
|
82
|
+
GLOBAL_CONFIG_PATH.parent.chmod(0o700)
|
|
83
|
+
except OSError:
|
|
84
|
+
pass
|
|
85
|
+
GLOBAL_CONFIG_PATH.write_text(
|
|
86
|
+
"# User-level Trellis config. Do not commit or print this value.\n"
|
|
87
|
+
f"{TOKEN_NAME}={shlex.quote(token)}\n",
|
|
88
|
+
encoding="utf-8",
|
|
89
|
+
)
|
|
90
|
+
GLOBAL_CONFIG_PATH.chmod(0o600)
|
|
91
|
+
print(f"{TOKEN_NAME} saved to {GLOBAL_CONFIG_PATH}. Token value hidden.")
|
|
92
|
+
return 0
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def cmd_path(_args: argparse.Namespace) -> int:
|
|
96
|
+
print(GLOBAL_CONFIG_PATH)
|
|
97
|
+
return 0
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def build_parser() -> argparse.ArgumentParser:
|
|
101
|
+
parser = argparse.ArgumentParser(
|
|
102
|
+
description="Manage the user-level Apifox access token for Trellis.",
|
|
103
|
+
)
|
|
104
|
+
subparsers = parser.add_subparsers(dest="command", required=True)
|
|
105
|
+
|
|
106
|
+
check_parser = subparsers.add_parser("check", help="Check token presence.")
|
|
107
|
+
check_parser.set_defaults(func=cmd_check)
|
|
108
|
+
|
|
109
|
+
save_parser = subparsers.add_parser(
|
|
110
|
+
"save",
|
|
111
|
+
help="Save token to user-level config.",
|
|
112
|
+
)
|
|
113
|
+
save_parser.set_defaults(func=cmd_save)
|
|
114
|
+
|
|
115
|
+
path_parser = subparsers.add_parser("path", help="Print user-level config path.")
|
|
116
|
+
path_parser.set_defaults(func=cmd_path)
|
|
117
|
+
|
|
118
|
+
return parser
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def main() -> int:
|
|
122
|
+
parser = build_parser()
|
|
123
|
+
args = parser.parse_args()
|
|
124
|
+
return args.func(args)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
if __name__ == "__main__":
|
|
128
|
+
raise SystemExit(main())
|