@optima-chat/optima-agent 0.9.50 → 0.9.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/.claude/settings.local.json +166 -0
  2. package/.claude/skills/doctor-avatar/SKILL.md +15 -0
  3. package/.claude/skills/scout/SKILL.md +13 -7
  4. package/.claude/skills/scout/references/concept.md +4 -6
  5. package/.claude/skills/scout/references/planning.md +8 -2
  6. package/dist/bin/banner-tool.js +0 -0
  7. package/dist/bin/bi-cli.js +0 -0
  8. package/dist/bin/browser-cli.js +0 -0
  9. package/dist/bin/channels.js +0 -0
  10. package/dist/bin/comfy.d.ts +3 -0
  11. package/dist/bin/comfy.d.ts.map +1 -0
  12. package/dist/bin/comfy.js +3 -0
  13. package/dist/bin/comfy.js.map +1 -0
  14. package/dist/bin/commerce.js +0 -0
  15. package/dist/bin/gen.js +0 -0
  16. package/dist/bin/google-ads.js +0 -0
  17. package/dist/bin/growth.d.ts +3 -0
  18. package/dist/bin/growth.d.ts.map +1 -0
  19. package/dist/bin/growth.js +3 -0
  20. package/dist/bin/growth.js.map +1 -0
  21. package/dist/bin/kb-skills.js +0 -0
  22. package/dist/bin/logistics.js +0 -0
  23. package/dist/bin/optima.js +0 -0
  24. package/dist/bin/scout.js +0 -0
  25. package/dist/bin/sentinel.js +0 -0
  26. package/dist/bin/shopify.js +0 -0
  27. package/dist/src/hooks-loader.d.ts +6 -0
  28. package/dist/src/hooks-loader.d.ts.map +1 -0
  29. package/dist/src/hooks-loader.js +215 -0
  30. package/dist/src/hooks-loader.js.map +1 -0
  31. package/dist/src/ui/App.d.ts +6 -0
  32. package/dist/src/ui/App.d.ts.map +1 -0
  33. package/dist/src/ui/App.js +164 -0
  34. package/dist/src/ui/App.js.map +1 -0
  35. package/dist/src/ui/components/Composer.d.ts +10 -0
  36. package/dist/src/ui/components/Composer.d.ts.map +1 -0
  37. package/dist/src/ui/components/Composer.js +13 -0
  38. package/dist/src/ui/components/Composer.js.map +1 -0
  39. package/dist/src/ui/components/Header.d.ts +7 -0
  40. package/dist/src/ui/components/Header.d.ts.map +1 -0
  41. package/dist/src/ui/components/Header.js +7 -0
  42. package/dist/src/ui/components/Header.js.map +1 -0
  43. package/dist/src/ui/components/Message.d.ts +12 -0
  44. package/dist/src/ui/components/Message.d.ts.map +1 -0
  45. package/dist/src/ui/components/Message.js +21 -0
  46. package/dist/src/ui/components/Message.js.map +1 -0
  47. package/dist/src/ui/components/MessageList.d.ts +9 -0
  48. package/dist/src/ui/components/MessageList.d.ts.map +1 -0
  49. package/dist/src/ui/components/MessageList.js +18 -0
  50. package/dist/src/ui/components/MessageList.js.map +1 -0
  51. package/dist/src/ui/components/Spinner.d.ts +6 -0
  52. package/dist/src/ui/components/Spinner.d.ts.map +1 -0
  53. package/dist/src/ui/components/Spinner.js +7 -0
  54. package/dist/src/ui/components/Spinner.js.map +1 -0
  55. package/dist/src/ui/components/StatusBar.d.ts +11 -0
  56. package/dist/src/ui/components/StatusBar.d.ts.map +1 -0
  57. package/dist/src/ui/components/StatusBar.js +7 -0
  58. package/dist/src/ui/components/StatusBar.js.map +1 -0
  59. package/dist/src/ui/components/index.d.ts +7 -0
  60. package/dist/src/ui/components/index.d.ts.map +1 -0
  61. package/dist/src/ui/components/index.js +7 -0
  62. package/dist/src/ui/components/index.js.map +1 -0
  63. package/dist/src/validation/error-formatter.d.ts +21 -0
  64. package/dist/src/validation/error-formatter.d.ts.map +1 -0
  65. package/dist/src/validation/error-formatter.js +98 -0
  66. package/dist/src/validation/error-formatter.js.map +1 -0
  67. package/dist/src/validation/index.d.ts +10 -0
  68. package/dist/src/validation/index.d.ts.map +1 -0
  69. package/dist/src/validation/index.js +10 -0
  70. package/dist/src/validation/index.js.map +1 -0
  71. package/dist/src/validation/json-validator.d.ts +25 -0
  72. package/dist/src/validation/json-validator.d.ts.map +1 -0
  73. package/dist/src/validation/json-validator.js +173 -0
  74. package/dist/src/validation/json-validator.js.map +1 -0
  75. package/dist/src/validation/schema.d.ts +353 -0
  76. package/dist/src/validation/schema.d.ts.map +1 -0
  77. package/dist/src/validation/schema.js +57 -0
  78. package/dist/src/validation/schema.js.map +1 -0
  79. package/dist/src/validation/suggestions.d.ts +25 -0
  80. package/dist/src/validation/suggestions.d.ts.map +1 -0
  81. package/dist/src/validation/suggestions.js +144 -0
  82. package/dist/src/validation/suggestions.js.map +1 -0
  83. package/dist/src/validation/types.d.ts +40 -0
  84. package/dist/src/validation/types.d.ts.map +1 -0
  85. package/dist/src/validation/types.js +5 -0
  86. package/dist/src/validation/types.js.map +1 -0
  87. package/dist/src/validation/yaml-validator.d.ts +25 -0
  88. package/dist/src/validation/yaml-validator.d.ts.map +1 -0
  89. package/dist/src/validation/yaml-validator.js +177 -0
  90. package/dist/src/validation/yaml-validator.js.map +1 -0
  91. package/package.json +11 -12
@@ -0,0 +1,166 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(gh api:*)",
5
+ "WebFetch(domain:platform.claude.com)",
6
+ "Bash(git init:*)",
7
+ "Bash(mkdir:*)",
8
+ "Bash(npm run typecheck:*)",
9
+ "Bash(npm view:*)",
10
+ "WebSearch",
11
+ "Bash(commerce --help)",
12
+ "Bash(done)",
13
+ "Bash(commerce product:*)",
14
+ "Bash(commerce order:*)",
15
+ "Bash(commerce i18n:*)",
16
+ "Bash(google-ads:*)",
17
+ "Bash(scout --help:*)",
18
+ "Bash(tree:*)",
19
+ "Bash(cloc:*)",
20
+ "Bash(npm run build:*)",
21
+ "Bash(git restore:*)",
22
+ "Bash(gh repo view:*)",
23
+ "Bash(mv:*)",
24
+ "Bash(rmdir:*)",
25
+ "Bash(git add:*)",
26
+ "Bash(git commit:*)",
27
+ "Bash(git push)",
28
+ "Bash(timeout 5 npm run optima:*)",
29
+ "Bash(npm install:*)",
30
+ "Bash(cat:*)",
31
+ "Bash(gh issue create:*)",
32
+ "Bash(npx tsx:*)",
33
+ "Bash(timeout 30 npx tsx:*)",
34
+ "Bash(git push origin feature/ask-user-question)",
35
+ "Bash(node:*)",
36
+ "Bash(npm version:*)",
37
+ "Bash(git push:*)",
38
+ "Bash(npm publish:*)",
39
+ "Bash(pkill:*)",
40
+ "Bash(git -C /Users/verypro/optima-agent log --oneline --all -- \".claude/\")",
41
+ "Bash(wc:*)",
42
+ "Bash(grep:*)",
43
+ "Bash(find:*)",
44
+ "Bash(commerce collection --help:*)",
45
+ "Bash(commerce collection update --help:*)",
46
+ "Bash(commerce collection set-cover:*)",
47
+ "Bash(commerce collection get --help:*)",
48
+ "Bash(commerce collection list --help:*)",
49
+ "Bash(commerce collection create --help:*)",
50
+ "Bash(commerce collection remove-products:*)",
51
+ "Bash(commerce collection list-products:*)",
52
+ "Bash(commerce --version:*)",
53
+ "Bash(bi-cli --version:*)",
54
+ "Bash(commerce homepage create --help:*)",
55
+ "Bash(commerce homepage reorder --help:*)",
56
+ "Bash(commerce homepage delete --help:*)",
57
+ "Bash(commerce homepage update-images:*)",
58
+ "Bash(commerce homepage update-collections:*)",
59
+ "Bash(commerce homepage update-target:*)",
60
+ "Bash(commerce homepage switch-template:*)",
61
+ "Bash(commerce inventory:*)",
62
+ "Bash(commerce merchant:*)",
63
+ "Bash(commerce review:*)",
64
+ "Bash(commerce product-page:*)",
65
+ "Bash(bi-cli:*)",
66
+ "Bash(comfy:*)",
67
+ "Bash(scout search:*)",
68
+ "Bash(scout product:*)",
69
+ "Bash(commerce homepage create-collections:*)",
70
+ "Bash(commerce homepage create-featured:*)",
71
+ "Bash(commerce homepage create-collection-products:*)",
72
+ "Bash(commerce homepage create-banner:*)",
73
+ "Bash(xargs -I {} sh -c 'echo \"\"\"\"=== {} ===\"\"\"\"; head -3 /Users/verypro/optima-agent/.claude/skills/{}/SKILL.md | grep \"\"\"\"name:\"\"\"\"')",
74
+ "Bash(ls:*)",
75
+ "Bash(gh issue view:*)",
76
+ "Bash(npx markdownlint-cli:*)",
77
+ "Bash(chmod:*)",
78
+ "Bash(npm whoami:*)",
79
+ "Bash(tsx test-scripts/test-headless-progress.ts:*)",
80
+ "Bash(DEBUG_STREAM=1 node dist/bin/optima.js:*)",
81
+ "Bash(git describe:*)",
82
+ "WebFetch(domain:github.com)",
83
+ "Bash(./scripts/test-headless.sh:*)",
84
+ "Bash(./scripts/test-headless-simple.sh:*)",
85
+ "Bash(env)",
86
+ "Bash(gh pr list:*)",
87
+ "Bash(gh pr view:*)",
88
+ "Bash(gh pr diff:*)",
89
+ "Bash(optima --version:*)",
90
+ "Bash(optima agent headless:*)",
91
+ "Bash(optima headless:*)",
92
+ "Bash(/Users/verypro/optima-agent/scripts/test-headless.sh:*)",
93
+ "Bash(/Users/verypro/optima-agent/scripts/test-headless-simple.sh:*)",
94
+ "Bash(tee:*)",
95
+ "Bash(CONV_ID=\"conv-1\":*)",
96
+ "Bash(echo:*)",
97
+ "Bash(scout tiktok trending --help:*)",
98
+ "Bash(scout tiktok trending:*)",
99
+ "Bash(git checkout:*)",
100
+ "Bash(npm test:*)",
101
+ "Bash(git tag:*)",
102
+ "Bash(/private/tmp/claude/-Users-verypro-optima-agent/68a9ac2c-def2-44e1-b42b-e53bd9022ab6/scratchpad/test-canUseTool.sh)",
103
+ "Bash(optima --help:*)",
104
+ "Bash(npx @optima-chat/ads-cli:*)",
105
+ "Bash(head:*)",
106
+ "Bash(git pull:*)",
107
+ "Bash(pnpm build:*)",
108
+ "Skill(read-code)",
109
+ "Bash(npm run cli:*)",
110
+ "Bash(scout:*)",
111
+ "WebFetch(domain:docs.scrapecreators.com)",
112
+ "WebFetch(domain:scrapecreators.com)",
113
+ "Bash(gh auth status:*)",
114
+ "Bash(optima-agent:*)",
115
+ "Bash(python3:*)",
116
+ "Bash(python3 -c \" import sys content = sys.stdin.read\\(\\) # Find flushMessageQueueSync idx = content.find\\(''flushMessageQueueSync''\\) # Get context around it lines = content.split\\(''\\\\n''\\) for i, line in enumerate\\(lines\\): if ''flushMessageQueueSync'' in line and ''private'' in line: for j in range\\(i, min\\(i+20, len\\(lines\\)\\)\\): print\\(f''{j+1}: {lines[j]}''\\) break \")",
117
+ "Bash(optima:*)",
118
+ "WebFetch(domain:www.npmjs.com)",
119
+ "WebFetch(domain:registry.npmjs.org)",
120
+ "WebFetch(domain:zod.dev)",
121
+ "Bash(npm ls:*)",
122
+ "Bash(NODE_DEBUG=child_process npx tsx:*)",
123
+ "Bash(DEBUG_CLAUDE_AGENT_SDK=1 npx tsx:*)",
124
+ "Bash(CLAUDECODE= npx tsx:*)",
125
+ "Bash(env:*)",
126
+ "Bash(gh release:*)",
127
+ "Bash(npm info:*)",
128
+ "Bash(gh run:*)",
129
+ "Bash(gtimeout 90:*)",
130
+ "Bash(sentinel:*)",
131
+ "Bash(gh pr:*)",
132
+ "Bash(git fetch:*)",
133
+ "Bash(git log:*)",
134
+ "Bash(npm bin:*)",
135
+ "Bash(git status:*)",
136
+ "Bash(browser-cli --version && browser-cli --help)",
137
+ "Bash(browser-cli status:*)",
138
+ "Bash(browser-cli launch:*)",
139
+ "Bash(browser-cli screenshot:*)",
140
+ "Bash(browser-cli --version)",
141
+ "Bash(browser-cli close:*)",
142
+ "Bash(npm update:*)",
143
+ "Bash(node -e \"console.log\\(require\\('./node_modules/@optima-chat/browser-cli/package.json'\\).version\\)\")",
144
+ "WebFetch(domain:raw.githubusercontent.com)",
145
+ "Bash(aws ecs:*)",
146
+ "Bash(aws ecr:*)",
147
+ "Bash(gh search:*)",
148
+ "Bash(npx tsc:*)",
149
+ "Bash(find /Users/verypro/optima-agent -path */node_modules -prune -o -type f \\\\\\(-name *comfy* -o -name *gen* \\\\\\) -print)",
150
+ "Bash(export PATH=\"/usr/local/bin:$PATH\")",
151
+ "Bash(pnpm add:*)",
152
+ "Bash(cp -r ~/optima-agent/test/skills/kol-outreach/fixtures/one-active-campaign ~/optima-agent/test/skills/kol-outreach/fixtures/max-rounds-hit)",
153
+ "Bash(cp -r ~/optima-agent/test/skills/kol-outreach/fixtures/one-active-campaign ~/optima-agent/test/skills/kol-outreach/fixtures/budget-almost-spent)",
154
+ "Bash(cp -r ~/optima-agent/test/skills/kol-outreach/fixtures/one-active-campaign ~/optima-agent/test/skills/kol-outreach/fixtures/two-active-campaigns)",
155
+ "Bash(cp -r ~/optima-agent/test/skills/kol-outreach/fixtures/one-active-campaign ~/optima-agent/test/skills/kol-outreach/fixtures/brand-only)",
156
+ "Bash(pnpm vitest:*)",
157
+ "Bash(pnpm test:*)",
158
+ "Bash(pnpm --filter @optima-scout/backend test --reporter=verbose backend/src/routes/outreach/__tests__/lock.test.ts backend/src/routes/outreach/__tests__/inbound.test.ts)",
159
+ "Bash(npx vitest:*)",
160
+ "Bash(DATABASE_URL=postgres://optima_scout:optima_scout_dev@localhost:7293/optima_scout pnpm --filter @optima-scout/backend test)",
161
+ "Bash(pnpm --filter @optima-scout/backend exec vitest run src/routes/outreach/__tests__/inbound.test.ts)"
162
+ ],
163
+ "deny": [],
164
+ "ask": []
165
+ }
166
+ }
@@ -190,6 +190,21 @@ gen doctor profile <external_id>
190
190
 
191
191
  > **内部备忘(不主动告诉用户)**:单视频实际训出 4 个 looks 但当前只暴露第一个(spec §13.5 limitation,[v1.1 issue #54](https://github.com/Optima-Chat/optima-gen/issues/54) 跟踪)。用户问起 "为什么只有一种表情" 再说。
192
192
 
193
+ ### 7.5 注册到用户的"我的分身"列表
194
+
195
+ 训练成功后(voice + avatar 至少一项 status=complete/completed),把 `external_id` 注册给 chat backend,让前端"我的分身"组件能列出来。**Idempotent**(后端 upsert),重复调安全。
196
+
197
+ ```bash
198
+ curl -s -X POST -H "Authorization: Bearer $OPTIMA_TOKEN" \
199
+ -H "Content-Type: application/json" \
200
+ -d "{\"external_id\":\"$EXTERNAL_ID\"}" \
201
+ "${CHAT_API_URL:-https://www.optima.onl}/api/user/me/doctor-avatars"
202
+ ```
203
+
204
+ **如失败**(网络 / 401 / 5xx)→ **不阻塞**,继续给用户报告 + 可选 demo;只在内部 log 警告。理由:训练已经完成且 IDs 有了,UI 列表注册是 nice-to-have,不该卡住主流程。
205
+
206
+ > 这一步让 `external_id` 进 user 的 mapping table,UI 才能显示。如果 skip 这一步,IDs 仍在 `gen doctor profile` 能查,但 UI 看不到(用户得记 slug)。
207
+
193
208
  ### 8. (可选)立即合成 demo
194
209
 
195
210
  如果用户在原始请求里说了想"看效果 / 做一段试试 / 给我个 demo":
@@ -85,13 +85,19 @@ description: "基于 IPD 方法论的产品研究全生命周期工具。在 ~/k
85
85
  - 使用 `scout cache list` 查看已缓存文件
86
86
  - stdout 输出摘要 + 缓存路径,不再输出完整 JSON
87
87
 
88
- ### 数据进入 KB
88
+ ### Ingest(缓存数据收录到 KB
89
89
 
90
- 数据通过 kb-skills ingest 流程进入 `~/kb/product-research/`:
91
- - 在数据完整性检查通过后批量 ingest
92
- - ingest 将缓存文件复制到 `raw/`,生成 `wiki/sources/` 摘要页
93
- - 自动更新相关 entity 和 overview 页面
94
- - 具体 ingest 规则见 `~/kb/product-research/AGENTS.md`
90
+ 数据采集完成后,必须将缓存文件 ingest KB 才能进入分析。步骤:
91
+
92
+ 1. `cp ~/.scout/cache/{project}/*.json ~/kb/product-research/raw/`
93
+ 2. 读取 `~/kb/product-research/AGENTS.md`,了解每种数据类型应创建/更新哪些页面
94
+ 3. 对每个 raw/ 文件:
95
+ - 读取 JSON 内容,提取关键信息
96
+ - 在 `wiki/sources/` 创建对应的来源摘要页(命名:`YYYY-MM-DD-<命令>-<参数>.md`)
97
+ - 根据 AGENTS.md 的"数据来源类型"表,创建/更新相关的 entity 和 overview 页面
98
+ 4. 更新 `index.md`(添加新页面引用)和 `log.md`(记录本次 ingest)
99
+ 5. `cd ~/kb/product-research && git add -A && git commit -m "[product-research] ingest: <简述>"`
100
+ 6. 运行 `ls ~/kb/product-research/raw/` 和 `ls ~/kb/product-research/wiki/sources/` 确认文件已生成
95
101
 
96
102
  ### 分析数据来源
97
103
 
@@ -212,7 +218,7 @@ Shein/Temu 低价($X)vs Amazon 中高价($Y)vs 1688 成本(¥Z)
212
218
 
213
219
  ## KB 集成
214
220
 
215
- `~/kb/product-research/` 是产品研究的主数据存储。所有研究数据通过 CLI 自动缓存后,经 kb-skills ingest 流程进入 KB。分析时读取 `wiki/` 下的结构化页面,不直接读 raw JSON。
221
+ `~/kb/product-research/` 是产品研究的主数据存储。所有研究数据通过 CLI 自动缓存后,按上方「Ingest」章节的步骤收录到 KB。分析时使用 Skill 工具调用 `querying-the-wiki` skill 查询 KB,不直接读缓存 JSON。
216
222
 
217
223
  ## 交互风格
218
224
 
@@ -108,9 +108,7 @@
108
108
 
109
109
  ### Ingest
110
110
 
111
- 数据采集完成后,将所有缓存文件 ingest KB
112
- - 对 `~/.scout/cache/{project}/` 中的每个缓存文件调用 kb-skills 的 ingesting-sources 流程
113
- - 确认 raw/、wiki/sources/ 和相关 entity/overview 页面已更新
111
+ SKILL.md「Ingest(缓存数据收录到 KB)」章节的步骤,将所有缓存文件收录到 KB
114
112
 
115
113
  ### 数据完整性检查
116
114
 
@@ -155,14 +153,14 @@
155
153
 
156
154
  **前置条件:必须先运行 `ls ~/kb/product-research/wiki/sources/` 确认来源页不为空。如果为空,说明 ingest 未完成,必须返回第二步。**
157
155
 
158
- **所有分析数据必须通过 kb-skills querying-the-wiki 流程从 KB 查询,禁止直接读 `~/.scout/cache/` 中的 JSON 文件。**
156
+ **所有分析数据必须使用 Skill 工具调用 `querying-the-wiki` skill KB 查询,禁止直接读 `~/.scout/cache/` 中的 JSON 文件。**
159
157
 
160
158
  ### 5. SPAN 初步定位
161
159
 
162
160
  **目的**:战略定位评估
163
161
 
164
162
  **方法**:
165
- - 用 querying-the-wiki 查询:子品类分布、精确搜索量、品牌集中度、卖家画像
163
+ - 用 `querying-the-wiki` skill 查询:子品类分布、精确搜索量、品牌集中度、卖家画像
166
164
  - 参考 `analysis-framework.md` SPAN 评分标准
167
165
  - Y 轴:市场吸引力(1-5 分)— 市场规模、增长趋势、利润潜力、战略价值
168
166
  - X 轴:竞争地位(1-5 分)— 差异化能力、资金匹配度、供应链能力、进入壁垒
@@ -176,7 +174,7 @@
176
174
  **目的**:粗算利润空间
177
175
 
178
176
  **方法**:
179
- - 用 querying-the-wiki 查询:Amazon 均价、1688 参考价、PPC 竞价数据、卖家画像的利润阈值
177
+ - 用 `querying-the-wiki` skill 查询:Amazon 均价、1688 参考价、PPC 竞价数据、卖家画像的利润阈值
180
178
  - 毛利 = 售价 - COGS - FBA 费
181
179
  - 粗略净利 = 毛利 - PPC 估算 - 退货估算
182
180
 
@@ -205,9 +205,15 @@
205
205
 
206
206
  **完成标准**:主要风险识别,每个有应对方案
207
207
 
208
- ## 数据完整性检查
208
+ ## Ingest + 数据完整性检查
209
209
 
210
- **在 PDCP Gate 评审之前,必须通过以下检查。任何一项未通过 → 补数据,不评审。**
210
+ ### Ingest
211
+
212
+ 按 SKILL.md「Ingest(缓存数据收录到 KB)」章节的步骤,将所有缓存文件收录到 KB。
213
+
214
+ ### 数据完整性检查
215
+
216
+ **Ingest 完成后执行检查。全部通过才能进入 PDCP Gate 评审。任何一项未通过 → 补齐后重新检查。**
211
217
 
212
218
  ```
213
219
  计划阶段数据完整性检查清单:
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import "@optima-chat/comfy-cli";
3
+ //# sourceMappingURL=comfy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comfy.d.ts","sourceRoot":"","sources":["../../bin/comfy.ts"],"names":[],"mappings":";AACA,OAAO,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import "@optima-chat/comfy-cli";
3
+ //# sourceMappingURL=comfy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comfy.js","sourceRoot":"","sources":["../../bin/comfy.ts"],"names":[],"mappings":";AACA,OAAO,wBAAwB,CAAC"}
File without changes
package/dist/bin/gen.js CHANGED
File without changes
File without changes
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import "@optima-chat/growth-cli";
3
+ //# sourceMappingURL=growth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"growth.d.ts","sourceRoot":"","sources":["../../bin/growth.ts"],"names":[],"mappings":";AACA,OAAO,yBAAyB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import "@optima-chat/growth-cli";
3
+ //# sourceMappingURL=growth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"growth.js","sourceRoot":"","sources":["../../bin/growth.ts"],"names":[],"mappings":";AACA,OAAO,yBAAyB,CAAC"}
File without changes
File without changes
File without changes
package/dist/bin/scout.js CHANGED
File without changes
File without changes
File without changes
@@ -0,0 +1,6 @@
1
+ import type { HooksConfig } from "./types.js";
2
+ /**
3
+ * 从 skills 目录加载所有 skill 的 hooks
4
+ */
5
+ export declare function loadSkillHooks(skillsDir: string, cwd: string, getSessionId: () => string | undefined): HooksConfig;
6
+ //# sourceMappingURL=hooks-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-loader.d.ts","sourceRoot":"","sources":["../../src/hooks-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,YAAY,CAAC;AAwL5D;;GAEG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,MAAM,GAAG,SAAS,GACrC,WAAW,CAiFb"}
@@ -0,0 +1,215 @@
1
+ import { readFileSync, readdirSync, existsSync, writeFileSync, mkdirSync } from "fs";
2
+ import { join, dirname } from "path";
3
+ import yaml from "js-yaml";
4
+ import { execSync } from "child_process";
5
+ import { YamlValidator, formatValidationErrors, formatValidationWarning } from "./validation/index.js";
6
+ /**
7
+ * 从 SKILL.md 提取 YAML frontmatter
8
+ */
9
+ function extractYamlFrontmatter(content) {
10
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
11
+ if (!match)
12
+ return null;
13
+ try {
14
+ return yaml.load(match[1]);
15
+ }
16
+ catch (error) {
17
+ console.error("Failed to parse YAML frontmatter:", error);
18
+ return null;
19
+ }
20
+ }
21
+ /**
22
+ * 执行 shell 命令并返回结果
23
+ */
24
+ function executeCommand(command, cwd, skillDir, sessionId) {
25
+ try {
26
+ // 替换环境变量
27
+ const expandedCommand = command
28
+ .replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, skillDir)
29
+ .replace(/\$\{SESSION_ID\}/g, sessionId || 'default');
30
+ const result = execSync(expandedCommand, {
31
+ cwd,
32
+ encoding: "utf-8",
33
+ stdio: ["pipe", "pipe", "pipe"],
34
+ });
35
+ return result.trim();
36
+ }
37
+ catch (error) {
38
+ // 命令失败不阻塞,返回错误信息
39
+ return error.stdout || error.message || "";
40
+ }
41
+ }
42
+ /**
43
+ * 转换 skill hooks 为 SDK hooks 格式
44
+ */
45
+ function convertSkillHooksToSdkHooks(skillHooks, skillDir, cwd, getSessionId, hookType) {
46
+ return skillHooks.map((hookConfig) => ({
47
+ matcher: hookConfig.matcher,
48
+ hooks: hookConfig.hooks.map((hook) => {
49
+ // SDK HookCallback 签名: (input, toolUseID, options) => Promise<HookJSONOutput>
50
+ return async (input, toolUseID, options) => {
51
+ // PreToolUse: 拦截并重定向 planning 文件操作
52
+ if (hookType === "PreToolUse" && input.tool_name && input.tool_input) {
53
+ const toolName = input.tool_name;
54
+ const toolInput = input.tool_input;
55
+ // 处理文件操作工具的路径重定向
56
+ if ((toolName === "Write" || toolName === "Read" || toolName === "Edit") && toolInput.file_path) {
57
+ const filePath = toolInput.file_path;
58
+ if (filePath.includes(".planning/default/")) {
59
+ const sessionId = getSessionId() || "default";
60
+ const updatedPath = filePath.replace(".planning/default/", `.planning/${sessionId}/`);
61
+ console.log(`[hooks-loader] Intercepting and redirecting: ${filePath} -> ${updatedPath}`);
62
+ // 手动执行文件操作并 return,不要继续到 command 部分
63
+ try {
64
+ console.log(`[hooks-loader] Inside try block, toolName=${toolName}`);
65
+ if (toolName === "Write") {
66
+ console.log(`[hooks-loader] Handling Write operation`);
67
+ // 创建目录
68
+ const dir = dirname(updatedPath);
69
+ if (!existsSync(dir)) {
70
+ mkdirSync(dir, { recursive: true });
71
+ }
72
+ // 写入文件
73
+ writeFileSync(updatedPath, toolInput.content || "", "utf-8");
74
+ console.log(`[hooks-loader] File written to ${updatedPath}`);
75
+ // Block 原始工具执行
76
+ return {
77
+ decision: "block",
78
+ systemMessage: `File written to session-specific directory`,
79
+ };
80
+ }
81
+ else if (toolName === "Read") {
82
+ // 读取文件
83
+ if (existsSync(updatedPath)) {
84
+ const content = readFileSync(updatedPath, "utf-8");
85
+ console.log(`[hooks-loader] File read from ${updatedPath}`);
86
+ // Block 原始工具,返回文件内容
87
+ return {
88
+ decision: "block",
89
+ systemMessage: `File content:\n\n${content}`,
90
+ };
91
+ }
92
+ else {
93
+ return {
94
+ decision: "block",
95
+ systemMessage: `File not found: ${updatedPath}`,
96
+ };
97
+ }
98
+ }
99
+ else if (toolName === "Edit") {
100
+ // Edit 需要读取、修改、写入
101
+ if (existsSync(updatedPath)) {
102
+ let content = readFileSync(updatedPath, "utf-8");
103
+ // 执行替换
104
+ if (toolInput.old_string && toolInput.new_string) {
105
+ if (toolInput.replace_all) {
106
+ content = content.split(toolInput.old_string).join(toolInput.new_string);
107
+ }
108
+ else {
109
+ content = content.replace(toolInput.old_string, toolInput.new_string);
110
+ }
111
+ writeFileSync(updatedPath, content, "utf-8");
112
+ console.log(`[hooks-loader] File edited at ${updatedPath}`);
113
+ }
114
+ return {
115
+ decision: "block",
116
+ systemMessage: `File edited successfully`,
117
+ };
118
+ }
119
+ else {
120
+ return {
121
+ decision: "block",
122
+ systemMessage: `File not found: ${updatedPath}`,
123
+ };
124
+ }
125
+ }
126
+ }
127
+ catch (error) {
128
+ console.error(`[hooks-loader] Error:`, error);
129
+ return {
130
+ decision: "block",
131
+ systemMessage: `Error: ${error.message}`,
132
+ };
133
+ }
134
+ }
135
+ }
136
+ }
137
+ if (hook.type === "command") {
138
+ const sessionId = getSessionId();
139
+ const result = executeCommand(hook.command, cwd, skillDir, sessionId);
140
+ // 如果有输出,作为系统消息返回
141
+ if (result) {
142
+ return {
143
+ continue: true,
144
+ systemMessage: result,
145
+ };
146
+ }
147
+ }
148
+ return { continue: true };
149
+ };
150
+ }),
151
+ }));
152
+ }
153
+ /**
154
+ * 从 skills 目录加载所有 skill 的 hooks
155
+ */
156
+ export function loadSkillHooks(skillsDir, cwd, getSessionId) {
157
+ const hooks = {};
158
+ if (!existsSync(skillsDir)) {
159
+ return hooks;
160
+ }
161
+ const skillDirs = readdirSync(skillsDir, { withFileTypes: true })
162
+ .filter((dirent) => dirent.isDirectory())
163
+ .map((dirent) => dirent.name);
164
+ for (const skillName of skillDirs) {
165
+ const skillDir = join(skillsDir, skillName);
166
+ const skillMdPath = join(skillDir, "SKILL.md");
167
+ if (!existsSync(skillMdPath)) {
168
+ continue;
169
+ }
170
+ try {
171
+ const content = readFileSync(skillMdPath, "utf-8");
172
+ // 验证配置文件
173
+ const validator = new YamlValidator();
174
+ const validationResult = validator.validate(content, skillMdPath);
175
+ // 显示错误
176
+ if (!validationResult.valid) {
177
+ console.error(formatValidationErrors(validationResult.errors));
178
+ continue;
179
+ }
180
+ // 显示警告
181
+ if (validationResult.warnings && validationResult.warnings.length > 0) {
182
+ for (const warning of validationResult.warnings) {
183
+ console.warn(formatValidationWarning(warning));
184
+ }
185
+ }
186
+ const frontmatter = extractYamlFrontmatter(content);
187
+ if (!frontmatter?.hooks) {
188
+ continue;
189
+ }
190
+ // 转换各个 hook 事件
191
+ if (frontmatter.hooks.SessionStart) {
192
+ hooks.SessionStart = hooks.SessionStart || [];
193
+ hooks.SessionStart.push(...convertSkillHooksToSdkHooks(frontmatter.hooks.SessionStart, skillDir, cwd, getSessionId, "SessionStart"));
194
+ }
195
+ if (frontmatter.hooks.PreToolUse) {
196
+ hooks.PreToolUse = hooks.PreToolUse || [];
197
+ hooks.PreToolUse.push(...convertSkillHooksToSdkHooks(frontmatter.hooks.PreToolUse, skillDir, cwd, getSessionId, "PreToolUse"));
198
+ }
199
+ if (frontmatter.hooks.PostToolUse) {
200
+ hooks.PostToolUse = hooks.PostToolUse || [];
201
+ hooks.PostToolUse.push(...convertSkillHooksToSdkHooks(frontmatter.hooks.PostToolUse, skillDir, cwd, getSessionId, "PostToolUse"));
202
+ }
203
+ if (frontmatter.hooks.Stop) {
204
+ hooks.Stop = hooks.Stop || [];
205
+ hooks.Stop.push(...convertSkillHooksToSdkHooks(frontmatter.hooks.Stop, skillDir, cwd, getSessionId, "Stop"));
206
+ }
207
+ console.log(`[hooks-loader] Loaded hooks from skill: ${skillName}`);
208
+ }
209
+ catch (error) {
210
+ console.error(`[hooks-loader] Failed to load hooks from ${skillName}:`, error);
211
+ }
212
+ }
213
+ return hooks;
214
+ }
215
+ //# sourceMappingURL=hooks-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-loader.js","sourceRoot":"","sources":["../../src/hooks-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACrF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAoBvG;;GAEG;AACH,SAAS,sBAAsB,CAAC,OAAe;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAyB,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,OAAe,EAAE,GAAW,EAAE,QAAgB,EAAE,SAAkB;IACxF,IAAI,CAAC;QACH,SAAS;QACT,MAAM,eAAe,GAAG,OAAO;aAC5B,OAAO,CAAC,2BAA2B,EAAE,QAAQ,CAAC;aAC9C,OAAO,CAAC,mBAAmB,EAAE,SAAS,IAAI,SAAS,CAAC,CAAC;QAExD,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,EAAE;YACvC,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,iBAAiB;QACjB,OAAO,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;IAC7C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,2BAA2B,CAClC,UAA6B,EAC7B,QAAgB,EAChB,GAAW,EACX,YAAsC,EACtC,QAAgE;IAEhE,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACrC,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACnC,8EAA8E;YAC9E,OAAO,KAAK,EAAE,KAAU,EAAE,SAA6B,EAAE,OAAgC,EAAE,EAAE;gBAC3F,mCAAmC;gBACnC,IAAI,QAAQ,KAAK,YAAY,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;oBACrE,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC;oBACjC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;oBAEnC,iBAAiB;oBACjB,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;wBAChG,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAmB,CAAC;wBAE/C,IAAI,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;4BAC5C,MAAM,SAAS,GAAG,YAAY,EAAE,IAAI,SAAS,CAAC;4BAC9C,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,oBAAoB,EAAE,aAAa,SAAS,GAAG,CAAC,CAAC;4BAEtF,OAAO,CAAC,GAAG,CAAC,gDAAgD,QAAQ,OAAO,WAAW,EAAE,CAAC,CAAC;4BAE1F,oCAAoC;4BACpC,IAAI,CAAC;gCACH,OAAO,CAAC,GAAG,CAAC,6CAA6C,QAAQ,EAAE,CAAC,CAAC;gCAErE,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;oCACzB,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;oCAEvD,OAAO;oCACP,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;oCACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;wCACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oCACtC,CAAC;oCACD,OAAO;oCACP,aAAa,CAAC,WAAW,EAAE,SAAS,CAAC,OAAO,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;oCAC7D,OAAO,CAAC,GAAG,CAAC,kCAAkC,WAAW,EAAE,CAAC,CAAC;oCAE7D,eAAe;oCACf,OAAO;wCACL,QAAQ,EAAE,OAAO;wCACjB,aAAa,EAAE,4CAA4C;qCAC5D,CAAC;gCACJ,CAAC;qCAAM,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;oCAC/B,OAAO;oCACP,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;wCAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;wCACnD,OAAO,CAAC,GAAG,CAAC,iCAAiC,WAAW,EAAE,CAAC,CAAC;wCAE5D,oBAAoB;wCACpB,OAAO;4CACL,QAAQ,EAAE,OAAO;4CACjB,aAAa,EAAE,oBAAoB,OAAO,EAAE;yCAC7C,CAAC;oCACJ,CAAC;yCAAM,CAAC;wCACN,OAAO;4CACL,QAAQ,EAAE,OAAO;4CACjB,aAAa,EAAE,mBAAmB,WAAW,EAAE;yCAChD,CAAC;oCACJ,CAAC;gCACH,CAAC;qCAAM,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;oCAC/B,kBAAkB;oCAClB,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;wCAC5B,IAAI,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;wCAEjD,OAAO;wCACP,IAAI,SAAS,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;4CACjD,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;gDAC1B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;4CAC3E,CAAC;iDAAM,CAAC;gDACN,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;4CACxE,CAAC;4CACD,aAAa,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;4CAC7C,OAAO,CAAC,GAAG,CAAC,iCAAiC,WAAW,EAAE,CAAC,CAAC;wCAC9D,CAAC;wCAED,OAAO;4CACL,QAAQ,EAAE,OAAO;4CACjB,aAAa,EAAE,0BAA0B;yCAC1C,CAAC;oCACJ,CAAC;yCAAM,CAAC;wCACN,OAAO;4CACL,QAAQ,EAAE,OAAO;4CACjB,aAAa,EAAE,mBAAmB,WAAW,EAAE;yCAChD,CAAC;oCACJ,CAAC;gCACH,CAAC;4BACH,CAAC;4BAAC,OAAO,KAAU,EAAE,CAAC;gCACpB,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;gCAC9C,OAAO;oCACL,QAAQ,EAAE,OAAO;oCACjB,aAAa,EAAE,UAAU,KAAK,CAAC,OAAO,EAAE;iCACzC,CAAC;4BACJ,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC5B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;oBACjC,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;oBAEtE,iBAAiB;oBACjB,IAAI,MAAM,EAAE,CAAC;wBACX,OAAO;4BACL,QAAQ,EAAE,IAAI;4BACd,aAAa,EAAE,MAAM;yBACtB,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC5B,CAAC,CAAC;QACJ,CAAC,CAAC;KACH,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,SAAiB,EACjB,GAAW,EACX,YAAsC;IAEtC,MAAM,KAAK,GAAgB,EAAE,CAAC;IAE9B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAC9D,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;SACxC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEhC,KAAK,MAAM,SAAS,IAAI,SAAS,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAE/C,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAEnD,SAAS;YACT,MAAM,SAAS,GAAG,IAAI,aAAa,EAAE,CAAC;YACtC,MAAM,gBAAgB,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAElE,OAAO;YACP,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC/D,SAAS;YACX,CAAC;YAED,OAAO;YACP,IAAI,gBAAgB,CAAC,QAAQ,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtE,KAAK,MAAM,OAAO,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC;oBAChD,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;YAED,MAAM,WAAW,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;YAEpD,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;gBACxB,SAAS;YACX,CAAC;YAED,eAAe;YACf,IAAI,WAAW,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;gBACnC,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;gBAC9C,KAAK,CAAC,YAAY,CAAC,IAAI,CACrB,GAAG,2BAA2B,CAAC,WAAW,CAAC,KAAK,CAAC,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,cAAc,CAAC,CAC5G,CAAC;YACJ,CAAC;YAED,IAAI,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;gBACjC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;gBAC1C,KAAK,CAAC,UAAU,CAAC,IAAI,CACnB,GAAG,2BAA2B,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,YAAY,CAAC,CACxG,CAAC;YACJ,CAAC;YAED,IAAI,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;gBAClC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;gBAC5C,KAAK,CAAC,WAAW,CAAC,IAAI,CACpB,GAAG,2BAA2B,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,aAAa,CAAC,CAC1G,CAAC;YACJ,CAAC;YAED,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;gBAC9B,KAAK,CAAC,IAAI,CAAC,IAAI,CACb,GAAG,2BAA2B,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,CAC5F,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,2CAA2C,SAAS,EAAE,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4CAA4C,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,6 @@
1
+ interface AppProps {
2
+ cwd?: string;
3
+ }
4
+ export declare function App({ cwd }: AppProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=App.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../src/ui/App.tsx"],"names":[],"mappings":"AAcA,UAAU,QAAQ;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,QAAQ,2CAqMpC"}