aico-cli 0.2.2 → 0.2.5

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.
@@ -0,0 +1,472 @@
1
+ #!/usr/bin/env bash
2
+ # 需求场景识别智能体 - 跨平台实用函数库
3
+ # 支持 Windows (Git Bash/Cygwin/WSL)、Linux、macOS
4
+
5
+ # 平台检测函数
6
+ detect_platform() {
7
+ case "$(uname -s)" in
8
+ Darwin)
9
+ PLATFORM="macos"
10
+ ;;
11
+ Linux)
12
+ PLATFORM="linux"
13
+ ;;
14
+ CYGWIN*|MINGW*|MSYS*)
15
+ PLATFORM="windows"
16
+ ;;
17
+ *)
18
+ PLATFORM="unknown"
19
+ ;;
20
+ esac
21
+ echo "检测到平台: $PLATFORM"
22
+ }
23
+
24
+ # 跨平台临时目录
25
+ get_temp_dir() {
26
+ case "$PLATFORM" in
27
+ windows)
28
+ # Windows: 使用用户临时目录
29
+ if [ -n "$TEMP" ]; then
30
+ echo "$TEMP"
31
+ elif [ -n "$TMP" ]; then
32
+ echo "$TMP"
33
+ else
34
+ echo "/tmp"
35
+ fi
36
+ ;;
37
+ *)
38
+ # Linux/macOS: 使用标准临时目录
39
+ echo "/tmp"
40
+ ;;
41
+ esac
42
+ }
43
+
44
+ # 跨平台文件路径处理
45
+ normalize_path() {
46
+ local path="$1"
47
+ case "$PLATFORM" in
48
+ windows)
49
+ # 将路径转换为 Windows 兼容格式
50
+ echo "$path" | sed 's|/|\\|g'
51
+ ;;
52
+ *)
53
+ echo "$path"
54
+ ;;
55
+ esac
56
+ }
57
+
58
+ # 信息收集函数
59
+ collect_context() {
60
+ echo "📋 收集需求上下文信息..."
61
+
62
+ # 用户输入
63
+ USER_INPUT="$1"
64
+ echo "用户输入: $USER_INPUT"
65
+
66
+ # 对话历史(最近10条)
67
+ local conversation_log=""
68
+ case "$PLATFORM" in
69
+ windows)
70
+ conversation_log="$USERPROFILE/.claude/conversation.log"
71
+ ;;
72
+ *)
73
+ conversation_log="$HOME/.claude/conversation.log"
74
+ ;;
75
+ esac
76
+
77
+ if [ -f "$conversation_log" ]; then
78
+ DIALOG_HISTORY=$(tail -n 10 "$conversation_log" 2>/dev/null || head -n 10 "$conversation_log")
79
+ echo "对话上下文已加载"
80
+ else
81
+ DIALOG_HISTORY="无可用对话历史"
82
+ fi
83
+
84
+ # 项目背景
85
+ if [ -f "CLAUDE.md" ]; then
86
+ PROJECT_CONTEXT=$(head -n 50 CLAUDE.md 2>/dev/null || sed -n '1,50p' CLAUDE.md)
87
+ echo "项目配置文件已加载"
88
+ else
89
+ PROJECT_CONTEXT="未找到CLAUDE.md,请确保项目根目录存在此文件"
90
+ fi
91
+ }
92
+
93
+ # 需求要素提取函数
94
+ extract_requirements() {
95
+ local input="$1"
96
+
97
+ # 使用兼容的正则表达式
98
+ # 提取角色(谁需要)
99
+ if echo "$input" | grep -q -E "(用户|客户|管理员|开发者)"; then
100
+ ROLE=$(echo "$input" | grep -o -E "(用户|客户|管理员|开发者)" | head -1)
101
+ fi
102
+
103
+ # 提取目标(要做什么)
104
+ if echo "$input" | grep -q -E "(实现|开发|添加|创建|优化|修复)"; then
105
+ GOAL=$(echo "$input" | grep -o -E "(实现|开发|添加|创建|优化|修复)[^,。]*")
106
+ fi
107
+
108
+ # 提取验收条件(如何验证)
109
+ if echo "$input" | grep -q -E "(能够|可以|支持|满足|达到)"; then
110
+ ACCEPTANCE=$(echo "$input" | grep -o -E "(能够|可以|支持|满足|达到)[^,。]*")
111
+ fi
112
+ }
113
+
114
+ # 工程分析函数 - 分析项目现状
115
+ explore_project() {
116
+ echo "🔍 分析项目现状..."
117
+
118
+ # 检查项目结构
119
+ local project_structure=""
120
+ if [ -d "src" ]; then
121
+ project_structure="$(find src -type f -name "*.js" -o -name "*.ts" -o -name "*.py" -o -name "*.java" 2>/dev/null | head -10 | tr '\n' ',' | sed 's/,$//')"
122
+ elif [ -d "lib" ]; then
123
+ project_structure="$(find lib -type f -name "*.js" -o -name "*.ts" -o -name "*.py" -o -name "*.java" 2>/dev/null | head -10 | tr '\n' ',' | sed 's/,$//')"
124
+ else
125
+ project_structure="$(find . -maxdepth 2 -type f -name "*.js" -o -name "*.ts" -o -name "*.py" -o -name "*.java" 2>/dev/null | head -10 | tr '\n' ',' | sed 's/,$//')"
126
+ fi
127
+
128
+ # 检查配置文件
129
+ local config_files=""
130
+ if [ -f "package.json" ]; then
131
+ config_files="package.json"
132
+ fi
133
+ if [ -f "requirements.txt" ]; then
134
+ config_files="$config_files,requirements.txt"
135
+ fi
136
+ if [ -f "pom.xml" ]; then
137
+ config_files="$config_files,pom.xml"
138
+ fi
139
+
140
+ local modules=$(identify_project_modules)
141
+ echo "项目结构: ${project_structure:-未知}"
142
+ echo "配置文件: ${config_files:-无}"
143
+ echo "主要模块: $modules"
144
+ }
145
+
146
+ # 模块识别函数
147
+ identify_project_modules() {
148
+ local modules=""
149
+
150
+ # 检查常见的模块目录
151
+ if [ -d "src/components" ] || [ -d "src/modules" ]; then
152
+ modules="前端组件"
153
+ fi
154
+
155
+ if [ -d "src/services" ] || [ -d "src/api" ]; then
156
+ modules="${modules:+$modules,}API服务"
157
+ fi
158
+
159
+ if [ -d "src/utils" ] || [ -d "src/helpers" ]; then
160
+ modules="${modules:+$modules,}工具函数"
161
+ fi
162
+
163
+ if [ -d "src/models" ] || [ -d "src/entities" ]; then
164
+ modules="${modules:+$modules,}数据模型"
165
+ fi
166
+
167
+ if [ -d "tests" ] || [ -d "src/__tests__" ]; then
168
+ modules="${modules:+$modules,}测试模块"
169
+ fi
170
+
171
+ # 如果没有识别到特定模块,根据文件类型判断
172
+ if [ -z "$modules" ]; then
173
+ if find . -name "*.js" -o -name "*.ts" -o -name "*.jsx" -o -name "*.tsx" | head -1 > /dev/null 2>&1; then
174
+ modules="前端应用"
175
+ elif find . -name "*.py" | head -1 > /dev/null 2>&1; then
176
+ modules="Python应用"
177
+ elif find . -name "*.java" | head -1 > /dev/null 2>&1; then
178
+ modules="Java应用"
179
+ fi
180
+ fi
181
+
182
+ echo "${modules:-通用应用}"
183
+ }
184
+
185
+ # 深度意图分析函数
186
+ analyze_intent_deeply() {
187
+ local input="$1"
188
+
189
+ # 第一阶段:初步关键词识别(用于快速分类)
190
+ local preliminary_type=""
191
+ if echo "$input" | grep -q -E "(错误|问题|修复|bug|故障|异常)"; then
192
+ preliminary_type="问题修复"
193
+ elif echo "$input" | grep -q -E "(文档|说明|手册|指南|帮助|如何|怎样)"; then
194
+ preliminary_type="文档咨询"
195
+ elif echo "$input" | grep -q -E "(优化|性能|速度|效率|体验|界面|ui|ux)"; then
196
+ preliminary_type="体验优化"
197
+ fi
198
+
199
+ # 第二阶段:工程分析(针对功能相关需求)
200
+ if [ -z "$preliminary_type" ] || echo "$input" | grep -q -E "(开发|实现|添加|创建|修改|调整|改进|更新)"; then
201
+ explore_project
202
+
203
+ # 基于工程分析判断是新增还是修改
204
+ if echo "$input" | grep -q -E "(修改|调整|改进|更新|重构|enhance|update|refactor)"; then
205
+ INTENT_TYPE="功能修改"
206
+ echo "识别到需求类型: 功能修改 (基于明确的修改关键词)"
207
+ else
208
+ # 需要进一步分析工程现状
209
+ if [ -d "src" ] || [ -d "lib" ] || [ -f "package.json" ] || [ -f "requirements.txt" ] || [ -f "pom.xml" ]; then
210
+ INTENT_TYPE="功能修改"
211
+ echo "识别到需求类型: 功能修改 (基于现有工程结构)"
212
+ else
213
+ INTENT_TYPE="功能新增"
214
+ echo "识别到需求类型: 功能新增 (基于空项目或新项目)"
215
+ fi
216
+ fi
217
+ else
218
+ INTENT_TYPE="$preliminary_type"
219
+ echo "识别到需求类型: $INTENT_TYPE"
220
+ fi
221
+
222
+ extract_requirements "$input"
223
+ }
224
+
225
+ # 分析函数(兼容旧接口)
226
+ analyze_requirement() {
227
+ analyze_intent_deeply "$1"
228
+ }
229
+
230
+ # 确认模板生成函数
231
+ generate_confirmation() {
232
+ local requirement="$1"
233
+ local intent="$2"
234
+
235
+ # 根据意图类型生成不同的确认描述
236
+ local action_desc=""
237
+ case "$intent" in
238
+ "功能新增")
239
+ action_desc="开发全新的功能模块"
240
+ ;;
241
+ "功能修改")
242
+ action_desc="对现有功能进行迭代优化"
243
+ ;;
244
+ "问题修复")
245
+ action_desc="修复系统中的缺陷和问题"
246
+ ;;
247
+ "体验优化")
248
+ action_desc="提升系统性能和用户体验"
249
+ ;;
250
+ "文档咨询")
251
+ action_desc="提供技术文档和咨询服务"
252
+ ;;
253
+ *)
254
+ action_desc="处理您的需求"
255
+ ;;
256
+ esac
257
+
258
+ cat << EOF
259
+
260
+ ## 📋 需求理解确认
261
+
262
+ ### 🎯 核心需求
263
+ 基于工程分析和您的描述,我理解您需要:
264
+ [用一句话概括需求的核心目标]
265
+
266
+ ### 📖 详细描述
267
+ 我将为您$action_desc:
268
+ - 基于当前项目结构进行开发/修改
269
+ - 解决 [问题描述]
270
+ - 达到 [预期效果]
271
+
272
+ ### 🔍 工程分析结果
273
+ - **项目类型**: $(if [ -d "src" ] || [ -d "lib" ]; then echo "现有项目"; else echo "新项目"; fi)
274
+ - **技术栈**: $(if [ -f "package.json" ]; then echo "Node.js"; elif [ -f "requirements.txt" ]; then echo "Python"; elif [ -f "pom.xml" ]; then echo "Java"; else echo "未知"; fi)
275
+ - **涉及模块**: [主要模块]
276
+
277
+ ### ❓ 需要澄清的问题
278
+ [如果有任何不确定的地方,列出具体问题]
279
+
280
+ ---
281
+ **请确认:以上基于工程分析的理解是否准确?如果正确,请回复"确认"或"正确",我将为您生成正式的共识文档。**
282
+ EOF
283
+ }
284
+
285
+ # 确认响应处理
286
+ handle_confirmation() {
287
+ local response="$1"
288
+
289
+ # 确认关键词检测 - 使用兼容的正则
290
+ if echo "$response" | grep -q -E "(确认|正确|是的|没问题|ok|yes|确定)"; then
291
+ echo "✅ 需求已确认,开始生成共识文档..."
292
+ generate_consensus_document
293
+ return 0
294
+ elif echo "$response" | grep -q -E "(不对|错误|不是|no|重新)"; then
295
+ echo "🔄 理解有误,请重新描述您的需求"
296
+ return 1
297
+ else
298
+ echo "❓ 未能确认您的意图,请明确回复"确认"或指出需要修改的地方"
299
+ return 2
300
+ fi
301
+ }
302
+
303
+ # 文档生成函数
304
+ generate_consensus_document() {
305
+ # 使用兼容的文件名处理
306
+ local req_name=$(echo "$REQUIREMENT_DESC" | head -c 20 | tr ' ' '_' | tr -cd '[:alnum:]_-')
307
+ local doc_dir=".aico/docs/$req_name"
308
+
309
+ # 创建文档目录
310
+ mkdir -p "$doc_dir"
311
+
312
+ # 跨平台日期格式
313
+ local current_date
314
+ case "$PLATFORM" in
315
+ windows)
316
+ current_date=$(date "+%Y-%m-%d %H:%M:%S" 2>/dev/null || echo "$(date +'%Y-%m-%d %H:%M:%S')")
317
+ ;;
318
+ *)
319
+ current_date=$(date '+%Y-%m-%d %H:%M:%S')
320
+ ;;
321
+ esac
322
+
323
+ # 生成包含工程分析信息的共识文档
324
+ cat > "$doc_dir/共识文档.md" << EOF
325
+ # 需求共识文档 - $req_name
326
+
327
+ **文档版本**:1.0
328
+ **创建时间**:$current_date
329
+ **需求状态**:已确认
330
+ **需求类型**:$INTENT_TYPE
331
+
332
+ ## 📋 原始需求
333
+ $REQUIREMENT_DESC
334
+
335
+ ## 🔍 工程分析结果
336
+ **项目结构分析**:
337
+ - 项目类型: $(if [ -d "src" ] || [ -d "lib" ]; then echo "现有项目"; else echo "新项目"; fi)
338
+ - 技术栈: $(if [ -f "package.json" ]; then echo "Node.js"; elif [ -f "requirements.txt" ]; then echo "Python"; elif [ -f "pom.xml" ]; then echo "Java"; else echo "未知"; fi)
339
+ - 主要模块: $(identify_project_modules)
340
+
341
+ **意图识别依据**:
342
+ - 关键词分析: $(echo "$REQUIREMENT_DESC" | grep -o -E "(开发|实现|添加|创建|修改|调整|修复|优化|文档)" | head -3 | tr '\n' ',' | sed 's/,$//')
343
+ - 工程上下文: $(if [ -d "src" ] || [ -d "lib" ]; then echo "现有代码库"; else echo "新建项目"; fi)
344
+
345
+ ## 🎯 确认后的需求理解
346
+ [基于用户确认和工程分析的详细需求描述]
347
+
348
+ ## 🛠️ 实施建议
349
+ 基于工程分析,建议采用以下策略:
350
+ $(case "$INTENT_TYPE" in
351
+ "功能新增") echo "- 创建新的功能模块和组件" ;;
352
+ "功能修改") echo "- 在现有架构基础上进行迭代开发" ;;
353
+ "问题修复") echo "- 定位并修复现有代码中的缺陷" ;;
354
+ "体验优化") echo "- 优化现有功能的性能和用户体验" ;;
355
+ "文档咨询") echo "- 提供详细的技术文档和使用指南" ;;
356
+ *) echo "- 根据具体需求制定实施方案" ;;
357
+ esac)
358
+
359
+ EOF
360
+
361
+ echo "📄 共识文档已生成至: $doc_dir/共识文档.md"
362
+ echo "🚀 是否需要我基于此文档开始进行任务分解或代码开发?"
363
+ }
364
+
365
+ # 状态文件处理
366
+ set_requirement_status() {
367
+ local status="$1"
368
+ local temp_dir=$(get_temp_dir)
369
+ local status_file="$temp_dir/requirement_status"
370
+
371
+ echo "$status" > "$status_file"
372
+ echo "状态已更新: $status"
373
+ }
374
+
375
+ get_requirement_status() {
376
+ local temp_dir=$(get_temp_dir)
377
+ local status_file="$temp_dir/requirement_status"
378
+
379
+ if [ -f "$status_file" ]; then
380
+ cat "$status_file"
381
+ else
382
+ echo "暂无正在处理的需求"
383
+ fi
384
+ }
385
+
386
+ # 主流程执行函数
387
+ main_workflow() {
388
+ local user_input="$1"
389
+
390
+ # 初始化平台检测
391
+ detect_platform
392
+
393
+ # 阶段1: 信息收集
394
+ collect_context "$user_input"
395
+
396
+ # 阶段2: 分析与识别
397
+ analyze_requirement "$user_input"
398
+
399
+ # 阶段3: 复述与确认
400
+ generate_confirmation "$user_input" "$INTENT_TYPE"
401
+
402
+ # 记录等待确认状态
403
+ set_requirement_status "CONFIRMATION_PENDING"
404
+ }
405
+
406
+ # 确认响应处理函数
407
+ process_confirmation() {
408
+ local response="$1"
409
+ local status=$(handle_confirmation "$response")
410
+
411
+ case $status in
412
+ 0) # 已确认
413
+ echo "✅ 共识文档生成完成"
414
+ set_requirement_status "DOCUMENT_GENERATED"
415
+ ;;
416
+ 1) # 需要重新理解
417
+ echo "🔄 请重新描述您的需求"
418
+ set_requirement_status "NEEDS_REDESCRIPTION"
419
+ ;;
420
+ 2) # 确认不明确
421
+ echo "❓ 请明确回复'确认'或指出需要修改的地方"
422
+ set_requirement_status "CONFIRMATION_UNCLEAR"
423
+ ;;
424
+ esac
425
+ }
426
+
427
+ # 异常处理函数
428
+ handle_ambiguous_requirement() {
429
+ echo "🤔 您的需求描述比较模糊,请帮助我理解:"
430
+ echo "1. 这个需求要解决什么具体问题?"
431
+ echo "2. 期望达到什么样的效果?"
432
+ echo "3. 有哪些必须包含的功能点?"
433
+ echo "请详细描述,我会更好地为您服务。"
434
+ }
435
+
436
+ handle_technical_limitation() {
437
+ echo "⚠️ 这个需求涉及的技术超出了我当前的能力范围。"
438
+ echo "建议:"
439
+ echo "- 考虑简化需求或分阶段实施"
440
+ echo "- 寻求专业开发团队的支持"
441
+ echo "- 使用现有的成熟解决方案"
442
+ echo "我可以帮您分析替代方案,请告诉我您的具体约束条件。"
443
+ }
444
+
445
+ handle_requirement_conflict() {
446
+ echo "⚖️ 检测到需求中存在潜在的冲突点:"
447
+ echo "- [冲突点1描述]"
448
+ echo "- [冲突点2描述]"
449
+ echo "请帮助我确定优先级:"
450
+ echo "1. 哪个需求更重要?"
451
+ echo "2. 是否有折中方案?"
452
+ echo "3. 是否需要分阶段实现?"
453
+ }
454
+
455
+ # 状态查询命令
456
+ requirement_status() {
457
+ get_requirement_status
458
+ }
459
+
460
+ # 后续行动建议
461
+ suggest_next_actions() {
462
+ echo "🎉 共识文档已生成!接下来您可以:"
463
+ echo "1. 📋 进行任务分解:将需求拆分为可执行的任务"
464
+ echo "2. 💻 开始代码开发:基于共识文档实现功能"
465
+ echo "3. 🧪 制定测试计划:编写验收测试用例"
466
+ echo "4. 📊 评估资源需求:分析所需时间和资源"
467
+ echo "请告诉我您希望进行哪项工作?"
468
+ }
469
+
470
+ # 初始化
471
+ detect_platform
472
+ echo "✅ 跨平台需求场景识别智能体函数库已加载 (支持 Windows/Linux/macOS)"