aico-cli 2.0.76 → 2.1.1

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anthropic-ai/claude-code",
3
- "version": "2.0.76",
3
+ "version": "2.1.1",
4
4
  "bin": {
5
5
  "claude": "cli.js"
6
6
  },
@@ -26,7 +26,8 @@ export type ToolInputSchemas =
26
26
  | TodoWriteInput
27
27
  | WebFetchInput
28
28
  | WebSearchInput
29
- | AskUserQuestionInput;
29
+ | AskUserQuestionInput
30
+ | ConfigInput;
30
31
 
31
32
  export interface AgentInput {
32
33
  /**
@@ -50,7 +51,7 @@ export interface AgentInput {
50
51
  */
51
52
  resume?: string;
52
53
  /**
53
- * Set to true to run this agent in the background. Use TaskOutput to read the output later.
54
+ * Set to true to run this agent in the background. The tool result will include an output_file path - use Read tool or Bash tail to check on output.
54
55
  */
55
56
  run_in_background?: boolean;
56
57
  }
@@ -95,11 +96,11 @@ export interface TaskOutputInput {
95
96
  /**
96
97
  * Whether to wait for completion
97
98
  */
98
- block?: boolean;
99
+ block: boolean;
99
100
  /**
100
101
  * Max wait time in ms
101
102
  */
102
- timeout?: number;
103
+ timeout: number;
103
104
  }
104
105
  export interface ExitPlanModeInput {
105
106
  [k: string]: unknown;
@@ -1484,3 +1485,13 @@ export interface AskUserQuestionInput {
1484
1485
  [k: string]: string;
1485
1486
  };
1486
1487
  }
1488
+ export interface ConfigInput {
1489
+ /**
1490
+ * The setting key (e.g., "theme", "model", "permissions.defaultMode")
1491
+ */
1492
+ setting: string;
1493
+ /**
1494
+ * The new value. Omit to get current value.
1495
+ */
1496
+ value?: string | boolean | number;
1497
+ }
@@ -14,7 +14,7 @@ import { join, dirname, basename } from 'pathe';
14
14
  import { fileURLToPath } from 'node:url';
15
15
  import { EventEmitter } from 'node:events';
16
16
 
17
- const version = "2.0.76";
17
+ const version = "2.1.1";
18
18
 
19
19
  function displayBanner(subtitle) {
20
20
  const defaultSubtitle = "\u4E00\u952E\u914D\u7F6E\u4F60\u7684\u5F00\u53D1\u73AF\u5883";
@@ -4230,10 +4230,16 @@ async function configureCcrWithPreset(preset, _scriptLang) {
4230
4230
  async function restartAndCheckCcrStatus(_scriptLang) {
4231
4231
  try {
4232
4232
  console.log(ansis.cyan("\u91CD\u542F CCR"));
4233
- await execAsync$2("ccr restart", { encoding: "buffer", maxBuffer: 10 * 1024 * 1024 });
4233
+ await execAsync$2("ccr restart", {
4234
+ encoding: "buffer",
4235
+ maxBuffer: 10 * 1024 * 1024
4236
+ });
4234
4237
  console.log(ansis.green("\u2714 CCR \u91CD\u542F\u6210\u529F"));
4235
4238
  console.log(ansis.cyan("\u68C0\u67E5 CCR \u72B6\u6001"));
4236
- const { stdout } = await execAsync$2("ccr status", { encoding: "buffer", maxBuffer: 10 * 1024 * 1024 });
4239
+ const { stdout } = await execAsync$2("ccr status", {
4240
+ encoding: "buffer",
4241
+ maxBuffer: 10 * 1024 * 1024
4242
+ });
4237
4243
  const statusOut = Buffer.isBuffer(stdout) ? stdout.toString("utf8").replace(/\0/g, "") : String(stdout);
4238
4244
  console.log(ansis.gray(statusOut));
4239
4245
  } catch (error) {
@@ -4273,6 +4279,11 @@ async function setupCcrConfiguration(scriptLang = "zh-CN") {
4273
4279
  const existingConfig = readCcrConfig();
4274
4280
  if (existingConfig) {
4275
4281
  await configureCcrProxy(existingConfig);
4282
+ console.log(ansis.bold.cyan("\n\u{1F4CC} CCR \u8FDE\u63A5\u4FE1\u606F:"));
4283
+ console.log(ansis.bold.green(" \u{1F310} CCR \u5730\u5740: http://127.0.0.1:3456"));
4284
+ console.log(ansis.bold.green(" \u{1F511} API \u5BC6\u94A5: sk-aico-x-ccr"));
4285
+ console.log(ansis.gray(" CCR \u5DF2\u914D\u7F6E\uFF0C\u53EF\u76F4\u63A5\u4F7F\u7528"));
4286
+ console.log(ansis.cyan(" \u{1F4A1} \u5982\u9700\u91CD\u65B0\u914D\u7F6E\uFF0C\u8BF7\u8FD0\u884C: ccr ui\n"));
4276
4287
  return true;
4277
4288
  }
4278
4289
  const preset = await selectCcrPreset(scriptLang);
@@ -6026,10 +6037,13 @@ class InstallationComposer {
6026
6037
  await this.executor.executeBatch(companySteps, configOptions);
6027
6038
  const configInstaller = new ConfigInstaller(this.context);
6028
6039
  await configInstaller.applyCompanyConfig();
6029
- updateClaudeConfigEnv({
6030
- ANTHROPIC_BASE_URL: "http://11.0.166.23:13456",
6031
- ANTHROPIC_AUTH_TOKEN: "sk-4730d06849b5fea00f551bd60a0902e1"
6032
- }, "claude");
6040
+ updateClaudeConfigEnv(
6041
+ {
6042
+ ANTHROPIC_BASE_URL: "http://11.0.166.23:13456",
6043
+ ANTHROPIC_AUTH_TOKEN: "sk-4730d06849b5fea00f551bd60a0902e1"
6044
+ },
6045
+ "claude"
6046
+ );
6033
6047
  await this.installToTarget("codebuddy", companySteps, configOptions, {
6034
6048
  ANTHROPIC_BASE_URL: "http://11.0.166.23:13456",
6035
6049
  ANTHROPIC_AUTH_TOKEN: "sk-4730d06849b5fea00f551bd60a0902e1"
@@ -6053,26 +6067,47 @@ class InstallationComposer {
6053
6067
  spinner.start("\u6B63\u5728\u5B89\u88C5\u4E2A\u4EBA\u914D\u7F6E...");
6054
6068
  try {
6055
6069
  await run("npm install -g tsx");
6056
- const installationSteps = [
6057
- INSTALLER_NAMES.CCR,
6058
- INSTALLER_NAMES.CONFIG,
6059
- INSTALLER_NAMES.CCOMETIX_LINE,
6060
- INSTALLER_NAMES.MCP
6061
- ];
6070
+ const ccrInstaller = new CCRInstaller(this.context);
6071
+ const ccrStatus = await ccrInstaller.checkStatus();
6072
+ let installationSteps;
6073
+ let shouldStartCcrUI = false;
6074
+ if (ccrStatus.isInstalled && ccrStatus.hasCorrectPackage) {
6075
+ console.log(ansis.green("\u2714 \u68C0\u6D4B\u5230CCR\u5DF2\u5B89\u88C5\uFF0C\u8DF3\u8FC7CCR\u5B89\u88C5\u6B65\u9AA4"));
6076
+ installationSteps = [
6077
+ INSTALLER_NAMES.CONFIG,
6078
+ INSTALLER_NAMES.CCOMETIX_LINE,
6079
+ INSTALLER_NAMES.MCP
6080
+ ];
6081
+ } else {
6082
+ console.log(ansis.cyan("\u{1F4E6} \u68C0\u6D4B\u5230CCR\u672A\u5B89\u88C5\uFF0C\u5C06\u8FDB\u884C\u5B89\u88C5"));
6083
+ installationSteps = [
6084
+ INSTALLER_NAMES.CCR,
6085
+ INSTALLER_NAMES.CONFIG,
6086
+ INSTALLER_NAMES.CCOMETIX_LINE,
6087
+ INSTALLER_NAMES.MCP
6088
+ ];
6089
+ shouldStartCcrUI = true;
6090
+ }
6062
6091
  const configOptions = {
6063
6092
  ...options,
6064
6093
  silent: true,
6065
6094
  // 静默模式
6066
6095
  force: true
6067
6096
  };
6068
- const results = await this.executor.executeBatch(installationSteps, configOptions);
6069
- if (results[INSTALLER_NAMES.CCR]?.success) {
6097
+ const results = await this.executor.executeBatch(
6098
+ installationSteps,
6099
+ configOptions
6100
+ );
6101
+ if (results[INSTALLER_NAMES.CCR]?.success || ccrStatus.isInstalled) {
6070
6102
  await this.configureCCRForPersonal(true);
6071
6103
  }
6072
- updateClaudeConfigEnv({
6073
- ANTHROPIC_BASE_URL: "http://127.0.0.1:3456",
6074
- ANTHROPIC_AUTH_TOKEN: "sk-aico-x-ccr"
6075
- }, "claude");
6104
+ updateClaudeConfigEnv(
6105
+ {
6106
+ ANTHROPIC_BASE_URL: "http://127.0.0.1:3456",
6107
+ ANTHROPIC_AUTH_TOKEN: "sk-aico-x-ccr"
6108
+ },
6109
+ "claude"
6110
+ );
6076
6111
  const codebuddySteps = [
6077
6112
  INSTALLER_NAMES.CONFIG,
6078
6113
  INSTALLER_NAMES.CCOMETIX_LINE,
@@ -6082,6 +6117,9 @@ class InstallationComposer {
6082
6117
  ANTHROPIC_BASE_URL: "http://127.0.0.1:3456",
6083
6118
  ANTHROPIC_AUTH_TOKEN: "sk-aico-x-ccr"
6084
6119
  });
6120
+ if (shouldStartCcrUI && results[INSTALLER_NAMES.CCR]?.success) {
6121
+ await this.startCcrUIAndShowInfo();
6122
+ }
6085
6123
  this.installCodebuddyCodeSilently();
6086
6124
  this.updateGlobalConfig(true);
6087
6125
  spinner.succeed("\u4E2A\u4EBA\u914D\u7F6E\u5B89\u88C5\u5B8C\u6210");
@@ -6105,7 +6143,9 @@ class InstallationComposer {
6105
6143
  * 不阻塞主流程,静默处理失败
6106
6144
  */
6107
6145
  installCodebuddyCodeSilently() {
6108
- run("npm install -g @anthropic-ai/claude-code @anthropic-ai/claude-code@beta @anthropic-ai/claude-code@canary @anthropic-ai/claude-code@dev @anthropic-ai/claude-code@next @tencent-ai/codebuddy-code").then(() => {
6146
+ run(
6147
+ "npm install -g @anthropic-ai/claude-code @anthropic-ai/claude-code@beta @anthropic-ai/claude-code@canary @anthropic-ai/claude-code@dev @anthropic-ai/claude-code@next @tencent-ai/codebuddy-code"
6148
+ ).then(() => {
6109
6149
  }).catch(() => {
6110
6150
  });
6111
6151
  }
@@ -6141,6 +6181,36 @@ class InstallationComposer {
6141
6181
  */
6142
6182
  async configureCCRForPersonal(silent = false) {
6143
6183
  }
6184
+ /**
6185
+ * 启动CCR UI并显示连接信息
6186
+ */
6187
+ async startCcrUIAndShowInfo() {
6188
+ try {
6189
+ console.log(ansis.cyan("\n\u{1F680} \u6B63\u5728\u542F\u52A8 CCR UI..."));
6190
+ const ccrInstaller = new CCRInstaller(this.context);
6191
+ const result = await ccrInstaller.startUI(true);
6192
+ if (result.success) {
6193
+ console.log(ansis.green("\u2714 CCR UI \u542F\u52A8\u6210\u529F"));
6194
+ console.log(ansis.bold.cyan("\n\u{1F4CC} CCR \u8FDE\u63A5\u4FE1\u606F:"));
6195
+ console.log(ansis.bold.green(" \u{1F310} CCR \u5730\u5740: http://127.0.0.1:3456"));
6196
+ console.log(ansis.bold.green(" \u{1F511} API \u5BC6\u94A5: sk-aico-x-ccr"));
6197
+ console.log(ansis.gray(" \u4F7F\u7528\u6B64 API \u5BC6\u94A5\u767B\u5F55 CCR UI \u8FDB\u884C\u914D\u7F6E"));
6198
+ console.log(ansis.cyan(" \u{1F4A1} \u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u8BBF\u95EE\u4E0A\u8FF0\u5730\u5740\u8FDB\u884C\u914D\u7F6E\n"));
6199
+ } else {
6200
+ console.log(ansis.yellow("\u26A0 CCR UI \u542F\u52A8\u5931\u8D25\uFF0C\u8BF7\u624B\u52A8\u8FD0\u884C: ccr ui"));
6201
+ console.log(ansis.bold.cyan("\n\u{1F4CC} CCR \u8FDE\u63A5\u4FE1\u606F:"));
6202
+ console.log(ansis.bold.green(" \u{1F310} CCR \u5730\u5740: http://127.0.0.1:3456"));
6203
+ console.log(ansis.bold.green(" \u{1F511} API \u5BC6\u94A5: sk-aico-x-ccr"));
6204
+ console.log(ansis.gray(" \u4F7F\u7528\u6B64 API \u5BC6\u94A5\u767B\u5F55 CCR UI \u8FDB\u884C\u914D\u7F6E\n"));
6205
+ }
6206
+ } catch (error) {
6207
+ console.log(ansis.yellow("\u26A0 CCR UI \u542F\u52A8\u5931\u8D25\uFF0C\u8BF7\u624B\u52A8\u8FD0\u884C: ccr ui"));
6208
+ console.log(ansis.bold.cyan("\n\u{1F4CC} CCR \u8FDE\u63A5\u4FE1\u606F:"));
6209
+ console.log(ansis.bold.green(" \u{1F310} CCR \u5730\u5740: http://127.0.0.1:3456"));
6210
+ console.log(ansis.bold.green(" \u{1F511} API \u5BC6\u94A5: sk-aico-x-ccr"));
6211
+ console.log(ansis.gray(" \u4F7F\u7528\u6B64 API \u5BC6\u94A5\u767B\u5F55 CCR UI \u8FDB\u884C\u914D\u7F6E\n"));
6212
+ }
6213
+ }
6144
6214
  /**
6145
6215
  * 更新全局配置
6146
6216
  */
@@ -6182,8 +6252,12 @@ class InstallationComposer {
6182
6252
  }
6183
6253
  }
6184
6254
  }
6185
- console.log(ansis.cyan(`
6186
- \u603B\u8BA1: ${successCount + failureCount} \u9879\uFF0C\u6210\u529F ${successCount}\uFF0C\u5931\u8D25 ${failureCount}`));
6255
+ console.log(
6256
+ ansis.cyan(
6257
+ `
6258
+ \u603B\u8BA1: ${successCount + failureCount} \u9879\uFF0C\u6210\u529F ${successCount}\uFF0C\u5931\u8D25 ${failureCount}`
6259
+ )
6260
+ );
6187
6261
  if (failureCount === 0) {
6188
6262
  console.log(ansis.green("\u{1F389} \u914D\u7F6E\u5B8C\u6210\uFF01"));
6189
6263
  } else {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aico-cli",
3
- "version": "2.0.76",
3
+ "version": "2.1.1",
4
4
  "packageManager": "pnpm@9.15.9",
5
5
  "description": "AI CLI",
6
6
  "repository": {
@@ -41,7 +41,7 @@
41
41
  "hooks:clean": "rimraf templates/hooks/dist templates/hooks/*.js templates/hooks/*.d.ts templates/hooks/*.js.map"
42
42
  },
43
43
  "dependencies": {
44
- "@anthropic-ai/claude-code": "^2.0.76",
44
+ "@anthropic-ai/claude-code": "^2.1.1",
45
45
  "ansis": "^3.17.0",
46
46
  "cac": "^6.7.14",
47
47
  "dayjs": "^1.11.13",
@@ -0,0 +1,158 @@
1
+ ---
2
+ name: tech-spec-analyzer
3
+ description: 技术规格说明书生成指导,指导用户使用 MCP 工具分步生成技术规格说明书
4
+ tools: mcp__tech-spec-generator
5
+ color: blue
6
+ ---
7
+
8
+ # 技术规格说明书生成指导
9
+
10
+ 指导用户使用 MCP 工具分步生成技术规格说明书。
11
+
12
+ ## 🛠️ 可用 MCP 工具
13
+
14
+ ### 项目管理
15
+
16
+ | 工具名 | 说明 |
17
+ | -------------------------- | -------------------------- |
18
+ | `create_tech_spec_project` | 创建项目,返回 projectUuid |
19
+ | `get_project_progress` | 获取项目进度 |
20
+ | `list_tech_spec_projects` | 列出所有项目 |
21
+
22
+ ### 章节保存(可多次调用)
23
+
24
+ | 工具名 | 说明 |
25
+ | ------------------------- | -------------------------- |
26
+ | `save_service_interfaces` | 保存一个服务的接口清单 |
27
+ | `save_interface_design` | 保存一个服务的接口设计详情 |
28
+ | `save_database_table` | 保存一个数据库表结构 |
29
+ | `save_tech_solution` | 保存技术方案 |
30
+ | `save_business_exception` | 保存业务异常处理 |
31
+ | `save_appendix` | 保存附录(异常码、码值) |
32
+
33
+ ### 渲染与分析
34
+
35
+ | 工具名 | 说明 |
36
+ | --------------------------- | -------------------------- |
37
+ | `render_tech_spec_document` | 合并所有章节生成 Word 文档 |
38
+ | `analyze_project_structure` | 分析项目结构 |
39
+ | `analyze_large_project` | 自动分析大型项目 |
40
+
41
+ ## 📋 标准生成流程
42
+
43
+ ### 步骤 1:创建项目
44
+
45
+ ```
46
+ 调用 create_tech_spec_project
47
+ 参数:
48
+ - projectPath: 项目路径
49
+ - projectName: 项目名称
50
+ - moduleName: 模块名称
51
+ 返回:projectUuid(后续步骤必需)
52
+ ```
53
+
54
+ ### 步骤 2:保存服务接口清单
55
+
56
+ 对每个 Controller/Service 调用:
57
+
58
+ ```
59
+ 调用 save_service_interfaces
60
+ 参数:
61
+ - projectUuid: 步骤1返回的UUID
62
+ - serviceType: "REST" 或 "RPC"
63
+ - serviceEnglishName: 类名,如 "UserController"
64
+ - serviceChineseName: 中文名,如 "用户管理"
65
+ - serviceDescription: 服务描述
66
+ - interfaces: JSON字符串,格式:
67
+ [{"functionDescription":"查询用户","serviceName":"UserController","methodName":"getUser"}]
68
+ ```
69
+
70
+ ### 步骤 3:保存接口设计详情
71
+
72
+ 对每个服务调用:
73
+
74
+ ```
75
+ 调用 save_interface_design
76
+ 参数:
77
+ - projectUuid: UUID
78
+ - serviceName: 服务名称
79
+ - serviceDesc: 服务描述
80
+ - designs: JSON字符串,格式:
81
+ [{
82
+ "functionName": "查询用户",
83
+ "interfaceDesc": "根据ID查询用户信息",
84
+ "className": "UserController",
85
+ "methodName": "getUser",
86
+ "parameterList": [{"type":"Long","name":"id","required":"是","desc":"用户ID"}],
87
+ "returnResultList": [{"type":"UserVo","name":"data","desc":"用户信息"}],
88
+ "implementLogic": "1.校验参数 2.查询数据库 3.返回结果"
89
+ }]
90
+ ```
91
+
92
+ ### 步骤 4:保存数据库表结构
93
+
94
+ 对每个表调用:
95
+
96
+ ```
97
+ 调用 save_database_table
98
+ 参数:
99
+ - projectUuid: UUID
100
+ - tableName: 表名,如 "t_user"
101
+ - entityName: 实体名,如 "User"
102
+ - tableDescription: 表描述
103
+ - fields: JSON字符串,格式:
104
+ [{"fieldName":"id","fieldType":"bigint","fieldDescription":"主键","fieldLength":"20"}]
105
+ ```
106
+
107
+ ### 步骤 5:保存技术方案(可选)
108
+
109
+ ```
110
+ 调用 save_tech_solution
111
+ 参数:
112
+ - projectUuid: UUID
113
+ - content: Markdown格式的技术方案内容
114
+ ```
115
+
116
+ ### 步骤 6:保存附录(可选)
117
+
118
+ ```
119
+ 调用 save_appendix
120
+ 参数:
121
+ - projectUuid: UUID
122
+ - exceptionCodes: JSON字符串,格式:
123
+ [{"exceptionCode":"USER_001","exceptionDescription":"用户不存在"}]
124
+ - codeValues: JSON字符串,格式:
125
+ [{"propertyName":"用户状态","codeValue":"1-正常,0-禁用"}]
126
+ ```
127
+
128
+ ### 步骤 7:生成文档
129
+
130
+ ```
131
+ 调用 render_tech_spec_document
132
+ 参数:
133
+ - projectUuid: UUID
134
+ - outputDir: 输出目录(可选)
135
+ 返回:生成的 Word 文档路径
136
+ ```
137
+
138
+ ## ⚡ 快速模式
139
+
140
+ 对于大型项目,可使用自动分析:
141
+
142
+ ```
143
+ 调用 analyze_large_project
144
+ 参数:
145
+ - projectPath: 项目路径
146
+ - projectName: 项目名称(可选)
147
+ - moduleName: 模块名称(可选)
148
+ 返回:projectUuid
149
+
150
+ 然后调用 render_tech_spec_document 生成文档
151
+ ```
152
+
153
+ ## 📝 注意事项
154
+
155
+ 1. **分步保存**:每个服务/表单独调用保存,避免一次传输大量数据
156
+ 2. **JSON 字符串**:复杂参数使用 JSON 字符串格式传递
157
+ 3. **多次调用**:同类型章节可多次调用,系统会自动合并
158
+ 4. **projectUuid**:创建项目后返回,后续所有操作都需要此参数
@@ -0,0 +1,214 @@
1
+ ---
2
+ description: 技术规格说明书生成指挥官,支持单工程和多工程(微服务)合并生成
3
+ allowed-tools: Read(**), Write(.aico/tech/**), mcp__tech-spec-generator
4
+ argument-hint: <工程路径> [工程路径2...] [--name 项目名称] [--exclude 排除模块]
5
+ ---
6
+
7
+ ## 用法
8
+
9
+ `/tech-spec <路径> [选项]`
10
+
11
+ ### 单工程
12
+
13
+ ```bash
14
+ # 分析当前目录
15
+ /tech-spec .
16
+
17
+ # 分析指定工程
18
+ /tech-spec /path/to/project
19
+
20
+ # 指定项目名称
21
+ /tech-spec /path/to/project --name "用户管理系统"
22
+
23
+ # 排除测试模块
24
+ /tech-spec /path/to/project --exclude test,demo
25
+ ```
26
+
27
+ ### 多工程(微服务)
28
+
29
+ 多个工程并行分析,合并生成一本技术规格说明书:
30
+
31
+ ```bash
32
+ # 方式1:给父目录,自动识别子工程
33
+ /tech-spec /path/to/microservices-parent
34
+
35
+ # 方式2:明确指定多个工程路径
36
+ /tech-spec /path/to/user-service /path/to/order-service /path/to/payment-service
37
+
38
+ # 使用别名标识工程(格式:路径:别名)
39
+ /tech-spec /path/to/user-service:用户服务 /path/to/order-service:订单服务
40
+
41
+ # 指定合并后的项目名称
42
+ /tech-spec /path/to/microservices-parent --name "电商微服务系统"
43
+ ```
44
+
45
+ ## 智能体调用
46
+
47
+ ### 单工程模式
48
+
49
+ 调用 `tech-spec-analyzer` 智能体:
50
+
51
+ ```
52
+ tech-spec-analyzer
53
+ ├── projectPath: 工程路径
54
+ ├── projectName: 项目名称
55
+ └── excludeModules: 排除模块
56
+ ```
57
+
58
+ ### 多工程模式(并行分析 → 合并生成)
59
+
60
+ **并行调用多个 `tech-spec-analyzer` 智能体**分析各工程:
61
+
62
+ ```
63
+ ┌─────────────────────────────────────────────────────┐
64
+ │ 并行执行 │
65
+ ├─────────────────────────────────────────────────────┤
66
+ │ tech-spec-analyzer(用户服务) ──┐ │
67
+ │ tech-spec-analyzer(订单服务) ──┼── 等待所有完成 │
68
+ │ tech-spec-analyzer(支付服务) ──┘ │
69
+ └─────────────────────────────────────────────────────┘
70
+
71
+ 合并分析结果
72
+
73
+ 生成一本技术规格说明书
74
+ ```
75
+
76
+ ## 执行流程
77
+
78
+ ### 阶段一:参数解析与工程识别
79
+
80
+ 1. 解析输入路径
81
+ 2. **判断路径类型**:
82
+ - 单个工程(有 pom.xml/package.json/build.gradle)
83
+ - 父目录(包含多个子工程)
84
+ - 多个明确指定的工程路径
85
+ 3. **自动识别子工程**(父目录模式):
86
+ ```
87
+ 扫描子目录,识别包含以下文件的为独立工程:
88
+ - pom.xml(Java Maven)
89
+ - build.gradle(Java Gradle)
90
+ - package.json(Node.js)
91
+ ```
92
+ 4. 解析工程别名和选项参数
93
+
94
+ ### 阶段二:并行分析
95
+
96
+ **单工程**:
97
+
98
+ ```
99
+ 调用 tech-spec-analyzer 智能体
100
+ └── analyze_full_project → 生成文档
101
+ ```
102
+
103
+ **多工程**:
104
+
105
+ ```
106
+ 并行调用 N 个 tech-spec-analyzer 智能体(仅分析,不生成文档)
107
+ ├── 智能体1 → 分析用户服务 → 返回 serviceInterfaceList, tableInfoList
108
+ ├── 智能体2 → 分析订单服务 → 返回 serviceInterfaceList, tableInfoList
109
+ └── 智能体N → 分析支付服务 → 返回 serviceInterfaceList, tableInfoList
110
+ 等待所有智能体完成
111
+ ```
112
+
113
+ ### 阶段三:合并生成(多工程)
114
+
115
+ 收集所有智能体的分析结果,合并后生成一本文档:
116
+
117
+ ```
118
+ 合并规则:
119
+ 1. 服务接口:添加工程前缀 [用户服务] UserController
120
+ 2. 数据表:添加工程前缀 [用户服务] t_user
121
+ 3. 重新编号:合并后统一编号
122
+ 4. 生成统一文档
123
+ ```
124
+
125
+ ### 阶段四:结果展示
126
+
127
+ **单工程结果**:
128
+
129
+ ```markdown
130
+ ## 📄 技术规格说明书生成完成
131
+
132
+ **项目**:{projectName}
133
+ **文档路径**:{outputPath}
134
+
135
+ | 统计项 | 数量 |
136
+ | -------- | -------------- |
137
+ | 服务接口 | {serviceCount} |
138
+ | 数据表 | {tableCount} |
139
+ ```
140
+
141
+ **多工程结果**:
142
+
143
+ ```markdown
144
+ ## 📄 微服务技术规格说明书生成完成
145
+
146
+ **项目**:{projectName}
147
+ **文档路径**:{outputPath}
148
+
149
+ ### 各工程统计
150
+
151
+ | 工程 | 服务接口 | 数据表 |
152
+ | -------- | -------- | ------ |
153
+ | 用户服务 | 12 | 8 |
154
+ | 订单服务 | 15 | 10 |
155
+ | 支付服务 | 8 | 5 |
156
+ | **合计** | **35** | **23** |
157
+
158
+ 已合并生成一本技术规格说明书。
159
+ ```
160
+
161
+ ## 流程可视化
162
+
163
+ ```mermaid
164
+ graph TD
165
+ A[用户输入路径] --> B{路径类型判断}
166
+
167
+ B -->|单工程| C[tech-spec-analyzer]
168
+ C --> D[analyze_full_project]
169
+ D --> E[生成文档]
170
+
171
+ B -->|父目录| F[扫描识别子工程]
172
+ F --> G{发现多个工程?}
173
+ G -->|是| H[并行调用智能体]
174
+ G -->|否| C
175
+
176
+ B -->|多个路径| H
177
+
178
+ H --> I1[智能体1: 分析工程1]
179
+ H --> I2[智能体2: 分析工程2]
180
+ H --> I3[智能体N: 分析工程N]
181
+ I1 --> J[等待所有完成]
182
+ I2 --> J
183
+ I3 --> J
184
+ J --> K[合并分析结果]
185
+ K --> L[生成合并文档]
186
+
187
+ E --> M[展示结果]
188
+ L --> M
189
+ ```
190
+
191
+ ## MCP 工具说明
192
+
193
+ ### analyze_project_structure
194
+
195
+ 扫描工程目录,识别文件类型和模块。
196
+
197
+ ### analyze_full_project
198
+
199
+ 完整分析工程并生成技术规格说明书。
200
+
201
+ **参数**:
202
+
203
+ - `projectPath`: 工程根目录(必填)
204
+ - `projectName`: 项目名称(可选)
205
+ - `moduleName`: 模块名称(可选)
206
+ - `excludeModules`: 排除的模块列表(可选)
207
+
208
+ ## 输出
209
+
210
+ 文档保存到 `.aico/tech/` 目录:
211
+
212
+ ```
213
+ 技术规格说明书_{项目名}_{模块名}_{时间戳}.docx
214
+ ```
@@ -4,6 +4,8 @@
4
4
  "DISABLE_TELEMETRY": "1",
5
5
  "DISABLE_ERROR_REPORTING": "1",
6
6
  "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
7
+ "CLAUDE_CODE_MAX_OUTPUT_TOKENS": "64000",
8
+ "MAX_THINKING_TOKENS": "31999",
7
9
  "ANTHROPIC_BASE_URL": "http://127.0.0.1:3456",
8
10
  "ANTHROPIC_AUTH_TOKEN": "sk-aico-x-ccr"
9
11
  },
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 五域科技
3
+ Copyright (c) 2025 智能软件星工厂
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 智能软件星工厂
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.