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.
- package/bin/cli/cli.js +3061 -2910
- package/bin/cli/package.json +1 -1
- package/bin/cli/sdk-tools.d.ts +15 -4
- package/dist/chunks/simple-config.mjs +96 -22
- package/package.json +2 -2
- package/templates/agents/aico/tech-spec/tech-spec-analyzer.md +158 -0
- package/templates/commands/aico/tech-spec.md +214 -0
- package/templates/settings.json +2 -0
- package/templates/skills/tech-whitepaper/LICENSE.txt +1 -1
- package/templates/skills/word-document-processor/LICENSE.txt +21 -0
- package/templates/skills/word-document-processor/SKILL.md +171 -0
- package/templates/skills/word-document-processor/references/template-syntax.md +187 -0
- package/templates/skills/word-document-processor/scripts/docx-processor.ts +206 -0
package/bin/cli/package.json
CHANGED
package/bin/cli/sdk-tools.d.ts
CHANGED
|
@@ -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.
|
|
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
|
|
99
|
+
block: boolean;
|
|
99
100
|
/**
|
|
100
101
|
* Max wait time in ms
|
|
101
102
|
*/
|
|
102
|
-
timeout
|
|
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.
|
|
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", {
|
|
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", {
|
|
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
|
-
|
|
6031
|
-
|
|
6032
|
-
|
|
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
|
|
6057
|
-
|
|
6058
|
-
|
|
6059
|
-
|
|
6060
|
-
|
|
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(
|
|
6069
|
-
|
|
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
|
-
|
|
6074
|
-
|
|
6075
|
-
|
|
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(
|
|
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(
|
|
6186
|
-
|
|
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.
|
|
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.
|
|
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
|
+
```
|
package/templates/settings.json
CHANGED
|
@@ -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
|
},
|
|
@@ -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.
|