@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 CHANGED
@@ -1,152 +1,192 @@
1
1
  # Smart Trellis
2
2
 
3
- `smart-trellis` 是基于 Trellis 原始能力扩展出来的智能初始化入口。
3
+ `smart-trellis` Trellis 的智能初始化入口。它不替换 Trellis 的核心能力,而是在 `trellis init` 之前帮你做默认选择,减少初始化时的重复确认。
4
4
 
5
- 它不会替换 `trellis init` 的核心逻辑,而是在执行前自动推断项目配置,并把原本需要反复确认的大量问题转换为默认行为。你通常只需要确认要配置哪些 AI 工具,例如 Codex、Cursor、Claude Code 等。
5
+ 这个 npm 包同时提供三个命令:
6
6
 
7
- ## 新增命令
8
-
9
- ```bash
10
- smart-trellis init
7
+ ```text
8
+ smart-trellis # 智能初始化入口
9
+ trellis # 原 Trellis CLI
10
+ tl # trellis 的短别名
11
11
  ```
12
12
 
13
- 这个命令等价于一个更省心的 `trellis init`:
13
+ 当前 npm latest:`0.5.22`。
14
14
 
15
- - 自动调用原始 Trellis 初始化流程。
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
- ## `trellis init` 的区别
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
- `smart-trellis init` 仍然会生成 Trellis 的完整结构,包括 `.trellis/`、`.agents/skills/`、平台配置目录和 `AGENTS.md`。
26
+ ```bash
27
+ npm install -g @ibotor/smart-trellis@latest
28
+ trellis update
29
+ ```
30
30
 
31
- ## 新设备安装
31
+ ## 快速开始
32
32
 
33
- 新设备只需要安装一次 npm 包:
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
- 如果你暂时不想全局安装,也可以用 npm exec:
45
+ 默认交互流程:
46
46
 
47
- ```bash
48
- npm exec --package @ibotor/smart-trellis -- smart-trellis init
49
- ```
47
+ 1. 选择要配置的 AI 工具。
48
+ 2. 选择要加入 `.gitignore` 的生成目录,默认全选。
49
+ 3. 选择 Trellis activation mode。
50
+ 4. 调用原始 `trellis init`,生成 `.trellis/`、平台配置目录和 `AGENTS.md`。
50
51
 
51
- 也可以在 CI 或临时环境里使用 `npx`:
52
+ 如果你希望完全无交互,并使用默认工具 `codex,cursor`:
52
53
 
53
54
  ```bash
54
- npx -p @ibotor/smart-trellis smart-trellis init
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
- 如果你希望完全不出现交互,并使用默认工具 `codex,cursor`:
70
+ 独立参数形式:
66
71
 
67
72
  ```bash
68
- smart-trellis init --yes
73
+ smart-trellis init --codex --cursor --claude
69
74
  ```
70
75
 
71
- 不加 `--yes` 时,初始化过程会提示你选择 AI 工具,并选择 Trellis activation mode:
76
+ 当前支持的工具名:
72
77
 
73
- - `auto`:默认行为,Trellis 可以为开发/重构需求自动启动任务流程。
74
- - `explicit`:Trellis 只在你明确使用 `/trellis start` / `$trellis-start` / “走 Trellis” 时启动。
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 --tools codex,cursor --user adong
106
+ smart-trellis init \
107
+ --yes \
108
+ --user adong \
109
+ --trellis-activation explicit \
110
+ --gitignore-config
86
111
  ```
87
112
 
88
- 如果你希望 Trellis 不主动接管普通开发需求,而是必须显式使用 `/trellis start` / `$trellis-start` / “走 Trellis” 才启动:
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 init --yes --codex --cursor --user adong
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
- 第一种,使用 `--tools` 传逗号分隔的工具名:
143
+ ## `.gitignore` 生成目录选择
105
144
 
106
- ```bash
107
- smart-trellis init --tools codex,cursor,claude
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 --cursor --claude
166
+ smart-trellis init --tools codex,cursor --gitignore-config
114
167
  ```
115
168
 
116
- 当前支持的工具名:
169
+ 完全不修改 `.gitignore`:
117
170
 
118
- ```text
119
- claude
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
- ## Registry 用法
175
+ 注意:如果你把 `.trellis/` 加入 `.gitignore`,Trellis 的 spec、tasks、workspace 等状态默认不会被 Git 跟踪。适合把 Trellis 配置当本地工作区的团队;如果你的团队希望提交 `.trellis/spec/` 或任务记录,请在多选时取消 `.trellis/`。
136
176
 
137
- `smart-trellis init` 兼容原 `trellis init --registry` 能力,可以从自定义 GitHub、GitLab、Bitbucket 仓库拉取 spec。
177
+ ## Registry 和模板
138
178
 
139
- ### 直接下载 spec 目录
179
+ `smart-trellis init` 兼容原 `trellis init --registry` 能力,可以从自定义 GitHub、GitLab、Bitbucket 仓库拉取 spec
140
180
 
141
- 仓库目录会被下载到当前项目的 `.trellis/spec/`:
181
+ 直接下载 spec 目录:
142
182
 
143
183
  ```bash
144
- smart-trellis init --tools codex,cursor --registry gh:myorg/myrepo/my-team-spec
184
+ smart-trellis init \
185
+ --tools codex,cursor \
186
+ --registry gh:myorg/myrepo/my-team-spec
145
187
  ```
146
188
 
147
- ### Marketplace 模式指定模板
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
- 如果不指定 `--template`,Trellis 无法在非交互模式下自动判断要使用哪个模板。
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
- ### GitLab 和 Bitbucket
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
- `smart-trellis init` 默认会以安全方式写入文件。因为它内部会启用非交互模式,所以遇到已经存在的文件时默认跳过,避免覆盖已有配置。
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
- 使用远程模板时,也可以控制 spec 目录写入方式:
236
+ Monorepo 默认自动检测。也可以手动指定:
192
237
 
193
238
  ```bash
194
- smart-trellis init --tools codex,cursor --registry gh:myorg/myrepo/specs --overwrite
195
- smart-trellis init --tools codex,cursor --registry gh:myorg/myrepo/specs --append
239
+ smart-trellis init --tools codex,cursor --monorepo
240
+ smart-trellis init --tools codex,cursor --no-monorepo
196
241
  ```
197
242
 
198
- ## Monorepo 控制
243
+ ## 初始化后会生成什么
199
244
 
200
- 默认情况下,`smart-trellis init` 会让 Trellis 自动检测当前项目是否为 monorepo。
245
+ 根据工具不同,生成内容会略有差异。常见输出包括:
201
246
 
202
- 强制启用 monorepo:
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
- ```bash
205
- smart-trellis init --tools codex,cursor --monorepo
206
- ```
256
+ `smart-trellis init` 的目标不是生成一个轻量配置,而是用更少确认步骤生成完整 Trellis 项目结构。
207
257
 
208
- 跳过 monorepo 检测:
258
+ ## Apifox 前后端联调
209
259
 
210
- ```bash
211
- smart-trellis init --tools codex,cursor --no-monorepo
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
- - `.trellis/`:Trellis workflow、spec、tasks、workspace 等核心目录。
219
- - `.agents/skills/`:跨工具复用的 Trellis skills。
220
- - `.codex/`:Codex 专用配置、skills、agents、hooks。
221
- - `.cursor/`:Cursor 专用配置、commands、skills、agents、hooks。
222
- - `AGENTS.md`:项目级 AI 助手协作说明。
277
+ ```text
278
+ /trellis-joint-debugger
279
+ ```
223
280
 
224
- 所以,`smart-trellis init` 的目标不是只生成一个轻量配置,而是用更少确认步骤生成原 Trellis 初始化应有的完整结果。
281
+ Codex / `.agents/skills`:
225
282
 
226
- ## 本地开发验证
283
+ ```text
284
+ $trellis-joint-debugger
285
+ ```
227
286
 
228
- 在本仓库开发时,可以先构建 CLI:
287
+ 如果你是旧项目,先运行:
229
288
 
230
289
  ```bash
231
- pnpm --filter @ibotor/smart-trellis build
290
+ trellis update
232
291
  ```
233
292
 
234
- 然后直接用本地 bin 测试:
293
+ ### 第一次配置 Apifox Token
294
+
295
+ 检查是否已配置:
235
296
 
236
297
  ```bash
237
- node packages/cli/bin/smart-trellis.js init --tools codex,cursor --user adong
298
+ python3 ./.trellis/scripts/apifox_token.py check
238
299
  ```
239
300
 
240
- 也可以在一个临时项目里验证:
301
+ 保存 token:
241
302
 
242
303
  ```bash
243
- mkdir /tmp/smart-trellis-demo
244
- cd /tmp/smart-trellis-demo
245
- echo '{"name":"smart-trellis-demo"}' > package.json
246
- node /path/to/smart-trellis/packages/cli/bin/smart-trellis.js init --tools codex,cursor --user adong
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 --tools codex,cursor --user <developer-name>
341
+ smart-trellis init \
342
+ --tools codex,cursor \
343
+ --user <developer-name> \
344
+ --gitignore-config
255
345
  ```
256
346
 
257
- 如果你维护了团队统一 spec registry,则推荐:
347
+ 如果团队希望 Trellis 只在明确调用时启动:
258
348
 
259
349
  ```bash
260
350
  smart-trellis init \
261
351
  --tools codex,cursor \
262
352
  --user <developer-name> \
263
- --registry gh:<org>/<repo>/<spec-path>
353
+ --trellis-activation explicit \
354
+ --gitignore-config
264
355
  ```
265
356
 
266
- 如果 registry 是 marketplace
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
  }
@@ -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 { CliFlag } from "../types/ai-tools.js";
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":"AAMA,OAAO,EAAQ,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,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,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;AAgBlE,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;AAmDD,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;AAuED,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWxE"}
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EACL,kBAAkB,EAClB,cAAc,GACf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,IAAI,EAAoB,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,eAAe,EAAgB,MAAM,sBAAsB,CAAC;AAoBrE,MAAM,CAAC,MAAM,mBAAmB,GAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAClE,MAAM,uBAAuB,GAAG,WAAW,CAAC;AAE5C,SAAS,kBAAkB;IACzB,OAAO,kBAAkB,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,uBAAuB,CAC9B,KAAyB;IAEzB,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,MAAM,KAAK,GAAG,KAAK;SAChB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAClC,CAAC,IAAI,EAAW,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAe,CAAC,CACxD,CAAC;IAEF,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,iBAAiB,WAAW,uBAAuB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC1E,CAAC;IACJ,CAAC;IAED,OAAO,WAAwB,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,KAAyB;IAEzB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;QACvD,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,IAAI,KAAK,CACb,oCAAoC,KAAK,oCAAoC,CAC9E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,OAAe,EACf,IAA2B;IAE3B,MAAM,gBAAgB,GACpB,gFAAgF,CAAC;IACnF,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,OAAO,OAAO,CAAC,OAAO,CACpB,gBAAgB,EAChB,gCAAgC,IAAI,EAAE,CACvC,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAC5C,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAC7C,CAAC;IACF,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;QACxB,IAAI,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;QAC9B,KAAK,IAAI,KAAK,GAAG,YAAY,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACpE,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC3C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YAClD,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC;YACrF,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjB,UAAU,GAAG,KAAK,CAAC;gBACnB,MAAM;YACR,CAAC;QACH,CAAC;QAED,KAAK,IAAI,KAAK,GAAG,YAAY,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAClE,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YACtE,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,oBAAoB,IAAI,EAAE,CAAC;gBACrD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC,EAAE,sBAAsB,IAAI,EAAE,CAAC,CAAC;QAChE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IACzD,OAAO,GAAG,OAAO,GAAG,SAAS,gCAAgC,IAAI,IAAI,CAAC;AACxE,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAa;IAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACnE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,OAAO;SACvB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACxB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,UAAU,GAAG,CAAC;AAC1B,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAiB;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;QACrD,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACxC,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,6BAA6B,CACpC,cAAsB,EACtB,SAAiB;IAEjB,MAAM,UAAU,GAAG,0BAA0B,CAAC,cAAc,CAAC,CAAC;IAC9D,OAAO,CACL,UAAU,KAAK,SAAS;QACxB,OAAO,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CACxD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAgB;IAC1D,MAAM,OAAO,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,IAAI,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,OAAe,EACf,OAAiB;IAEjB,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAC/B,CAAC,SAAS,EAAE,EAAE,CACZ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAC3B,6BAA6B,CAAC,IAAI,EAAE,SAAS,CAAC,CAC/C,CACJ,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7E,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5C,CAAC;AAED,SAAS,wBAAwB,CAAC,GAAW,EAAE,OAAiB;IAC9D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IACD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;QAC1C,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC;QACzC,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,OAAO,GAAG,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3D,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CACnC,GAAW,EACX,IAAuC;IAEvC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IAC7D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACrD,EAAE,CAAC,aAAa,CACd,UAAU,EACV,4BAA4B,CAAC,OAAO,EAAE,IAAI,CAAC,EAC3C,OAAO,CACR,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,WAAwB,EAAE,KAAgB;IAChE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CACzB,MAAmB,EACnB,GAGC,EACD,KAA0B;IAE1B,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CACxB,MAAmB,EACnB,GAAqD,EACrD,KAAyB;IAEzB,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,OAAyB,EACzB,KAAgB,EAChB,YAAqB;IAErB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,WAAW,GAAgB;QAC/B,GAAG,EAAE,IAAI;KACV,CAAC;IAEF,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACnC,kBAAkB,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1D,kBAAkB,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACxD,kBAAkB,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAChE,kBAAkB,CAAC,WAAW,EAAE,cAAc,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACtE,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7D,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE7D,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnC,WAAW,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC1C,CAAC;IAED,MAAM,IAAI,GACR,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC;QACrC,uBAAuB,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,IAAI,EAAE,CAAC;QACT,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,sBAAsB,EAAE;YAC/C,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4BAA4B;IAC9B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;QACxC,OAAO,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,OAAyB;IAEzB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,qBAAqB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,aAAa,GAAG,kBAAkB,EAAE,CAAC,MAAM,CAC/C,CAAC,IAAI,EAAW,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAC1C,CAAC;IACF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAuB;QAC1D;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,+BAA+B;YACxC,OAAO,EAAE,kBAAkB,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC3C,OAAO,EAAE,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC/C,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,GAAG;aAChB,CAAC,CAAC;SACJ;KACF,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,KAAK,CAAC;AACvB,CAAC;AAED,KAAK,UAAU,+BAA+B,CAC5C,OAAyB,EACzB,KAAgB;IAEhB,MAAM,UAAU,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,OAAO,CAAC,eAAe,KAAK,KAAK,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjE,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,OAAO,CAAC,eAAe,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACpD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAoC;QACvE;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,2DAA2D;YACpE,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAClC,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;SACJ;KACF,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,mBAAmB,IAAI,EAAE,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,6BAA6B,CAC1C,OAAyB;IAEzB,MAAM,MAAM,GAAG,+BAA+B,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC1E,MAAM,gBAAgB,GACpB,CAAC,CAAC,OAAO,CAAC,KAAK;QACf,kBAAkB,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAW,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IACvE,IAAI,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAC9C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAElC;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,iCAAiC;YAC1C,OAAO,EAAE,MAAM;YACf,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,2DAA2D;oBACjE,KAAK,EAAE,MAAM;iBACd;gBACD;oBACE,IAAI,EAAE,sDAAsD;oBAC5D,KAAK,EAAE,UAAU;iBAClB;aACF;SACF;KACF,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,iBAAiB,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAyB;IACvD,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,mBAAmB,GAAG,MAAM,+BAA+B,CAC/D,OAAO,EACP,KAAK,CACN,CAAC;IACF,MAAM,cAAc,GAAG,MAAM,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACpE,MAAM,WAAW,GAAG,sBAAsB,CACxC,OAAO,EACP,KAAK,EACL,mBAAmB,EAAE,CACtB,CAAC;IAEF,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC;IACxB,4BAA4B,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IAC5D,wBAAwB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC,CAAC;AAC/D,CAAC"}
@@ -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
- TODO: Fill in this workflow later.
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;AAGvE,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,CAqCnD"}
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":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,SAAS,YAAY,CAAC,YAAoB;IACxC,OAAO,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED,gCAAgC;AAChC,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC;AAE/D,0BAA0B;AAC1B,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC,4BAA4B,CAAC,CAAC;AACrE,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,yBAAyB,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC,6BAA6B,CAAC,CAAC;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,+BAA+B,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,+BAA+B,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,+BAA+B,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAC,0BAA0B,CAAC,CAAC;AACrE,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC,sBAAsB,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC,uBAAuB,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC,uBAAuB,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,yBAAyB,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,yBAAyB,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC,gCAAgC,CAAC,CAAC;AAChF,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAC9C,mCAAmC,CACpC,CAAC;AACF,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAC/C,oCAAoC,CACrC,CAAC;AACF,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAC7C,kCAAkC,CACnC,CAAC;AACF,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAC7C,kCAAkC,CACnC,CAAC;AACF,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,+BAA+B,CAAC,CAAC;AAE9E,wBAAwB;AACxB,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC,0BAA0B,CAAC,CAAC;AAC3E,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAAC,2BAA2B,CAAC,CAAC;AAC7E,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,wBAAwB,CAAC,CAAC;AACvE,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,wBAAwB,CAAC,CAAC;AAEvE,sBAAsB;AACtB,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;AAC9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;AAC9D,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;AAE/D;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE1C,eAAe;IACf,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAExC,SAAS;IACT,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,eAAe,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,eAAe,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,eAAe,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,iBAAiB,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,eAAe,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,oBAAoB,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,qBAAqB,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,mBAAmB,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,mBAAmB,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;IAEvD,OAAO;IACP,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IAEhD,OAAO,OAAO,CAAC;AACjB,CAAC"}
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())
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ibotor/smart-trellis",
3
- "version": "0.5.21",
3
+ "version": "0.5.23",
4
4
  "description": "Smart Trellis CLI with project-aware initialization defaults",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",