aico-cli 2.0.75 → 2.0.77
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 +2 -1
- package/bin/cli/cli.js +789 -789
- package/bin/cli/package.json +1 -1
- package/dist/chunks/simple-config.mjs +3 -2
- package/dist/cli.mjs +66 -1
- package/package.json +2 -2
- package/templates/agents/aico/tech-spec/tech-spec-analyzer.md +158 -0
- package/templates/claude/settings.json +6 -6
- package/templates/commands/aico/tech-spec.md +214 -0
- package/templates/settings.json +8 -6
- 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
|
@@ -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.
|
|
17
|
+
const version = "2.0.77";
|
|
18
18
|
|
|
19
19
|
function displayBanner(subtitle) {
|
|
20
20
|
const defaultSubtitle = "\u4E00\u952E\u914D\u7F6E\u4F60\u7684\u5F00\u53D1\u73AF\u5883";
|
|
@@ -4505,9 +4505,10 @@ const COMETIX_COMMANDS = {
|
|
|
4505
4505
|
};
|
|
4506
4506
|
|
|
4507
4507
|
function getPlatformStatusLineConfig() {
|
|
4508
|
+
const command = `node -e "require('child_process').execSync(require('path').join(require('os').homedir(), '.claude/ccline/ccline${isWindows() ? ".exe" : ""}'), {stdio: 'inherit'})"`;
|
|
4508
4509
|
return {
|
|
4509
4510
|
type: "command",
|
|
4510
|
-
command
|
|
4511
|
+
command,
|
|
4511
4512
|
padding: 0
|
|
4512
4513
|
};
|
|
4513
4514
|
}
|
package/dist/cli.mjs
CHANGED
|
@@ -303,6 +303,31 @@ async function startClaudeCodeEditor(_lang) {
|
|
|
303
303
|
throw error;
|
|
304
304
|
}
|
|
305
305
|
}
|
|
306
|
+
async function startClaudeCodeWithPrompt(prompt) {
|
|
307
|
+
try {
|
|
308
|
+
const isWindows = process.platform === "win32";
|
|
309
|
+
const spawnOptions = {
|
|
310
|
+
stdio: "inherit",
|
|
311
|
+
cwd: process.cwd(),
|
|
312
|
+
shell: false
|
|
313
|
+
};
|
|
314
|
+
const localCheck = await checkLocalClaudeCode();
|
|
315
|
+
if (localCheck.exists) {
|
|
316
|
+
const command = isWindows ? "node.exe" : "node";
|
|
317
|
+
const args = [localCheck.path, "--dangerously-skip-permissions", "-p", prompt];
|
|
318
|
+
await tryStartClaude(command, args, spawnOptions);
|
|
319
|
+
} else {
|
|
320
|
+
const command = isWindows ? "claude.cmd" : "claude";
|
|
321
|
+
const args = ["--dangerously-skip-permissions", "-p", prompt];
|
|
322
|
+
await tryStartClaude(command, args, spawnOptions);
|
|
323
|
+
}
|
|
324
|
+
} catch (error) {
|
|
325
|
+
console.error(ansis.red("\u274C \u542F\u52A8\u4EE3\u7801\u7F16\u8F91\u5668\u5931\u8D25:"));
|
|
326
|
+
console.error(ansis.gray(` \u9519\u8BEF: ${error.message || error}`));
|
|
327
|
+
processManager.cleanup();
|
|
328
|
+
throw error;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
306
331
|
async function startClaudeCodeEditorWithSkipPermissions() {
|
|
307
332
|
try {
|
|
308
333
|
const isWindows = process.platform === "win32";
|
|
@@ -477,7 +502,7 @@ async function handleMenuContinuation(choice) {
|
|
|
477
502
|
}
|
|
478
503
|
|
|
479
504
|
function setupCommands(cli) {
|
|
480
|
-
cli.command("", "\u542F\u52A8\u4EE3\u7801\u7F16\u8F91\u5668\uFF08\u9ED8\u8BA4\uFF09").option("--start", "\u53EA\u542F\u52A8\u4EE3\u7801\u7F16\u8F91\u5668").option("--menu", "\u663E\u793A\u4EA4\u4E92\u5F0F\u83DC\u5355").option("--init", "\u53EA\u5B89\u88C5\u516C\u53F8\u914D\u7F6E").option("--update", "\u53EA\u66F4\u65B0\u5F53\u524D\u914D\u7F6E").option("--company", "\u914D\u7F6E\u516C\u53F8\u914D\u7F6E").option("--personal", "\u914D\u7F6E\u4E2A\u4EBA\u914D\u7F6E").option("--ui", "\u542F\u52A8\u53EF\u89C6\u5316\u9875\u9762").option("--help", "\u663E\u793A\u5E2E\u52A9\u4FE1\u606F").action(async (options) => {
|
|
505
|
+
cli.command("[prompt]", "\u542F\u52A8\u4EE3\u7801\u7F16\u8F91\u5668\uFF08\u9ED8\u8BA4\uFF09\uFF0C\u53EF\u76F4\u63A5\u4F20\u5165\u63D0\u793A\u8BCD").option("--start", "\u53EA\u542F\u52A8\u4EE3\u7801\u7F16\u8F91\u5668").option("--menu", "\u663E\u793A\u4EA4\u4E92\u5F0F\u83DC\u5355").option("--init", "\u53EA\u5B89\u88C5\u516C\u53F8\u914D\u7F6E").option("--update", "\u53EA\u66F4\u65B0\u5F53\u524D\u914D\u7F6E").option("--company", "\u914D\u7F6E\u516C\u53F8\u914D\u7F6E").option("--personal", "\u914D\u7F6E\u4E2A\u4EBA\u914D\u7F6E").option("--ui", "\u542F\u52A8\u53EF\u89C6\u5316\u9875\u9762").option("--help", "\u663E\u793A\u5E2E\u52A9\u4FE1\u606F").action(async (prompt, options) => {
|
|
481
506
|
if (options.start) {
|
|
482
507
|
await startClaudeCodeEditorWithSkipPermissions();
|
|
483
508
|
} else if (options.menu) {
|
|
@@ -506,6 +531,8 @@ function setupCommands(cli) {
|
|
|
506
531
|
cli.outputHelp();
|
|
507
532
|
} else if (options.ui) {
|
|
508
533
|
await startUI();
|
|
534
|
+
} else if (prompt) {
|
|
535
|
+
await startCodeEditorWithPrompt(prompt);
|
|
509
536
|
} else {
|
|
510
537
|
await startCodeEditor();
|
|
511
538
|
}
|
|
@@ -634,6 +661,43 @@ async function startCodeEditor() {
|
|
|
634
661
|
process.exit(1);
|
|
635
662
|
}
|
|
636
663
|
}
|
|
664
|
+
async function startCodeEditorWithPrompt(prompt) {
|
|
665
|
+
try {
|
|
666
|
+
const context = createDefaultContext();
|
|
667
|
+
const checker = new ConfigCheckerInstaller(context);
|
|
668
|
+
updateAicoCli(true).then(() => {
|
|
669
|
+
}).catch(() => {
|
|
670
|
+
});
|
|
671
|
+
const configType = await checker.detectConfigType();
|
|
672
|
+
const aicoConfig = readAicoConfig();
|
|
673
|
+
const needsReinstall = !aicoConfig || aicoConfig.version !== version;
|
|
674
|
+
if (configType === "none") {
|
|
675
|
+
console.log(ansis.cyan("\u{1F4E6} \u672A\u68C0\u6D4B\u5230\u914D\u7F6E\uFF0C\u6B63\u5728\u5B89\u88C5\u516C\u53F8\u914D\u7F6E..."));
|
|
676
|
+
const { init } = await import('./chunks/simple-config.mjs').then(function (n) { return n.a6; });
|
|
677
|
+
await init({
|
|
678
|
+
skipBanner: true,
|
|
679
|
+
skipPrompt: true,
|
|
680
|
+
apiType: "auth_token"
|
|
681
|
+
});
|
|
682
|
+
} else if (needsReinstall) {
|
|
683
|
+
console.log(ansis.cyan(`\u{1F504} \u68C0\u6D4B\u5230\u65B0\u7248\u672C\uFF0C\u6B63\u5728\u66F4\u65B0${configType === "company" ? "\u516C\u53F8" : "\u4E2A\u4EBA"}\u914D\u7F6E...`));
|
|
684
|
+
const { init } = await import('./chunks/simple-config.mjs').then(function (n) { return n.a6; });
|
|
685
|
+
await init({
|
|
686
|
+
apiType: configType === "company" ? "auth_token" : "ccr_proxy",
|
|
687
|
+
skipBanner: true,
|
|
688
|
+
skipPrompt: true,
|
|
689
|
+
force: true
|
|
690
|
+
});
|
|
691
|
+
}
|
|
692
|
+
updateAicoConfig({ version });
|
|
693
|
+
await startClaudeCodeWithPrompt(prompt);
|
|
694
|
+
} catch (error) {
|
|
695
|
+
console.error(ansis.red(`\u2716 \u542F\u52A8\u4EE3\u7801\u7F16\u8F91\u5668\u5931\u8D25: ${error}`));
|
|
696
|
+
const { processManager } = await import('./chunks/simple-config.mjs').then(function (n) { return n.a4; });
|
|
697
|
+
processManager.cleanup();
|
|
698
|
+
process.exit(1);
|
|
699
|
+
}
|
|
700
|
+
}
|
|
637
701
|
function customizeHelp(sections) {
|
|
638
702
|
sections.unshift({
|
|
639
703
|
title: "",
|
|
@@ -652,6 +716,7 @@ function customizeHelp(sections) {
|
|
|
652
716
|
` ${ansis.cyan("--help")} \u663E\u793A\u5E2E\u52A9\u4FE1\u606F`,
|
|
653
717
|
"",
|
|
654
718
|
ansis.gray(" \u5FEB\u6377\u65B9\u5F0F:"),
|
|
719
|
+
` ${ansis.cyan('aico "\u4F60\u597D"')} \u76F4\u63A5\u4F20\u9012\u63D0\u793A\u8BCD\u7ED9 Claude Code`,
|
|
655
720
|
` ${ansis.cyan("aico i")} (--init) \u5FEB\u901F\u5B89\u88C5\u516C\u53F8\u914D\u7F6E`,
|
|
656
721
|
` ${ansis.cyan("aico u")} (--update) \u5FEB\u901F\u66F4\u65B0\u914D\u7F6E\u548Caico`,
|
|
657
722
|
` ${ansis.cyan("aico c")} (--company) \u516C\u53F8\u914D\u7F6E`,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aico-cli",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.77",
|
|
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.
|
|
44
|
+
"@anthropic-ai/claude-code": "^2.0.76",
|
|
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**:创建项目后返回,后续所有操作都需要此参数
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"hooks": [
|
|
39
39
|
{
|
|
40
40
|
"type": "command",
|
|
41
|
-
"command": "npx tsx
|
|
41
|
+
"command": "node -e \"require('child_process').execSync('npx tsx ' + require('path').join(require('os').homedir(), '.claude/hooks/scripts/PreToolUse/pre-tool-use.ts'), {stdio: 'inherit'})\"",
|
|
42
42
|
"timeout": 10
|
|
43
43
|
}
|
|
44
44
|
]
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"hooks": [
|
|
51
51
|
{
|
|
52
52
|
"type": "command",
|
|
53
|
-
"command": "npx tsx
|
|
53
|
+
"command": "node -e \"require('child_process').execSync('npx tsx ' + require('path').join(require('os').homedir(), '.claude/hooks/scripts/PostToolUse/post-tool-use.ts'), {stdio: 'inherit'})\"",
|
|
54
54
|
"timeout": 10
|
|
55
55
|
}
|
|
56
56
|
]
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"hooks": [
|
|
62
62
|
{
|
|
63
63
|
"type": "command",
|
|
64
|
-
"command": "npx tsx
|
|
64
|
+
"command": "node -e \"require('child_process').execSync('npx tsx ' + require('path').join(require('os').homedir(), '.claude/hooks/scripts/UserPromptSubmit/user-prompt-submit.ts'), {stdio: 'inherit'})\"",
|
|
65
65
|
"timeout": 10
|
|
66
66
|
}
|
|
67
67
|
]
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
"hooks": [
|
|
73
73
|
{
|
|
74
74
|
"type": "command",
|
|
75
|
-
"command": "npx tsx
|
|
75
|
+
"command": "node -e \"require('child_process').execSync('npx tsx ' + require('path').join(require('os').homedir(), '.claude/hooks/scripts/Notification/notification.ts'), {stdio: 'inherit'})\"",
|
|
76
76
|
"timeout": 10
|
|
77
77
|
}
|
|
78
78
|
]
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
"hooks": [
|
|
84
84
|
{
|
|
85
85
|
"type": "command",
|
|
86
|
-
"command": "npx tsx
|
|
86
|
+
"command": "node -e \"require('child_process').execSync('npx tsx ' + require('path').join(require('os').homedir(), '.claude/hooks/scripts/Stop/stop.ts'), {stdio: 'inherit'})\"",
|
|
87
87
|
"timeout": 10
|
|
88
88
|
}
|
|
89
89
|
]
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
},
|
|
93
93
|
"statusLine": {
|
|
94
94
|
"type": "command",
|
|
95
|
-
"command": "
|
|
95
|
+
"command": "node -e \"require('child_process').execSync(require('path').join(require('os').homedir(), '.claude/ccline/ccline'), {stdio: 'inherit'})\"",
|
|
96
96
|
"padding": 0
|
|
97
97
|
}
|
|
98
98
|
}
|
|
@@ -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
|
},
|
|
@@ -38,7 +40,7 @@
|
|
|
38
40
|
"hooks": [
|
|
39
41
|
{
|
|
40
42
|
"type": "command",
|
|
41
|
-
"command": "npx tsx
|
|
43
|
+
"command": "node -e \"require('child_process').execSync('npx tsx ' + require('path').join(require('os').homedir(), '.claude/hooks/scripts/PreToolUse/pre-tool-use.ts'), {stdio: 'inherit'})\"",
|
|
42
44
|
"timeout": 10
|
|
43
45
|
}
|
|
44
46
|
]
|
|
@@ -50,7 +52,7 @@
|
|
|
50
52
|
"hooks": [
|
|
51
53
|
{
|
|
52
54
|
"type": "command",
|
|
53
|
-
"command": "npx tsx
|
|
55
|
+
"command": "node -e \"require('child_process').execSync('npx tsx ' + require('path').join(require('os').homedir(), '.claude/hooks/scripts/PostToolUse/post-tool-use.ts'), {stdio: 'inherit'})\"",
|
|
54
56
|
"timeout": 10
|
|
55
57
|
}
|
|
56
58
|
]
|
|
@@ -61,7 +63,7 @@
|
|
|
61
63
|
"hooks": [
|
|
62
64
|
{
|
|
63
65
|
"type": "command",
|
|
64
|
-
"command": "npx tsx
|
|
66
|
+
"command": "node -e \"require('child_process').execSync('npx tsx ' + require('path').join(require('os').homedir(), '.claude/hooks/scripts/UserPromptSubmit/user-prompt-submit.ts'), {stdio: 'inherit'})\"",
|
|
65
67
|
"timeout": 10
|
|
66
68
|
}
|
|
67
69
|
]
|
|
@@ -72,7 +74,7 @@
|
|
|
72
74
|
"hooks": [
|
|
73
75
|
{
|
|
74
76
|
"type": "command",
|
|
75
|
-
"command": "npx tsx
|
|
77
|
+
"command": "node -e \"require('child_process').execSync('npx tsx ' + require('path').join(require('os').homedir(), '.claude/hooks/scripts/Notification/notification.ts'), {stdio: 'inherit'})\"",
|
|
76
78
|
"timeout": 10
|
|
77
79
|
}
|
|
78
80
|
]
|
|
@@ -83,7 +85,7 @@
|
|
|
83
85
|
"hooks": [
|
|
84
86
|
{
|
|
85
87
|
"type": "command",
|
|
86
|
-
"command": "npx tsx
|
|
88
|
+
"command": "node -e \"require('child_process').execSync('npx tsx ' + require('path').join(require('os').homedir(), '.claude/hooks/scripts/Stop/stop.ts'), {stdio: 'inherit'})\"",
|
|
87
89
|
"timeout": 10
|
|
88
90
|
}
|
|
89
91
|
]
|
|
@@ -92,7 +94,7 @@
|
|
|
92
94
|
},
|
|
93
95
|
"statusLine": {
|
|
94
96
|
"type": "command",
|
|
95
|
-
"command": "
|
|
97
|
+
"command": "node -e \"require('child_process').execSync(require('path').join(require('os').homedir(), '.claude/ccline/ccline'), {stdio: 'inherit'})\"",
|
|
96
98
|
"padding": 0
|
|
97
99
|
}
|
|
98
100
|
}
|
|
@@ -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.
|