intention-coding 0.3.1 → 0.3.2
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/dist/index.js
CHANGED
|
@@ -6345,56 +6345,7 @@ const initProjectStandard = {
|
|
|
6345
6345
|
await promises_["default"].mkdir(aicoDir, {
|
|
6346
6346
|
recursive: true
|
|
6347
6347
|
});
|
|
6348
|
-
|
|
6349
|
-
const initialContent = `# ${project_name} - \u{9879}\u{76EE}\u{5F00}\u{53D1}\u{89C4}\u{8303}
|
|
6350
|
-
## \u{9879}\u{76EE}\u{4FE1}\u{606F}
|
|
6351
|
-
- **\u{9879}\u{76EE}\u{540D}\u{79F0}**: ${project_name}
|
|
6352
|
-
- **\u{5206}\u{6790}\u{6587}\u{4EF6}**: ${external_path_["default"].relative(process.cwd(), projectAnalysisPath)}
|
|
6353
|
-
|
|
6354
|
-
## \u{4E0B}\u{4E00}\u{6B65}\u{64CD}\u{4F5C}
|
|
6355
|
-
\u{8BF7}\u{4F7F}\u{7528}\u{4EE5}\u{4E0B}\u{63D0}\u{793A}\u{8BCD}\u{8C03}\u{7528}AI\u{670D}\u{52A1}\u{751F}\u{6210}\u{9879}\u{76EE}\u{89C4}\u{5219}\u{5185}\u{5BB9}\u{FF1A}
|
|
6356
|
-
\`\`\`json
|
|
6357
|
-
${JSON.stringify(projectRulesPromptData, null, 2)}
|
|
6358
|
-
\`\`\`
|
|
6359
|
-
`;
|
|
6360
|
-
await promises_["default"].writeFile(projectRulesPath, initialContent, 'utf-8');
|
|
6361
|
-
utils_logger.k.info("\u9879\u76EE\u89C4\u5219\u6587\u4EF6\u521B\u5EFA\u6210\u529F", {
|
|
6362
|
-
path: projectRulesPath
|
|
6363
|
-
});
|
|
6364
|
-
const result = {
|
|
6365
|
-
success: true,
|
|
6366
|
-
message: "\u9879\u76EE\u5F00\u53D1\u89C4\u8303\u5185\u5BB9\u751F\u6210\u5B8C\u6210",
|
|
6367
|
-
project_info: {
|
|
6368
|
-
name: project_name,
|
|
6369
|
-
analysis_file: external_path_["default"].resolve(projectAnalysisPath)
|
|
6370
|
-
},
|
|
6371
|
-
generated_rules: {
|
|
6372
|
-
projectrules: {
|
|
6373
|
-
filename: 'project_rules.md',
|
|
6374
|
-
content: initialContent,
|
|
6375
|
-
description: "\u9879\u76EE\u5F00\u53D1\u89C4\u5219\u6587\u4EF6",
|
|
6376
|
-
suggested_path: '.aico/project_rules.md'
|
|
6377
|
-
}
|
|
6378
|
-
},
|
|
6379
|
-
instructions: {
|
|
6380
|
-
overview: "\u8BF7\u4F7F\u7528\u4EE5\u4E0B\u63D0\u793A\u8BCD\u8C03\u7528AI\u670D\u52A1\u751F\u6210\u9879\u76EE\u89C4\u5219\u5185\u5BB9\uFF1A",
|
|
6381
|
-
workflow: [
|
|
6382
|
-
"1. \u4F7F\u7528prompt_data\u4E2D\u7684\u63D0\u793A\u8BCD\u8C03\u7528AI\u670D\u52A1\u751F\u6210project_rules.md\u5185\u5BB9",
|
|
6383
|
-
"2. \u5C06\u751F\u6210\u7684\u5185\u5BB9\u4FDD\u5B58\u5230.aico/project_rules.md\u8DEF\u5F84",
|
|
6384
|
-
"3. \u6839\u636E\u9700\u8981\u8C03\u6574\u548C\u4F18\u5316\u751F\u6210\u7684\u5185\u5BB9"
|
|
6385
|
-
],
|
|
6386
|
-
actions: [
|
|
6387
|
-
{
|
|
6388
|
-
action: 'generate_and_create_file',
|
|
6389
|
-
file: '.aico/project_rules.md',
|
|
6390
|
-
description: "\u9879\u76EE\u5F00\u53D1\u89C4\u5219\u6587\u4EF6",
|
|
6391
|
-
has_prompt_data: true,
|
|
6392
|
-
prompt_task: 'generate_project_rules'
|
|
6393
|
-
}
|
|
6394
|
-
]
|
|
6395
|
-
}
|
|
6396
|
-
};
|
|
6397
|
-
return JSON.stringify(result, null, 2);
|
|
6348
|
+
return JSON.stringify(projectRulesPromptData, null, 2);
|
|
6398
6349
|
} catch (error) {
|
|
6399
6350
|
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
6400
6351
|
utils_logger.k.error(`\u{9879}\u{76EE}\u{89C4}\u{8303}\u{5185}\u{5BB9}\u{751F}\u{6210}\u{5931}\u{8D25}: ${errorMsg}`, {
|
|
@@ -8959,9 +8910,12 @@ const apiTemplatePrompt = `\u{4F60}\u{662F}\u{4E00}\u{4F4D}\u{4E13}\u{4E1A}\u{76
|
|
|
8959
8910
|
|**\u{529F}\u{80FD}\u{63CF}\u{8FF0}**|[\u{8BE6}\u{7EC6}\u{7684}\u{529F}\u{80FD}\u{63CF}\u{8FF0}]|
|
|
8960
8911
|
|**\u{8C03}\u{7528}\u{80FD}\u{529B}\u{57DF}/\u{4E2D}\u{5FC3}**|[\u{5982}\u{9002}\u{7528}\u{7684}\u{5176}\u{4ED6}\u{7CFB}\u{7EDF}\u{63A5}\u{53E3}]|
|
|
8961
8912
|
|
|
8962
|
-
## 3.
|
|
8913
|
+
## 3. \u{6570}\u{636E}\u{5EFA}\u{6A21}
|
|
8914
|
+
## 3.1 ER\u{903B}\u{8F91}\u{56FE}\u{8BBE}\u{8BA1}
|
|
8963
8915
|
|
|
8964
8916
|
[\u{63CF}\u{8FF0}\u{6570}\u{636E}\u{5E93}\u{8868}\u{4E4B}\u{95F4}\u{7684}\u{5173}\u{7CFB}\u{548C}ER\u{56FE}\u{8BBE}\u{8BA1}]
|
|
8917
|
+
\`\`\`mermaid
|
|
8918
|
+
\`\`\`
|
|
8965
8919
|
|
|
8966
8920
|
## 4. \u{6570}\u{636E}\u{8868}\u{5B9E}\u{4F53}\u{8BBE}\u{8BA1}
|
|
8967
8921
|
|
|
@@ -8969,22 +8923,19 @@ const apiTemplatePrompt = `\u{4F60}\u{662F}\u{4E00}\u{4F4D}\u{4E13}\u{4E1A}\u{76
|
|
|
8969
8923
|
|
|
8970
8924
|
## 5. API\u{63A5}\u{53E3}\u{8BBE}\u{8BA1}
|
|
8971
8925
|
|
|
8972
|
-
### 5.1 \u{63A5}\u{53E3}\u{
|
|
8973
|
-
[\u{8BE6}\u{7EC6}\u{63CF}\u{8FF0}API\u{63A5}\u{53E3}\u{7684}\u{6574}\u{4F53}\u{8BBE}\u{8BA1}\u{601D}\u{8DEF}\u{548C}\u{67B6}\u{6784}]
|
|
8974
|
-
|
|
8975
|
-
### 5.2 \u{63A5}\u{53E3}\u{5217}\u{8868}
|
|
8926
|
+
### 5.1 \u{63A5}\u{53E3}\u{5217}\u{8868}
|
|
8976
8927
|
[\u{5217}\u{51FA}\u{6240}\u{6709}\u{76F8}\u{5173}\u{7684}API\u{63A5}\u{53E3}]
|
|
8977
8928
|
|
|
8978
|
-
|
|
8929
|
+
### 5.2 \u{63A5}\u{53E3}\u{8BE6}\u{7EC6}\u{8BF4}\u{660E}
|
|
8979
8930
|
|
|
8980
|
-
|
|
8981
|
-
#### 5.
|
|
8931
|
+
#### 5.2.1 \u{63A5}\u{53E3}1 - [\u{63A5}\u{53E3}\u{540D}\u{79F0}]
|
|
8932
|
+
#### 5.2.2 \u{57FA}\u{672C}\u{4FE1}\u{606F}
|
|
8982
8933
|
- **\u{63A5}\u{53E3}\u{5730}\u{5740}**: [URL\u{8DEF}\u{5F84}]
|
|
8983
8934
|
- **\u{8BF7}\u{6C42}\u{65B9}\u{6CD5}**: [\u{53EA}\u{5141}\u{8BB8}\u{4F7F}\u{7528}POST\u{8BF7}\u{6C42}]
|
|
8984
8935
|
- **\u{534F}\u{8BAE}**: [\u{53EA}\u{5141}\u{8BB8}\u{4F7F}\u{7528}HTTPS]
|
|
8985
8936
|
- **\u{5185}\u{5BB9}\u{7C7B}\u{578B}**: [application/json\u{7B49}]
|
|
8986
8937
|
|
|
8987
|
-
#### 5.
|
|
8938
|
+
#### 5.2.3 \u{8BF7}\u{6C42}\u{53C2}\u{6570}
|
|
8988
8939
|
[\u{8BE6}\u{7EC6}\u{8BF4}\u{660E}\u{8BF7}\u{6C42}\u{53C2}\u{6570}]
|
|
8989
8940
|
|
|
8990
8941
|
|\u{53C2}\u{6570}\u{540D}|\u{7C7B}\u{578B}|\u{662F}\u{5426}\u{5FC5}\u{586B}|\u{4F4D}\u{7F6E}|\u{8BF4}\u{660E}|
|
|
@@ -8992,7 +8943,7 @@ const apiTemplatePrompt = `\u{4F60}\u{662F}\u{4E00}\u{4F4D}\u{4E13}\u{4E1A}\u{76
|
|
|
8992
8943
|
|[\u{53C2}\u{6570}1]|[string/int\u{7B49}]|[\u{662F}/\u{5426}]|[query/body/path]|[\u{8BE6}\u{7EC6}\u{8BF4}\u{660E}]|
|
|
8993
8944
|
|[\u{53C2}\u{6570}2]|[string/int\u{7B49}]|[\u{662F}/\u{5426}]|[query/body/path]|[\u{8BE6}\u{7EC6}\u{8BF4}\u{660E}]|
|
|
8994
8945
|
|
|
8995
|
-
#### 5.
|
|
8946
|
+
#### 5.2.4 \u{54CD}\u{5E94}\u{53C2}\u{6570}
|
|
8996
8947
|
[\u{8BE6}\u{7EC6}\u{8BF4}\u{660E}\u{54CD}\u{5E94}\u{53C2}\u{6570}]
|
|
8997
8948
|
|
|
8998
8949
|
|\u{53C2}\u{6570}\u{540D}|\u{7C7B}\u{578B}|\u{8BF4}\u{660E}|
|
|
@@ -9000,7 +8951,7 @@ const apiTemplatePrompt = `\u{4F60}\u{662F}\u{4E00}\u{4F4D}\u{4E13}\u{4E1A}\u{76
|
|
|
9000
8951
|
|[\u{53C2}\u{6570}1]|[string/object\u{7B49}]|[\u{8BE6}\u{7EC6}\u{8BF4}\u{660E}]|
|
|
9001
8952
|
|[\u{53C2}\u{6570}2]|[string/object\u{7B49}]|[\u{8BE6}\u{7EC6}\u{8BF4}\u{660E}]|
|
|
9002
8953
|
|
|
9003
|
-
#### 5.
|
|
8954
|
+
#### 5.2.5 \u{9519}\u{8BEF}\u{7801}\u{8BF4}\u{660E}
|
|
9004
8955
|
[\u{8BE6}\u{7EC6}\u{8BF4}\u{660E}\u{8BE5}\u{63A5}\u{53E3}\u{7684}\u{9519}\u{8BEF}\u{7801}]
|
|
9005
8956
|
|
|
9006
8957
|
|\u{9519}\u{8BEF}\u{7801}|\u{8BF4}\u{660E}|
|
|
@@ -9008,50 +8959,12 @@ const apiTemplatePrompt = `\u{4F60}\u{662F}\u{4E00}\u{4F4D}\u{4E13}\u{4E1A}\u{76
|
|
|
9008
8959
|
|[\u{9519}\u{8BEF}\u{7801}1]|[\u{8BE6}\u{7EC6}\u{8BF4}\u{660E}]|
|
|
9009
8960
|
|[\u{9519}\u{8BEF}\u{7801}2]|[\u{8BE6}\u{7EC6}\u{8BF4}\u{660E}]|
|
|
9010
8961
|
|
|
9011
|
-
#### 5.
|
|
9012
|
-
[\u{5206}\u{6B65}\u{9AA4}\u{8BE6}\u{7EC6}\u{63CF}\u{8FF0}\u{8BE5}\u{63A5}\u{53E3}\u{7684}\u{8BE6}\u{7EC6}\u{903B}\u{8F91}]
|
|
8962
|
+
#### 5.2.6 \u{8BE6}\u{7EC6}\u{5B9E}\u{73B0}\u{903B}\u{8F91}
|
|
8963
|
+
[\u{5206}\u{6B65}\u{9AA4}\u{8BE6}\u{7EC6}\u{63CF}\u{8FF0}\u{8BE5}\u{63A5}\u{53E3}\u{7684}\u{8BE6}\u{7EC6}\u{903B}\u{8F91}\u{FF0C}\u{5982}\u{679C}\u{5B58}\u{5728}sql\u{8BED}\u{53E5}\u{FF0C}\u{9700}\u{8981}\u{6DFB}\u{52A0}sql\u{8BED}\u{53E5}\u{5E76}\u{5728}sql\u{8BED}\u{53E5}\u{4E2D}\u{6DFB}\u{52A0}\u{6CE8}\u{91CA}\u{8BF4}\u{660E}]
|
|
9013
8964
|
|
|
9014
8965
|
## 6. \u{4E1A}\u{52A1}\u{5BF9}\u{8C61}\u{65F6}\u{5E8F}\u{56FE}
|
|
9015
8966
|
|
|
9016
|
-
|
|
9017
|
-
sequenceDiagram
|
|
9018
|
-
participant \u{5BA2}\u{6237}\u{7AEF}
|
|
9019
|
-
participant API\u{7F51}\u{5173}
|
|
9020
|
-
participant \u{8BA4}\u{8BC1}\u{670D}\u{52A1}
|
|
9021
|
-
participant \u{6743}\u{9650}\u{670D}\u{52A1}
|
|
9022
|
-
participant \u{4E1A}\u{52A1}\u{670D}\u{52A1}
|
|
9023
|
-
participant \u{6570}\u{636E}\u{5E93}
|
|
9024
|
-
participant \u{7F13}\u{5B58}\u{670D}\u{52A1}
|
|
9025
|
-
participant \u{6D88}\u{606F}\u{961F}\u{5217}
|
|
9026
|
-
participant \u{65E5}\u{5FD7}\u{670D}\u{52A1}
|
|
9027
|
-
participant \u{76D1}\u{63A7}\u{670D}\u{52A1}
|
|
9028
|
-
|
|
9029
|
-
\u{5BA2}\u{6237}\u{7AEF}->>API\u{7F51}\u{5173}: \u{53D1}\u{9001}API\u{8BF7}\u{6C42}
|
|
9030
|
-
API\u{7F51}\u{5173}->>\u{8BA4}\u{8BC1}\u{670D}\u{52A1}: \u{9A8C}\u{8BC1}\u{8BF7}\u{6C42}\u{4EE4}\u{724C}
|
|
9031
|
-
\u{8BA4}\u{8BC1}\u{670D}\u{52A1}-->>API\u{7F51}\u{5173}: \u{8FD4}\u{56DE}\u{8BA4}\u{8BC1}\u{7ED3}\u{679C}
|
|
9032
|
-
API\u{7F51}\u{5173}->>\u{6743}\u{9650}\u{670D}\u{52A1}: \u{68C0}\u{67E5}\u{8BBF}\u{95EE}\u{6743}\u{9650}
|
|
9033
|
-
\u{6743}\u{9650}\u{670D}\u{52A1}-->>API\u{7F51}\u{5173}: \u{8FD4}\u{56DE}\u{6743}\u{9650}\u{4FE1}\u{606F}
|
|
9034
|
-
API\u{7F51}\u{5173}->>\u{4E1A}\u{52A1}\u{670D}\u{52A1}: \u{8F6C}\u{53D1}\u{8BF7}\u{6C42}
|
|
9035
|
-
\u{4E1A}\u{52A1}\u{670D}\u{52A1}->>\u{7F13}\u{5B58}\u{670D}\u{52A1}: \u{67E5}\u{8BE2}\u{7F13}\u{5B58}\u{6570}\u{636E}
|
|
9036
|
-
alt \u{7F13}\u{5B58}\u{547D}\u{4E2D}
|
|
9037
|
-
\u{7F13}\u{5B58}\u{670D}\u{52A1}-->>\u{4E1A}\u{52A1}\u{670D}\u{52A1}: \u{8FD4}\u{56DE}\u{7F13}\u{5B58}\u{6570}\u{636E}
|
|
9038
|
-
\u{4E1A}\u{52A1}\u{670D}\u{52A1}->>\u{76D1}\u{63A7}\u{670D}\u{52A1}: \u{8BB0}\u{5F55}\u{7F13}\u{5B58}\u{547D}\u{4E2D}
|
|
9039
|
-
else \u{7F13}\u{5B58}\u{672A}\u{547D}\u{4E2D}
|
|
9040
|
-
\u{4E1A}\u{52A1}\u{670D}\u{52A1}->>\u{6570}\u{636E}\u{5E93}: \u{67E5}\u{8BE2}\u{6570}\u{636E}
|
|
9041
|
-
\u{6570}\u{636E}\u{5E93}-->>\u{4E1A}\u{52A1}\u{670D}\u{52A1}: \u{8FD4}\u{56DE}\u{67E5}\u{8BE2}\u{7ED3}\u{679C}
|
|
9042
|
-
\u{4E1A}\u{52A1}\u{670D}\u{52A1}->>\u{7F13}\u{5B58}\u{670D}\u{52A1}: \u{5B58}\u{50A8}\u{5230}\u{7F13}\u{5B58}
|
|
9043
|
-
\u{4E1A}\u{52A1}\u{670D}\u{52A1}->>\u{76D1}\u{63A7}\u{670D}\u{52A1}: \u{8BB0}\u{5F55}\u{6570}\u{636E}\u{5E93}\u{67E5}\u{8BE2}
|
|
9044
|
-
end
|
|
9045
|
-
\u{4E1A}\u{52A1}\u{670D}\u{52A1}->>\u{6D88}\u{606F}\u{961F}\u{5217}: \u{53D1}\u{9001}\u{5F02}\u{6B65}\u{6D88}\u{606F}
|
|
9046
|
-
\u{4E1A}\u{52A1}\u{670D}\u{52A1}-->>API\u{7F51}\u{5173}: \u{8FD4}\u{56DE}\u{54CD}\u{5E94}\u{6570}\u{636E}
|
|
9047
|
-
API\u{7F51}\u{5173}->>\u{65E5}\u{5FD7}\u{670D}\u{52A1}: \u{8BB0}\u{5F55}\u{8BBF}\u{95EE}\u{65E5}\u{5FD7}
|
|
9048
|
-
API\u{7F51}\u{5173}->>\u{76D1}\u{63A7}\u{670D}\u{52A1}: \u{8BB0}\u{5F55}\u{6027}\u{80FD}\u{6307}\u{6807}
|
|
9049
|
-
API\u{7F51}\u{5173}->>\u{5BA2}\u{6237}\u{7AEF}: \u{8FD4}\u{56DE}\u{54CD}\u{5E94}
|
|
9050
|
-
\`\`\`
|
|
9051
|
-
|
|
9052
|
-
### 6.2 \u{65B9}\u{6848}\u{4E8C}\u{FF1A}\u{66FF}\u{4EE3}\u{6D41}\u{7A0B}\u{FF08}\u{4E0D}\u{540C}\u{6709}\u{6548}\u{8DEF}\u{5F84}\u{FF09}
|
|
9053
|
-
|
|
9054
|
-
#### 6.2.1 \u{8BA4}\u{8BC1}/\u{6388}\u{6743}\u{6D41}\u{7A0B}
|
|
8967
|
+
#### 6.2.1 \u{6B63}\u{5411}\u{6D41}\u{7A0B}
|
|
9055
8968
|
\`\`\`mermaid
|
|
9056
8969
|
sequenceDiagram
|
|
9057
8970
|
participant \u{5BA2}\u{6237}\u{7AEF}
|
|
@@ -9077,9 +8990,9 @@ sequenceDiagram
|
|
|
9077
8990
|
end
|
|
9078
8991
|
\`\`\`
|
|
9079
8992
|
|
|
9080
|
-
### 6.3 \u{5F02}\u{5E38}\u{6D41}\u{7A0B}\u{FF08}\u{
|
|
8993
|
+
### 6.3 \u{5F02}\u{5E38}\u{6D41}\u{7A0B}\u{FF08}\u{903B}\u{8F91}\u{4E2D}\u{51FA}\u{73B0}\u{5F02}\u{5E38}\u{60C5}\u{51B5}\u{7684}\u{4E0B}\u{7684}\u{5904}\u{7406}\u{FF09}
|
|
9081
8994
|
|
|
9082
|
-
#### 6.3.1 \u{
|
|
8995
|
+
#### 6.3.1 xx\u{5F02}\u{5E38}\u{5904}\u{7406}\u{6D41}\u{7A0B}
|
|
9083
8996
|
\`\`\`mermaid
|
|
9084
8997
|
sequenceDiagram
|
|
9085
8998
|
participant \u{5BA2}\u{6237}\u{7AEF}
|
|
@@ -9098,7 +9011,7 @@ sequenceDiagram
|
|
|
9098
9011
|
end
|
|
9099
9012
|
\`\`\`
|
|
9100
9013
|
|
|
9101
|
-
#### 6.3.2 \u{
|
|
9014
|
+
#### 6.3.2 xx\u{5F02}\u{5E38}\u{5904}\u{7406}\u{6D41}\u{7A0B}
|
|
9102
9015
|
\`\`\`mermaid
|
|
9103
9016
|
sequenceDiagram
|
|
9104
9017
|
participant \u{5BA2}\u{6237}\u{7AEF}
|
|
@@ -9116,33 +9029,7 @@ sequenceDiagram
|
|
|
9116
9029
|
API\u{7F51}\u{5173}->>\u{5BA2}\u{6237}\u{7AEF}: \u{8FD4}\u{56DE}400\u{9519}\u{8BEF}\u{53CA}\u{9519}\u{8BEF}\u{8BE6}\u{60C5}
|
|
9117
9030
|
\`\`\`
|
|
9118
9031
|
|
|
9119
|
-
|
|
9120
|
-
\`\`\`mermaid
|
|
9121
|
-
sequenceDiagram
|
|
9122
|
-
participant \u{5F00}\u{53D1}\u{8005}
|
|
9123
|
-
participant API\u{7F51}\u{5173}
|
|
9124
|
-
participant Schema\u{9A8C}\u{8BC1}\u{5668}
|
|
9125
|
-
participant \u{7248}\u{672C}\u{7BA1}\u{7406}\u{5668}
|
|
9126
|
-
participant \u{65E5}\u{5FD7}\u{670D}\u{52A1}
|
|
9127
|
-
participant \u{76D1}\u{63A7}\u{670D}\u{52A1}
|
|
9128
|
-
|
|
9129
|
-
\u{5F00}\u{53D1}\u{8005}->>API\u{7F51}\u{5173}: \u{90E8}\u{7F72}API\u{5B9A}\u{4E49}
|
|
9130
|
-
API\u{7F51}\u{5173}->>Schema\u{9A8C}\u{8BC1}\u{5668}: \u{9A8C}\u{8BC1}API Schema
|
|
9131
|
-
Schema\u{9A8C}\u{8BC1}\u{5668}->>\u{7248}\u{672C}\u{7BA1}\u{7406}\u{5668}: \u{83B7}\u{53D6}\u{5386}\u{53F2}\u{7248}\u{672C}
|
|
9132
|
-
\u{7248}\u{672C}\u{7BA1}\u{7406}\u{5668}-->>Schema\u{9A8C}\u{8BC1}\u{5668}: \u{8FD4}\u{56DE}\u{5386}\u{53F2}\u{5B9A}\u{4E49}
|
|
9133
|
-
Schema\u{9A8C}\u{8BC1}\u{5668}->>Schema\u{9A8C}\u{8BC1}\u{5668}: \u{6267}\u{884C}\u{517C}\u{5BB9}\u{6027}\u{68C0}\u{67E5}
|
|
9134
|
-
alt Schema\u{6709}\u{6548}
|
|
9135
|
-
Schema\u{9A8C}\u{8BC1}\u{5668}-->>API\u{7F51}\u{5173}: \u{8FD4}\u{56DE}\u{9A8C}\u{8BC1}\u{901A}\u{8FC7}
|
|
9136
|
-
API\u{7F51}\u{5173}->>\u{5F00}\u{53D1}\u{8005}: \u{901A}\u{77E5}\u{90E8}\u{7F72}\u{6210}\u{529F}
|
|
9137
|
-
else Schema\u{65E0}\u{6548}
|
|
9138
|
-
Schema\u{9A8C}\u{8BC1}\u{5668}-->>API\u{7F51}\u{5173}: \u{8FD4}\u{56DE}\u{9A8C}\u{8BC1}\u{5931}\u{8D25}
|
|
9139
|
-
API\u{7F51}\u{5173}->>\u{65E5}\u{5FD7}\u{670D}\u{52A1}: \u{8BB0}\u{5F55}Schema\u{9519}\u{8BEF}
|
|
9140
|
-
API\u{7F51}\u{5173}->>\u{76D1}\u{63A7}\u{670D}\u{52A1}: \u{8BB0}\u{5F55}\u{9A8C}\u{8BC1}\u{5931}\u{8D25}\u{6307}\u{6807}
|
|
9141
|
-
API\u{7F51}\u{5173}->>\u{5F00}\u{53D1}\u{8005}: \u{8FD4}\u{56DE}\u{9519}\u{8BEF}\u{8BE6}\u{60C5}\u{548C}\u{4FEE}\u{590D}\u{5EFA}\u{8BAE}
|
|
9142
|
-
end
|
|
9143
|
-
\`\`\`
|
|
9144
|
-
|
|
9145
|
-
### 6.4 \u{8FB9}\u{7F18}\u{60C5}\u{51B5}\u{6D41}\u{7A0B}\u{FF08}\u{5E76}\u{53D1}\u{3001}\u{8D85}\u{65F6}\u{7B49}\u{FF09}
|
|
9032
|
+
### 6.4 \u{8FB9}\u{7F18}\u{60C5}\u{51B5}\u{6D41}\u{7A0B}\u{FF08}\u{5E76}\u{53D1}\u{3001}\u{8D85}\u{65F6}\u{3001}\u{6570}\u{636E}\u{8FB9}\u{754C}\u{7B49}\u{FF09}
|
|
9146
9033
|
|
|
9147
9034
|
#### 6.4.1 \u{5E76}\u{53D1}\u{51B2}\u{7A81}\u{5904}\u{7406}
|
|
9148
9035
|
\`\`\`mermaid
|
|
@@ -9189,43 +9076,13 @@ sequenceDiagram
|
|
|
9189
9076
|
API\u{7F51}\u{5173}->>\u{5BA2}\u{6237}\u{7AEF}: \u{8FD4}\u{56DE}\u{5907}\u{7528}\u{670D}\u{52A1}\u{54CD}\u{5E94}
|
|
9190
9077
|
\`\`\`
|
|
9191
9078
|
|
|
9192
|
-
#### 6.4.3 API\u{6027}\u{80FD}\u{964D}\u{7EA7}\u{5904}\u{7406}
|
|
9193
|
-
\`\`\`mermaid
|
|
9194
|
-
sequenceDiagram
|
|
9195
|
-
participant \u{5BA2}\u{6237}\u{7AEF}
|
|
9196
|
-
participant API\u{7F51}\u{5173}
|
|
9197
|
-
participant \u{6027}\u{80FD}\u{76D1}\u{63A7}\u{5668}
|
|
9198
|
-
participant \u{964D}\u{7EA7}\u{7B56}\u{7565}\u{5668}
|
|
9199
|
-
participant \u{7F13}\u{5B58}\u{670D}\u{52A1}
|
|
9200
|
-
participant \u{65E5}\u{5FD7}\u{670D}\u{52A1}
|
|
9201
|
-
|
|
9202
|
-
\u{5BA2}\u{6237}\u{7AEF}->>API\u{7F51}\u{5173}: \u{53D1}\u{9001}API\u{8BF7}\u{6C42}
|
|
9203
|
-
API\u{7F51}\u{5173}->>\u{6027}\u{80FD}\u{76D1}\u{63A7}\u{5668}: \u{68C0}\u{67E5}\u{670D}\u{52A1}\u{6027}\u{80FD}
|
|
9204
|
-
\u{6027}\u{80FD}\u{76D1}\u{63A7}\u{5668}-->>API\u{7F51}\u{5173}: \u{8FD4}\u{56DE}\u{6027}\u{80FD}\u{72B6}\u{6001}
|
|
9205
|
-
alt \u{6027}\u{80FD}\u{6B63}\u{5E38}
|
|
9206
|
-
API\u{7F51}\u{5173}->>\u{540E}\u{7EED}\u{670D}\u{52A1}: \u{6B63}\u{5E38}\u{5904}\u{7406}\u{8BF7}\u{6C42}
|
|
9207
|
-
\u{540E}\u{7EED}\u{670D}\u{52A1}-->>API\u{7F51}\u{5173}: \u{8FD4}\u{56DE}\u{5B8C}\u{6574}\u{54CD}\u{5E94}
|
|
9208
|
-
else \u{6027}\u{80FD}\u{964D}\u{7EA7}
|
|
9209
|
-
API\u{7F51}\u{5173}->>\u{964D}\u{7EA7}\u{7B56}\u{7565}\u{5668}: \u{5E94}\u{7528}\u{964D}\u{7EA7}\u{7B56}\u{7565}
|
|
9210
|
-
\u{964D}\u{7EA7}\u{7B56}\u{7565}\u{5668}-->>API\u{7F51}\u{5173}: \u{8FD4}\u{56DE}\u{964D}\u{7EA7}\u{914D}\u{7F6E}
|
|
9211
|
-
API\u{7F51}\u{5173}->>\u{7F13}\u{5B58}\u{670D}\u{52A1}: \u{83B7}\u{53D6}\u{7F13}\u{5B58}\u{6570}\u{636E}
|
|
9212
|
-
\u{7F13}\u{5B58}\u{670D}\u{52A1}-->>API\u{7F51}\u{5173}: \u{8FD4}\u{56DE}\u{7F13}\u{5B58}\u{54CD}\u{5E94}
|
|
9213
|
-
API\u{7F51}\u{5173}->>\u{65E5}\u{5FD7}\u{670D}\u{52A1}: \u{8BB0}\u{5F55}\u{964D}\u{7EA7}\u{4E8B}\u{4EF6}
|
|
9214
|
-
end
|
|
9215
|
-
API\u{7F51}\u{5173}->>\u{5BA2}\u{6237}\u{7AEF}: \u{8FD4}\u{56DE}\u{54CD}\u{5E94}
|
|
9216
|
-
\`\`\`
|
|
9217
|
-
|
|
9218
9079
|
## 7. \u{4E1A}\u{52A1}\u{72B6}\u{6001}\u{63CF}\u{8FF0}
|
|
9219
9080
|
|
|
9220
9081
|
| | | |
|
|
9221
9082
|
|---|---|---|
|
|
9222
9083
|
|**\u{72B6}\u{6001}\u{7F16}\u{53F7}**|**\u{72B6}\u{6001}\u{540D}\u{79F0}**|**\u{63CF}\u{8FF0}**|
|
|
9223
|
-
|01|\u{
|
|
9224
|
-
|02|\u{
|
|
9225
|
-
|03|\u{4E1A}\u{52A1}\u{5904}\u{7406}|\u{6B63}\u{5728}\u{5904}\u{7406}\u{4E1A}\u{52A1}\u{903B}\u{8F91}|
|
|
9226
|
-
|04|\u{6570}\u{636E}\u{64CD}\u{4F5C}|\u{6B63}\u{5728}\u{6267}\u{884C}\u{6570}\u{636E}\u{64CD}\u{4F5C}|
|
|
9227
|
-
|05|\u{54CD}\u{5E94}\u{8FD4}\u{56DE}|\u{6B63}\u{5728}\u{8FD4}\u{56DE}\u{54CD}\u{5E94}|
|
|
9228
|
-
|06|\u{5904}\u{7406}\u{5B8C}\u{6210}|\u{8BF7}\u{6C42}\u{5904}\u{7406}\u{5B8C}\u{6210}|
|
|
9084
|
+
|01|\u{6536}\u{5230}\u{5BA1}\u{6838}\u{7533}\u{8BF7}|\u{5F53}\u{63A5}\u{6536}\u{5230}\u{5BA1}\u{6838}\u{7533}\u{8BF7}\u{65F6}\u{FF0C}\u{7CFB}\u{7EDF}\u{4F1A}\u{8BB0}\u{5F55}\u{7533}\u{8BF7}\u{4FE1}\u{606F}\u{5E76}\u{8FD4}\u{56DE}\u{5BA1}\u{6838}\u{4E2D}\u{72B6}\u{6001}|
|
|
9085
|
+
|02|\u{5BA1}\u{6279}\u{5BA1}\u{6838}\u{72B6}\u{6001}|\u{5F53}\u{5BA1}\u{6279}\u{4EBA}\u{5BF9}\u{7533}\u{8BF7}\u{8FDB}\u{884C}\u{5BA1}\u{6279}\u{540E}\u{FF0C}\u{7CFB}\u{7EDF}\u{4F1A}\u{66F4}\u{65B0}\u{5BA1}\u{6838}\u{72B6}\u{6001}\u{5E76}\u{8FD4}\u{56DE}\u{5BA1}\u{6279}\u{7ED3}\u{679C}|
|
|
9229
9086
|
|[\u{6DFB}\u{52A0}\u{66F4}\u{591A}\u{72B6}\u{6001}...]||
|
|
9230
9087
|
|
|
9231
9088
|
## 8. \u{4F2A}\u{4EE3}\u{7801}\u{793A}\u{4F8B}
|
|
@@ -9346,6 +9203,37 @@ const requirementAnalyzerTool = {
|
|
|
9346
9203
|
const { input_type, content, md_file_path, feature_name, options = {}, auto_trigger = {} } = args;
|
|
9347
9204
|
const { custom_prompt, use_streaming, chunk_size } = options;
|
|
9348
9205
|
const analysis_depth = 'detailed';
|
|
9206
|
+
utils_logger.k.info("\u5F00\u59CB\u83B7\u53D6\u9879\u76EE\u4FE1\u606F");
|
|
9207
|
+
let projectInfo = null;
|
|
9208
|
+
try {
|
|
9209
|
+
const projectTemplatePromise = (async ()=>{
|
|
9210
|
+
const projectTemplateArgs = {
|
|
9211
|
+
project_name: feature_name,
|
|
9212
|
+
project_path: void 0
|
|
9213
|
+
};
|
|
9214
|
+
const projectAnalysisResult = await initProjectStandard.execute(projectTemplateArgs);
|
|
9215
|
+
if (projectAnalysisResult) {
|
|
9216
|
+
const projectAnalysis = JSON.parse(projectAnalysisResult);
|
|
9217
|
+
if (projectAnalysis.prompt && projectAnalysis.prompt.includes('{{projectAnalysis}}')) {
|
|
9218
|
+
const projectAnalysisContent = projectAnalysis.prompt.match(/## 项目架构分析\n([\s\S]*)/);
|
|
9219
|
+
if (projectAnalysisContent && projectAnalysisContent[1]) projectInfo = extractProjectInfo(projectAnalysisContent[1]);
|
|
9220
|
+
}
|
|
9221
|
+
}
|
|
9222
|
+
return projectInfo;
|
|
9223
|
+
})();
|
|
9224
|
+
projectInfo = await Promise.race([
|
|
9225
|
+
projectTemplatePromise,
|
|
9226
|
+
new Promise((resolve)=>setTimeout(()=>resolve(null), 5000))
|
|
9227
|
+
]);
|
|
9228
|
+
if (null === projectInfo) utils_logger.k.warn("\u83B7\u53D6\u9879\u76EE\u4FE1\u606F\u8D85\u65F6\uFF0C\u5C06\u4F7F\u7528\u901A\u7528\u6280\u672F\u6587\u6863\u751F\u6210");
|
|
9229
|
+
else utils_logger.k.info("\u9879\u76EE\u4FE1\u606F\u83B7\u53D6\u6210\u529F", {
|
|
9230
|
+
projectInfo
|
|
9231
|
+
});
|
|
9232
|
+
} catch (projectError) {
|
|
9233
|
+
utils_logger.k.warn("\u83B7\u53D6\u9879\u76EE\u4FE1\u606F\u5931\u8D25\uFF0C\u5C06\u4F7F\u7528\u901A\u7528\u6280\u672F\u6587\u6863\u751F\u6210", {
|
|
9234
|
+
error: projectError instanceof Error ? projectError.message : String(projectError)
|
|
9235
|
+
});
|
|
9236
|
+
}
|
|
9349
9237
|
try {
|
|
9350
9238
|
let inputContent = '';
|
|
9351
9239
|
let sourceInfo = '';
|
|
@@ -9353,6 +9241,14 @@ const requirementAnalyzerTool = {
|
|
|
9353
9241
|
inputContent = content;
|
|
9354
9242
|
sourceInfo = "\u7528\u6237\u76F4\u63A5\u8F93\u5165";
|
|
9355
9243
|
} else if ('md_file' === input_type) {
|
|
9244
|
+
if (!md_file_path) {
|
|
9245
|
+
utils_logger.k.error("md_file_path\u53C2\u6570\u4E3A\u7A7A", {
|
|
9246
|
+
input_type,
|
|
9247
|
+
md_file_path,
|
|
9248
|
+
feature_name
|
|
9249
|
+
});
|
|
9250
|
+
throw new Error("md_file_path\u53C2\u6570\u4E0D\u80FD\u4E3A\u7A7A");
|
|
9251
|
+
}
|
|
9356
9252
|
const resolvedPath = await (0, common.kK)(md_file_path);
|
|
9357
9253
|
const stats = await promises_.stat(resolvedPath);
|
|
9358
9254
|
const fileSizeInMB = stats.size / 1048576;
|
|
@@ -9412,7 +9308,7 @@ const requirementAnalyzerTool = {
|
|
|
9412
9308
|
priority: 'priority' in feature ? feature.priority : 'medium',
|
|
9413
9309
|
complexity: 'complexity' in feature ? feature.complexity : feature.estimatedComplexity
|
|
9414
9310
|
});
|
|
9415
|
-
const featureDoc = await generateRequirementWithDFS(featureContent, featureTitle, custom_prompt, featureType);
|
|
9311
|
+
const featureDoc = await generateRequirementWithDFS(featureContent, featureTitle, custom_prompt, featureType, projectInfo);
|
|
9416
9312
|
await promises_.writeFile(featureOutputPath, featureDoc, 'utf8');
|
|
9417
9313
|
generatedFiles.push(external_path_["default"].resolve(featureOutputPath));
|
|
9418
9314
|
utils_logger.k.info(`\u{529F}\u{80FD}\u{70B9}\u{5206}\u{6790}\u{5B8C}\u{6210} ${i + 1}/${featuresToProcess.length}`, {
|
|
@@ -9449,7 +9345,7 @@ ${generatedFiles.map((f)=>`- \`${f}\``).join('\n')}
|
|
|
9449
9345
|
analysisDepth: analysis_depth,
|
|
9450
9346
|
sourceInfo
|
|
9451
9347
|
});
|
|
9452
|
-
const requirementDoc = await generateRequirementWithDFS((null == (_requirementAnalysis_requirements_ = requirementAnalysis.requirements[0]) ? void 0 : _requirementAnalysis_requirements_.fullContent) || inputContent, feature_name, custom_prompt, (null == (_requirementAnalysis_requirements_1 = requirementAnalysis.requirements[0]) ? void 0 : _requirementAnalysis_requirements_1.type) || "\u7CFB\u7EDF");
|
|
9348
|
+
const requirementDoc = await generateRequirementWithDFS((null == (_requirementAnalysis_requirements_ = requirementAnalysis.requirements[0]) ? void 0 : _requirementAnalysis_requirements_.fullContent) || inputContent, feature_name, custom_prompt, (null == (_requirementAnalysis_requirements_1 = requirementAnalysis.requirements[0]) ? void 0 : _requirementAnalysis_requirements_1.type) || "\u7CFB\u7EDF", projectInfo);
|
|
9453
9349
|
await promises_.writeFile(outputPath, requirementDoc, 'utf8');
|
|
9454
9350
|
generatedFiles.push(external_path_["default"].resolve(outputPath));
|
|
9455
9351
|
const stats = {
|
|
@@ -9693,7 +9589,7 @@ function analyzeRequirementsFallback(inputContent) {
|
|
|
9693
9589
|
]
|
|
9694
9590
|
};
|
|
9695
9591
|
}
|
|
9696
|
-
async function generateRequirementWithDFS(requirementContent, requirementTitle, customPrompt, requirementType = "\u7CFB\u7EDF") {
|
|
9592
|
+
async function generateRequirementWithDFS(requirementContent, requirementTitle, customPrompt, requirementType = "\u7CFB\u7EDF", projectInfo) {
|
|
9697
9593
|
utils_logger.k.info("\u5F00\u59CB\u4F7F\u7528\u6DF1\u5EA6\u641C\u7D22\u7B97\u6CD5\u751F\u6210\u9700\u6C42\u6587\u6863", {
|
|
9698
9594
|
requirementTitle,
|
|
9699
9595
|
requirementType,
|
|
@@ -9704,7 +9600,16 @@ async function generateRequirementWithDFS(requirementContent, requirementTitle,
|
|
|
9704
9600
|
else if (requirementType.includes("\u79FB\u52A8") || requirementType.includes('app') || requirementType.includes('App')) selectedPrompt = appTemplatePrompt;
|
|
9705
9601
|
else if (requirementType.includes('SDK') || requirementType.includes('sdk') || requirementType.includes("\u7B2C\u4E09\u65B9")) selectedPrompt = sdkTemplatePrompt;
|
|
9706
9602
|
else if (requirementType.includes("\u63A5\u53E3") || requirementType.includes('API') || requirementType.includes('api')) selectedPrompt = apiTemplatePrompt;
|
|
9707
|
-
|
|
9603
|
+
let projectContext = '';
|
|
9604
|
+
if (projectInfo) projectContext = `
|
|
9605
|
+
## \u{9879}\u{76EE}\u{4E0A}\u{4E0B}\u{6587}\u{4FE1}\u{606F}
|
|
9606
|
+
\u{5F53}\u{524D}\u{9879}\u{76EE}\u{662F}\u{4E00}\u{4E2A}${projectInfo.projectType}\u{FF0C}\u{4F7F}\u{7528}\u{7684}\u{4E3B}\u{8981}\u{6280}\u{672F}\u{6808}\u{5305}\u{62EC}\u{FF1A}${projectInfo.techStack.join(', ')}\u{3002}
|
|
9607
|
+
\u{9879}\u{76EE}\u{4F7F}\u{7528}\u{7684}\u{7F16}\u{7A0B}\u{8BED}\u{8A00}\u{662F}${projectInfo.language}\u{FF0C}\u{6846}\u{67B6}\u{5305}\u{62EC}\u{FF1A}${projectInfo.frameworks.join(', ')}\u{3002}
|
|
9608
|
+
\u{9879}\u{76EE}\u{4F9D}\u{8D56}\u{FF1A}${projectInfo.dependencies.join(', ')}\u{3002}
|
|
9609
|
+
|
|
9610
|
+
\u{8BF7}\u{6839}\u{636E}\u{4EE5}\u{4E0A}\u{9879}\u{76EE}\u{6280}\u{672F}\u{6808}\u{548C}\u{67B6}\u{6784}\u{4FE1}\u{606F}\u{FF0C}\u{751F}\u{6210}\u{4E0E}\u{9879}\u{76EE}\u{5339}\u{914D}\u{7684}\u{6280}\u{672F}\u{9700}\u{6C42}\u{6587}\u{6863}\u{3002}
|
|
9611
|
+
`;
|
|
9612
|
+
const prompt = selectedPrompt.replace('{featureName}', requirementTitle).replace('{businessDomain}', projectContext).replace('{generateSequenceDiagram}', "\u662F").replace('{inputContent}', requirementContent).replace('{currentTime}', new Date().toLocaleString('zh-CN'));
|
|
9708
9613
|
try {
|
|
9709
9614
|
const result = await callAIServiceWithProgress(`\u{9700}\u{6C42}\u{6587}\u{6863}\u{751F}\u{6210}(${requirementTitle})`, ()=>openai.r.generateText({
|
|
9710
9615
|
prompt: prompt,
|
|
@@ -9774,9 +9679,10 @@ function categorizeError(error) {
|
|
|
9774
9679
|
if (errorMsg.includes('validation') || errorMsg.includes("\u65E0\u6548") || errorMsg.includes('required')) return "INVALID_INPUT";
|
|
9775
9680
|
if (errorMsg.includes('openai') || errorMsg.includes('kimi') || errorMsg.includes('api')) return "AI_SERVICE_ERROR";
|
|
9776
9681
|
if (errorMsg.includes('json') || errorMsg.includes('parse')) return "JSON_PARSE_ERROR";
|
|
9777
|
-
if (errorMsg.includes('network') || errorMsg.includes(
|
|
9682
|
+
if (errorMsg.includes('network') || errorMsg.includes("\u8FDE\u63A5")) return "NETWORK_ERROR";
|
|
9778
9683
|
if (errorMsg.includes('memory') || errorMsg.includes('heap')) return "MEMORY_ERROR";
|
|
9779
9684
|
if (errorMsg.includes('timeout') || errorMsg.includes("\u8D85\u65F6")) return "TIMEOUT_ERROR";
|
|
9685
|
+
if (errorMsg.includes('network') || errorMsg.includes("\u8FDE\u63A5")) return "NETWORK_ERROR";
|
|
9780
9686
|
return "UNKNOWN_ERROR";
|
|
9781
9687
|
}
|
|
9782
9688
|
function generateUserFriendlyErrorMessage(errorType, originalMessage) {
|
|
@@ -9838,6 +9744,76 @@ async function callAIServiceWithProgress(description, apiCall, maxRetries = 3, b
|
|
|
9838
9744
|
throw error;
|
|
9839
9745
|
}
|
|
9840
9746
|
}
|
|
9747
|
+
function extractProjectInfo(projectAnalysis) {
|
|
9748
|
+
const projectInfo = {
|
|
9749
|
+
techStack: [],
|
|
9750
|
+
frameworks: [],
|
|
9751
|
+
language: '',
|
|
9752
|
+
projectType: '',
|
|
9753
|
+
dependencies: []
|
|
9754
|
+
};
|
|
9755
|
+
const techStackKeywords = [
|
|
9756
|
+
'React',
|
|
9757
|
+
'Vue',
|
|
9758
|
+
'Angular',
|
|
9759
|
+
'Svelte',
|
|
9760
|
+
'Node.js',
|
|
9761
|
+
'Express',
|
|
9762
|
+
'Koa',
|
|
9763
|
+
'Fastify',
|
|
9764
|
+
'Python',
|
|
9765
|
+
'Django',
|
|
9766
|
+
'Flask',
|
|
9767
|
+
'Java',
|
|
9768
|
+
'Spring',
|
|
9769
|
+
'Spring Boot',
|
|
9770
|
+
'TypeScript',
|
|
9771
|
+
'JavaScript',
|
|
9772
|
+
'PostgreSQL',
|
|
9773
|
+
'MySQL',
|
|
9774
|
+
'MongoDB',
|
|
9775
|
+
'Redis',
|
|
9776
|
+
'Docker',
|
|
9777
|
+
'Kubernetes'
|
|
9778
|
+
];
|
|
9779
|
+
const frameworkKeywords = [
|
|
9780
|
+
'React',
|
|
9781
|
+
'Vue',
|
|
9782
|
+
'Angular',
|
|
9783
|
+
'Svelte',
|
|
9784
|
+
'Express',
|
|
9785
|
+
'Koa',
|
|
9786
|
+
'Fastify',
|
|
9787
|
+
'Django',
|
|
9788
|
+
'Flask',
|
|
9789
|
+
'Spring',
|
|
9790
|
+
'Spring Boot',
|
|
9791
|
+
'Next.js',
|
|
9792
|
+
'Nuxt.js'
|
|
9793
|
+
];
|
|
9794
|
+
const languageKeywords = [
|
|
9795
|
+
'TypeScript',
|
|
9796
|
+
'JavaScript',
|
|
9797
|
+
'Python',
|
|
9798
|
+
'Java',
|
|
9799
|
+
'Go',
|
|
9800
|
+
'Rust',
|
|
9801
|
+
'C#'
|
|
9802
|
+
];
|
|
9803
|
+
for (const keyword of techStackKeywords)if (projectAnalysis.includes(keyword)) projectInfo.techStack.push(keyword);
|
|
9804
|
+
for (const keyword of frameworkKeywords)if (projectAnalysis.includes(keyword)) projectInfo.frameworks.push(keyword);
|
|
9805
|
+
for (const keyword of languageKeywords)if (projectAnalysis.includes(keyword)) {
|
|
9806
|
+
projectInfo.language = keyword;
|
|
9807
|
+
break;
|
|
9808
|
+
}
|
|
9809
|
+
if (projectAnalysis.includes('package.json')) projectInfo.projectType = "Node.js\u9879\u76EE";
|
|
9810
|
+
else if (projectAnalysis.includes('requirements.txt') || projectAnalysis.includes('pyproject.toml')) projectInfo.projectType = "Python\u9879\u76EE";
|
|
9811
|
+
else if (projectAnalysis.includes('pom.xml') || projectAnalysis.includes('build.gradle')) projectInfo.projectType = "Java\u9879\u76EE";
|
|
9812
|
+
else projectInfo.projectType = "\u901A\u7528\u9879\u76EE";
|
|
9813
|
+
const dependencyMatch = projectAnalysis.match(/## 依赖.*?```.*?\n([\s\S]*?)\n```/);
|
|
9814
|
+
if (dependencyMatch && dependencyMatch[1]) projectInfo.dependencies = dependencyMatch[1].split('\n').filter((line)=>'' !== line.trim()).map((line)=>line.trim());
|
|
9815
|
+
return projectInfo;
|
|
9816
|
+
}
|
|
9841
9817
|
async function extractFeaturesWithNLP(inputContent) {
|
|
9842
9818
|
try {
|
|
9843
9819
|
utils_logger.k.info("\u5F00\u59CB\u4F7F\u7528\u589E\u5F3A\u578BNLP\u6280\u672F\u63D0\u53D6\u529F\u80FD\u70B9", {
|
|
@@ -9852,10 +9828,18 @@ async function extractFeaturesWithNLP(inputContent) {
|
|
|
9852
9828
|
const jsonMatch = result.match(/\{[\s\S]*\}/);
|
|
9853
9829
|
if (jsonMatch) {
|
|
9854
9830
|
const features = JSON.parse(jsonMatch[0]);
|
|
9831
|
+
if (Array.isArray(features)) {
|
|
9832
|
+
utils_logger.k.info("\u589E\u5F3A\u578B\u529F\u80FD\u70B9\u63D0\u53D6\u6210\u529F", {
|
|
9833
|
+
featureCount: features.length
|
|
9834
|
+
});
|
|
9835
|
+
return features;
|
|
9836
|
+
}
|
|
9855
9837
|
utils_logger.k.info("\u589E\u5F3A\u578B\u529F\u80FD\u70B9\u63D0\u53D6\u6210\u529F", {
|
|
9856
|
-
featureCount:
|
|
9838
|
+
featureCount: 1
|
|
9857
9839
|
});
|
|
9858
|
-
return
|
|
9840
|
+
return [
|
|
9841
|
+
features
|
|
9842
|
+
];
|
|
9859
9843
|
}
|
|
9860
9844
|
} catch (parseError) {
|
|
9861
9845
|
utils_logger.k.warn("JSON\u89E3\u6790\u5931\u8D25", {
|
|
@@ -12369,6 +12353,294 @@ const listSupportedFormatsTool = {
|
|
|
12369
12353
|
\u{8F93}\u{51FA}\u{683C}\u{5F0F}\u{FF1A}${formats.output.join(', ')}`;
|
|
12370
12354
|
}
|
|
12371
12355
|
};
|
|
12356
|
+
const BugFixAgentParams = esm.z.object({
|
|
12357
|
+
bug_description: esm.z.string().describe("Bug\u63CF\u8FF0\u4FE1\u606F\u6216\u95EE\u9898\u8BF4\u660E"),
|
|
12358
|
+
project_path: esm.z.string().optional().describe("\u9879\u76EE\u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u7528\u4E8E\u6307\u5B9A\u8981\u5206\u6790\u7684\u9879\u76EE\u76EE\u5F55"),
|
|
12359
|
+
project_name: esm.z.string().optional().default('current-project').describe("\u9879\u76EE\u540D\u79F0"),
|
|
12360
|
+
output_format: esm.z["enum"]([
|
|
12361
|
+
'markdown',
|
|
12362
|
+
'json'
|
|
12363
|
+
]).optional().default('markdown').describe("\u8F93\u51FA\u683C\u5F0F")
|
|
12364
|
+
});
|
|
12365
|
+
const bugFixAgentTool = {
|
|
12366
|
+
name: "bug\u4FEE\u590D\u667A\u80FD\u4F53",
|
|
12367
|
+
description: "\u6839\u636E\u7528\u6237\u63D0\u4F9B\u7684bug\u63CF\u8FF0\u4FE1\u606F\uFF0C\u667A\u80FD\u5206\u6790\u9879\u76EE\u7ED3\u6784\u5E76\u751F\u6210\u4FEE\u590D\u65B9\u6848",
|
|
12368
|
+
parameters: BugFixAgentParams,
|
|
12369
|
+
execute: async (args)=>{
|
|
12370
|
+
const { bug_description, project_path, project_name = 'current-project', output_format = 'markdown' } = args;
|
|
12371
|
+
try {
|
|
12372
|
+
utils_logger.k.info("\u5F00\u59CBBug\u4FEE\u590D\u667A\u80FD\u4F53\u6D41\u7A0B", {
|
|
12373
|
+
project_name,
|
|
12374
|
+
project_path
|
|
12375
|
+
});
|
|
12376
|
+
utils_logger.k.info("1. \u9879\u76EE\u7406\u89E3\u9636\u6BB5\uFF1A\u8C03\u7528project-template\u670D\u52A1\u5206\u6790\u9879\u76EE\u7ED3\u6784");
|
|
12377
|
+
const projectTemplateArgs = {
|
|
12378
|
+
project_name,
|
|
12379
|
+
project_path,
|
|
12380
|
+
custom_rules: void 0
|
|
12381
|
+
};
|
|
12382
|
+
const projectAnalysisResult = await initProjectStandard.execute(projectTemplateArgs);
|
|
12383
|
+
let projectRulesPromptData = null;
|
|
12384
|
+
if (projectAnalysisResult) try {
|
|
12385
|
+
projectRulesPromptData = JSON.parse(projectAnalysisResult);
|
|
12386
|
+
} catch (parseError) {
|
|
12387
|
+
utils_logger.k.warn("\u9879\u76EE\u5206\u6790\u7ED3\u679C\u89E3\u6790\u5931\u8D25", {
|
|
12388
|
+
parseError
|
|
12389
|
+
});
|
|
12390
|
+
}
|
|
12391
|
+
utils_logger.k.info("2. \u89C4\u5219\u5339\u914D\u9636\u6BB5\uFF1A\u6839\u636Eproject_rules.md\u5B9A\u4F4D\u76F8\u5173\u5185\u5BB9");
|
|
12392
|
+
const projectRules = await getProjectRules(project_name);
|
|
12393
|
+
utils_logger.k.info("3. \u4EFB\u52A1\u89C4\u5212\u9636\u6BB5\uFF1A\u521B\u5EFA\u8BE6\u7EC6\u7684\u6267\u884C\u6E05\u5355");
|
|
12394
|
+
const taskPlan = await createTaskExecutionPlan(bug_description, projectRulesPromptData, projectRules);
|
|
12395
|
+
utils_logger.k.info("4. \u5B9E\u65BD\u9636\u6BB5\uFF1A\u6267\u884C\u4FEE\u590D\u4EFB\u52A1\u5E76\u751F\u6210\u7ED3\u679C");
|
|
12396
|
+
const fixResult = await executeBugFixTask(bug_description, projectRules, taskPlan);
|
|
12397
|
+
const outputPath = await saveBugFixResult(fixResult, project_name, output_format);
|
|
12398
|
+
utils_logger.k.info("Bug\u4FEE\u590D\u667A\u80FD\u4F53\u6D41\u7A0B\u5B8C\u6210", {
|
|
12399
|
+
outputPath
|
|
12400
|
+
});
|
|
12401
|
+
return JSON.stringify({
|
|
12402
|
+
success: true,
|
|
12403
|
+
message: "Bug\u4FEE\u590D\u5206\u6790\u5B8C\u6210",
|
|
12404
|
+
data: {
|
|
12405
|
+
project_name,
|
|
12406
|
+
task_plan: taskPlan,
|
|
12407
|
+
fix_result: fixResult,
|
|
12408
|
+
output_path: outputPath
|
|
12409
|
+
}
|
|
12410
|
+
});
|
|
12411
|
+
} catch (error) {
|
|
12412
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
12413
|
+
utils_logger.k.error("Bug\u4FEE\u590D\u667A\u80FD\u4F53\u6267\u884C\u5931\u8D25", {
|
|
12414
|
+
project_name,
|
|
12415
|
+
error: errorMsg
|
|
12416
|
+
});
|
|
12417
|
+
throw new Error(`Bug\u{4FEE}\u{590D}\u{667A}\u{80FD}\u{4F53}\u{6267}\u{884C}\u{5931}\u{8D25}: ${errorMsg}`);
|
|
12418
|
+
}
|
|
12419
|
+
}
|
|
12420
|
+
};
|
|
12421
|
+
async function getProjectRules(projectName) {
|
|
12422
|
+
try {
|
|
12423
|
+
const storageDir = (0, src_config.WR)();
|
|
12424
|
+
const projectRulesPath = external_path_["default"].join(storageDir, 'project_rules.md');
|
|
12425
|
+
try {
|
|
12426
|
+
await promises_["default"].access(projectRulesPath);
|
|
12427
|
+
const projectRules = await promises_["default"].readFile(projectRulesPath, 'utf-8');
|
|
12428
|
+
utils_logger.k.info("\u6210\u529F\u8BFB\u53D6\u9879\u76EE\u89C4\u5219\u6587\u4EF6", {
|
|
12429
|
+
projectRulesPath
|
|
12430
|
+
});
|
|
12431
|
+
return projectRules;
|
|
12432
|
+
} catch (fileError) {
|
|
12433
|
+
utils_logger.k.warn("\u9879\u76EE\u89C4\u5219\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u5C06\u4F7F\u7528\u9ED8\u8BA4\u89C4\u5219", {
|
|
12434
|
+
projectRulesPath
|
|
12435
|
+
});
|
|
12436
|
+
return getDefaultProjectRules(projectName);
|
|
12437
|
+
}
|
|
12438
|
+
} catch (error) {
|
|
12439
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
12440
|
+
utils_logger.k.error("\u83B7\u53D6\u9879\u76EE\u89C4\u5219\u5931\u8D25", {
|
|
12441
|
+
error: errorMsg
|
|
12442
|
+
});
|
|
12443
|
+
return getDefaultProjectRules(projectName);
|
|
12444
|
+
}
|
|
12445
|
+
}
|
|
12446
|
+
function getDefaultProjectRules(projectName) {
|
|
12447
|
+
return `# ${projectName} - \u{9879}\u{76EE}\u{5F00}\u{53D1}\u{89C4}\u{8303}
|
|
12448
|
+
|
|
12449
|
+
## 1. \u{9879}\u{76EE}\u{6982}\u{8FF0}
|
|
12450
|
+
- \u{9879}\u{76EE}\u{540D}\u{79F0}: ${projectName}
|
|
12451
|
+
- \u{6280}\u{672F}\u{6808}: \u{901A}\u{7528}Web\u{9879}\u{76EE}
|
|
12452
|
+
- \u{67B6}\u{6784}\u{6A21}\u{5F0F}: \u{5206}\u{5C42}\u{67B6}\u{6784}
|
|
12453
|
+
|
|
12454
|
+
## 2. \u{76EE}\u{5F55}\u{7ED3}\u{6784}\u{89C4}\u{8303}
|
|
12455
|
+
\`\`\`
|
|
12456
|
+
src/
|
|
12457
|
+
\u{251C}\u{2500}\u{2500} controllers/ # \u{63A7}\u{5236}\u{5668}\u{5C42}
|
|
12458
|
+
\u{251C}\u{2500}\u{2500} services/ # \u{4E1A}\u{52A1}\u{903B}\u{8F91}\u{5C42}
|
|
12459
|
+
\u{251C}\u{2500}\u{2500} repositories/ # \u{6570}\u{636E}\u{8BBF}\u{95EE}\u{5C42}
|
|
12460
|
+
\u{251C}\u{2500}\u{2500} models/ # \u{6570}\u{636E}\u{6A21}\u{578B}
|
|
12461
|
+
\u{251C}\u{2500}\u{2500} middleware/ # \u{4E2D}\u{95F4}\u{4EF6}
|
|
12462
|
+
\u{251C}\u{2500}\u{2500} utils/ # \u{5DE5}\u{5177}\u{51FD}\u{6570}
|
|
12463
|
+
\u{2514}\u{2500}\u{2500} config/ # \u{914D}\u{7F6E}\u{6587}\u{4EF6}
|
|
12464
|
+
\`\`\`
|
|
12465
|
+
|
|
12466
|
+
## 3. \u{4EE3}\u{7801}\u{89C4}\u{8303}
|
|
12467
|
+
- \u{547D}\u{540D}\u{89C4}\u{8303}: \u{4F7F}\u{7528}camelCase\u{547D}\u{540D}\u{53D8}\u{91CF}\u{548C}\u{51FD}\u{6570}
|
|
12468
|
+
- \u{4EE3}\u{7801}\u{98CE}\u{683C}: \u{4F7F}\u{7528}4\u{7A7A}\u{683C}\u{7F29}\u{8FDB}
|
|
12469
|
+
- \u{6CE8}\u{91CA}\u{8981}\u{6C42}: \u{51FD}\u{6570}\u{9700}\u{6DFB}\u{52A0}JSDoc\u{6CE8}\u{91CA}
|
|
12470
|
+
- \u{5BFC}\u{5165}\u{89C4}\u{5219}: \u{6309}\u{6A21}\u{5757}\u{5206}\u{7C7B}\u{5BFC}\u{5165}
|
|
12471
|
+
|
|
12472
|
+
## 4. \u{9519}\u{8BEF}\u{5904}\u{7406}\u{89C4}\u{8303}
|
|
12473
|
+
- \u{4F7F}\u{7528}try-catch\u{5904}\u{7406}\u{5F02}\u{5E38}
|
|
12474
|
+
- \u{63D0}\u{4F9B}\u{6709}\u{610F}\u{4E49}\u{7684}\u{9519}\u{8BEF}\u{4FE1}\u{606F}
|
|
12475
|
+
- \u{8BB0}\u{5F55}\u{9519}\u{8BEF}\u{65E5}\u{5FD7}
|
|
12476
|
+
`;
|
|
12477
|
+
}
|
|
12478
|
+
async function createTaskExecutionPlan(bugDescription, projectAnalysis, projectRules) {
|
|
12479
|
+
try {
|
|
12480
|
+
const prompt = `\u{4F60}\u{662F}\u{4E00}\u{4F4D}\u{4E13}\u{4E1A}\u{7684}\u{8F6F}\u{4EF6}Bug\u{4FEE}\u{590D}\u{4E13}\u{5BB6}\u{3002}\u{8BF7}\u{57FA}\u{4E8E}\u{4EE5}\u{4E0B}\u{4FE1}\u{606F}\u{521B}\u{5EFA}\u{8BE6}\u{7EC6}\u{7684}Bug\u{4FEE}\u{590D}\u{4EFB}\u{52A1}\u{6267}\u{884C}\u{6E05}\u{5355}\u{FF1A}
|
|
12481
|
+
|
|
12482
|
+
## Bug\u{63CF}\u{8FF0}
|
|
12483
|
+
${bugDescription}
|
|
12484
|
+
|
|
12485
|
+
## \u{9879}\u{76EE}\u{5206}\u{6790}
|
|
12486
|
+
${(null == projectAnalysis ? void 0 : projectAnalysis.prompt) || "\u65E0\u9879\u76EE\u5206\u6790\u4FE1\u606F"}
|
|
12487
|
+
|
|
12488
|
+
## \u{9879}\u{76EE}\u{89C4}\u{5219}
|
|
12489
|
+
${projectRules}
|
|
12490
|
+
|
|
12491
|
+
## \u{4EFB}\u{52A1}\u{8981}\u{6C42}
|
|
12492
|
+
\u{8BF7}\u{6309}\u{7167}\u{4EE5}\u{4E0B}\u{7ED3}\u{6784}\u{521B}\u{5EFA}\u{4EFB}\u{52A1}\u{6267}\u{884C}\u{6E05}\u{5355}\u{FF1A}
|
|
12493
|
+
1. \u{63CF}\u{8FF0}\u{4FE1}\u{606F}\u{4E0E}\u{5DE5}\u{7A0B}\u{5185}\u{5BB9}\u{5339}\u{914D}\u{7684}\u{5BF9}\u{5E94}\u{5173}\u{7CFB}
|
|
12494
|
+
- \u{5206}\u{6790}Bug\u{63CF}\u{8FF0}\u{4FE1}\u{606F}
|
|
12495
|
+
- \u{89E3}\u{6790}\u{9879}\u{76EE}\u{89C4}\u{5219}\u{6587}\u{4EF6}
|
|
12496
|
+
- \u{5EFA}\u{7ACB}\u{63CF}\u{8FF0}\u{4FE1}\u{606F}\u{4E0E}\u{9879}\u{76EE}\u{6587}\u{4EF6}/\u{6A21}\u{5757}\u{7684}\u{6620}\u{5C04}\u{5173}\u{7CFB}
|
|
12497
|
+
- \u{786E}\u{5B9A}\u{53D7}\u{5F71}\u{54CD}\u{7684}\u{4EE3}\u{7801}\u{8303}\u{56F4}
|
|
12498
|
+
2. \u{5B8C}\u{6210}\u{672C}\u{6B21}\u{63CF}\u{8FF0}\u{4EFB}\u{52A1}\u{7684}\u{65B9}\u{6CD5}\u{548C}\u{4EA4}\u{4ED8}\u{7ED3}\u{679C}
|
|
12499
|
+
- \u{5236}\u{5B9A}\u{4FEE}\u{590D}\u{65B9}\u{6848}\u{548C}\u{5B9E}\u{65BD}\u{6B65}\u{9AA4}
|
|
12500
|
+
- \u{751F}\u{6210}\u{4FEE}\u{590D}\u{4EE3}\u{7801}\u{6216}\u{4FEE}\u{6539}\u{5EFA}\u{8BAE}
|
|
12501
|
+
- \u{63D0}\u{4F9B}\u{9A8C}\u{8BC1}\u{65B9}\u{6CD5}\u{548C}\u{6D4B}\u{8BD5}\u{7528}\u{4F8B}
|
|
12502
|
+
- \u{8F93}\u{51FA}\u{4FEE}\u{590D}\u{62A5}\u{544A}\u{548C}\u{76F8}\u{5173}\u{6587}\u{6863}
|
|
12503
|
+
|
|
12504
|
+
\u{8BF7}\u{8F93}\u{51FA}JSON\u{683C}\u{5F0F}\u{7684}\u{7ED3}\u{679C}\u{FF0C}\u{5305}\u{542B}\u{4EE5}\u{4E0A}\u{4E24}\u{4E2A}\u{4E3B}\u{8981}\u{90E8}\u{5206}\u{7684}\u{8BE6}\u{7EC6}\u{5185}\u{5BB9}\u{3002}`;
|
|
12505
|
+
const result = await openai.r.generateText({
|
|
12506
|
+
prompt,
|
|
12507
|
+
system_prompt: "\u4F60\u662F\u4E00\u4F4D\u4E13\u4E1A\u7684\u8F6F\u4EF6Bug\u4FEE\u590D\u4E13\u5BB6\uFF0C\u5584\u4E8E\u5206\u6790Bug\u5E76\u5236\u5B9A\u4FEE\u590D\u65B9\u6848\u3002",
|
|
12508
|
+
temperature: 0.3
|
|
12509
|
+
});
|
|
12510
|
+
try {
|
|
12511
|
+
const jsonMatch = result.match(/\{[\s\S]*\}/);
|
|
12512
|
+
if (jsonMatch) return JSON.parse(jsonMatch[0]);
|
|
12513
|
+
} catch (parseError) {
|
|
12514
|
+
utils_logger.k.warn("\u4EFB\u52A1\u6267\u884C\u6E05\u5355JSON\u89E3\u6790\u5931\u8D25\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u7ED3\u6784", {
|
|
12515
|
+
parseError
|
|
12516
|
+
});
|
|
12517
|
+
}
|
|
12518
|
+
return {
|
|
12519
|
+
description_mapping: {
|
|
12520
|
+
analysis: "\u57FA\u4E8EBug\u63CF\u8FF0\u8FDB\u884C\u5206\u6790",
|
|
12521
|
+
project_rules_analysis: "\u89E3\u6790\u9879\u76EE\u89C4\u5219\u6587\u4EF6",
|
|
12522
|
+
mapping_relationship: "\u5EFA\u7ACB\u6620\u5C04\u5173\u7CFB",
|
|
12523
|
+
affected_scope: "\u786E\u5B9A\u53D7\u5F71\u54CD\u4EE3\u7801\u8303\u56F4"
|
|
12524
|
+
},
|
|
12525
|
+
task_completion: {
|
|
12526
|
+
fix_plan: "\u5236\u5B9A\u4FEE\u590D\u65B9\u6848",
|
|
12527
|
+
implementation_steps: "\u5B9E\u65BD\u6B65\u9AA4",
|
|
12528
|
+
code_changes: "\u4EE3\u7801\u4FEE\u6539\u5EFA\u8BAE",
|
|
12529
|
+
validation_methods: "\u9A8C\u8BC1\u65B9\u6CD5",
|
|
12530
|
+
test_cases: "\u6D4B\u8BD5\u7528\u4F8B",
|
|
12531
|
+
deliverables: "\u4EA4\u4ED8\u6587\u6863"
|
|
12532
|
+
}
|
|
12533
|
+
};
|
|
12534
|
+
} catch (error) {
|
|
12535
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
12536
|
+
utils_logger.k.error("\u521B\u5EFA\u4EFB\u52A1\u6267\u884C\u6E05\u5355\u5931\u8D25", {
|
|
12537
|
+
error: errorMsg
|
|
12538
|
+
});
|
|
12539
|
+
return {
|
|
12540
|
+
description_mapping: {
|
|
12541
|
+
analysis: "\u57FA\u4E8EBug\u63CF\u8FF0\u8FDB\u884C\u5206\u6790",
|
|
12542
|
+
project_rules_analysis: "\u89E3\u6790\u9879\u76EE\u89C4\u5219\u6587\u4EF6",
|
|
12543
|
+
mapping_relationship: "\u5EFA\u7ACB\u6620\u5C04\u5173\u7CFB",
|
|
12544
|
+
affected_scope: "\u786E\u5B9A\u53D7\u5F71\u54CD\u4EE3\u7801\u8303\u56F4"
|
|
12545
|
+
},
|
|
12546
|
+
task_completion: {
|
|
12547
|
+
fix_plan: "\u5236\u5B9A\u4FEE\u590D\u65B9\u6848",
|
|
12548
|
+
implementation_steps: "\u5B9E\u65BD\u6B65\u9AA4",
|
|
12549
|
+
code_changes: "\u4EE3\u7801\u4FEE\u6539\u5EFA\u8BAE",
|
|
12550
|
+
validation_methods: "\u9A8C\u8BC1\u65B9\u6CD5",
|
|
12551
|
+
test_cases: "\u6D4B\u8BD5\u7528\u4F8B",
|
|
12552
|
+
deliverables: "\u4EA4\u4ED8\u6587\u6863"
|
|
12553
|
+
}
|
|
12554
|
+
};
|
|
12555
|
+
}
|
|
12556
|
+
}
|
|
12557
|
+
async function executeBugFixTask(bugDescription, projectRules, taskPlan) {
|
|
12558
|
+
try {
|
|
12559
|
+
const prompt = `\u{4F60}\u{662F}\u{4E00}\u{4F4D}\u{4E13}\u{4E1A}\u{7684}\u{8F6F}\u{4EF6}Bug\u{4FEE}\u{590D}\u{4E13}\u{5BB6}\u{3002}\u{8BF7}\u{57FA}\u{4E8E}\u{4EE5}\u{4E0B}\u{4FE1}\u{606F}\u{6267}\u{884C}Bug\u{4FEE}\u{590D}\u{4EFB}\u{52A1}\u{FF1A}
|
|
12560
|
+
|
|
12561
|
+
## Bug\u{63CF}\u{8FF0}
|
|
12562
|
+
${bugDescription}
|
|
12563
|
+
|
|
12564
|
+
## \u{9879}\u{76EE}\u{89C4}\u{5219}
|
|
12565
|
+
${projectRules}
|
|
12566
|
+
|
|
12567
|
+
## \u{4EFB}\u{52A1}\u{6267}\u{884C}\u{8BA1}\u{5212}
|
|
12568
|
+
${JSON.stringify(taskPlan, null, 2)}
|
|
12569
|
+
|
|
12570
|
+
## \u{4EFB}\u{52A1}\u{8981}\u{6C42}
|
|
12571
|
+
\u{8BF7}\u{5B8C}\u{6210}\u{4EE5}\u{4E0B}\u{4EFB}\u{52A1}\u{FF1A}
|
|
12572
|
+
1. \u{5206}\u{6790}Bug\u{7684}\u{6839}\u{672C}\u{539F}\u{56E0}
|
|
12573
|
+
2. \u{5236}\u{5B9A}\u{8BE6}\u{7EC6}\u{7684}\u{4FEE}\u{590D}\u{65B9}\u{6848}
|
|
12574
|
+
3. \u{63D0}\u{4F9B}\u{5177}\u{4F53}\u{7684}\u{4EE3}\u{7801}\u{4FEE}\u{6539}\u{5EFA}\u{8BAE}
|
|
12575
|
+
4. \u{7F16}\u{5199}\u{9A8C}\u{8BC1}\u{65B9}\u{6CD5}\u{548C}\u{6D4B}\u{8BD5}\u{7528}\u{4F8B}
|
|
12576
|
+
5. \u{751F}\u{6210}\u{4FEE}\u{590D}\u{62A5}\u{544A}
|
|
12577
|
+
|
|
12578
|
+
\u{8BF7}\u{8F93}\u{51FA}\u{8BE6}\u{7EC6}\u{7684}\u{4FEE}\u{590D}\u{65B9}\u{6848}\u{FF0C}\u{5305}\u{62EC}\u{4EE3}\u{7801}\u{793A}\u{4F8B}\u{548C}\u{5B9E}\u{65BD}\u{6B65}\u{9AA4}\u{3002}`;
|
|
12579
|
+
const result = await openai.r.generateText({
|
|
12580
|
+
prompt,
|
|
12581
|
+
system_prompt: "\u4F60\u662F\u4E00\u4F4D\u4E13\u4E1A\u7684\u8F6F\u4EF6Bug\u4FEE\u590D\u4E13\u5BB6\uFF0C\u5584\u4E8E\u5206\u6790Bug\u5E76\u63D0\u4F9B\u8BE6\u7EC6\u7684\u4FEE\u590D\u65B9\u6848\u3002",
|
|
12582
|
+
temperature: 0.3,
|
|
12583
|
+
max_tokens: 4000
|
|
12584
|
+
});
|
|
12585
|
+
return {
|
|
12586
|
+
bug_analysis: "\u5DF2\u5B8C\u6210Bug\u5206\u6790",
|
|
12587
|
+
fix_solution: result,
|
|
12588
|
+
implementation_guide: "\u8BF7\u6309\u7167\u4E0A\u8FF0\u65B9\u6848\u5B9E\u65BD\u4FEE\u590D",
|
|
12589
|
+
validation_method: "\u901A\u8FC7\u5355\u5143\u6D4B\u8BD5\u548C\u96C6\u6210\u6D4B\u8BD5\u9A8C\u8BC1\u4FEE\u590D\u6548\u679C"
|
|
12590
|
+
};
|
|
12591
|
+
} catch (error) {
|
|
12592
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
12593
|
+
utils_logger.k.error("\u6267\u884CBug\u4FEE\u590D\u4EFB\u52A1\u5931\u8D25", {
|
|
12594
|
+
error: errorMsg
|
|
12595
|
+
});
|
|
12596
|
+
return {
|
|
12597
|
+
bug_analysis: "Bug\u5206\u6790\u5931\u8D25",
|
|
12598
|
+
fix_solution: `\u{4FEE}\u{590D}\u{65B9}\u{6848}\u{751F}\u{6210}\u{5931}\u{8D25}: ${errorMsg}`,
|
|
12599
|
+
implementation_guide: "\u8BF7\u624B\u52A8\u5206\u6790\u5E76\u4FEE\u590DBug",
|
|
12600
|
+
validation_method: "\u624B\u52A8\u9A8C\u8BC1\u4FEE\u590D\u6548\u679C"
|
|
12601
|
+
};
|
|
12602
|
+
}
|
|
12603
|
+
}
|
|
12604
|
+
async function saveBugFixResult(fixResult, projectName, outputFormat) {
|
|
12605
|
+
try {
|
|
12606
|
+
const storageDir = (0, src_config.WR)();
|
|
12607
|
+
const bugFixDir = external_path_["default"].join(storageDir, 'bug-fix-results');
|
|
12608
|
+
await promises_["default"].mkdir(bugFixDir, {
|
|
12609
|
+
recursive: true
|
|
12610
|
+
});
|
|
12611
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
12612
|
+
const fileName = `bug-fix-${projectName}-${timestamp}.${outputFormat}`;
|
|
12613
|
+
const outputPath = external_path_["default"].join(bugFixDir, fileName);
|
|
12614
|
+
if ('json' === outputFormat) await promises_["default"].writeFile(outputPath, JSON.stringify(fixResult, null, 2), 'utf-8');
|
|
12615
|
+
else {
|
|
12616
|
+
const markdownContent = `# Bug\u{4FEE}\u{590D}\u{62A5}\u{544A}
|
|
12617
|
+
|
|
12618
|
+
## \u{9879}\u{76EE}\u{540D}\u{79F0}
|
|
12619
|
+
${projectName}
|
|
12620
|
+
|
|
12621
|
+
## \u{4FEE}\u{590D}\u{7ED3}\u{679C}
|
|
12622
|
+
${fixResult.fix_solution}
|
|
12623
|
+
|
|
12624
|
+
## \u{5B9E}\u{65BD}\u{6307}\u{5357}
|
|
12625
|
+
${fixResult.implementation_guide}
|
|
12626
|
+
|
|
12627
|
+
## \u{9A8C}\u{8BC1}\u{65B9}\u{6CD5}
|
|
12628
|
+
${fixResult.validation_method}
|
|
12629
|
+
|
|
12630
|
+
## \u{751F}\u{6210}\u{65F6}\u{95F4}
|
|
12631
|
+
${new Date().toISOString()}
|
|
12632
|
+
`;
|
|
12633
|
+
await promises_["default"].writeFile(outputPath, markdownContent, 'utf-8');
|
|
12634
|
+
}
|
|
12635
|
+
return outputPath;
|
|
12636
|
+
} catch (error) {
|
|
12637
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
12638
|
+
utils_logger.k.error("\u4FDD\u5B58Bug\u4FEE\u590D\u7ED3\u679C\u5931\u8D25", {
|
|
12639
|
+
error: errorMsg
|
|
12640
|
+
});
|
|
12641
|
+
throw new Error(`\u{4FDD}\u{5B58}Bug\u{4FEE}\u{590D}\u{7ED3}\u{679C}\u{5931}\u{8D25}: ${errorMsg}`);
|
|
12642
|
+
}
|
|
12643
|
+
}
|
|
12372
12644
|
(0, src_config.NL)();
|
|
12373
12645
|
const server = new FastMCP({
|
|
12374
12646
|
name: src_config.Gp.name,
|
|
@@ -12389,6 +12661,7 @@ server.addTool(convertImageTool);
|
|
|
12389
12661
|
server.addTool(batchConvertImagesTool);
|
|
12390
12662
|
server.addTool(getImageInfoTool);
|
|
12391
12663
|
server.addTool(listSupportedFormatsTool);
|
|
12664
|
+
server.addTool(bugFixAgentTool);
|
|
12392
12665
|
server.addTool(addTaskToQueueTool);
|
|
12393
12666
|
server.addTool(createIterationTool);
|
|
12394
12667
|
server.addTool(enhanced_tools_updateTaskTool);
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const BugFixAgentParams: z.ZodObject<{
|
|
3
|
+
bug_description: z.ZodString;
|
|
4
|
+
project_path: z.ZodOptional<z.ZodString>;
|
|
5
|
+
project_name: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
6
|
+
output_format: z.ZodDefault<z.ZodOptional<z.ZodEnum<["markdown", "json"]>>>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
project_name: string;
|
|
9
|
+
output_format: "json" | "markdown";
|
|
10
|
+
bug_description: string;
|
|
11
|
+
project_path?: string | undefined;
|
|
12
|
+
}, {
|
|
13
|
+
bug_description: string;
|
|
14
|
+
project_name?: string | undefined;
|
|
15
|
+
project_path?: string | undefined;
|
|
16
|
+
output_format?: "json" | "markdown" | undefined;
|
|
17
|
+
}>;
|
|
18
|
+
export interface BugFixAgentParams {
|
|
19
|
+
bug_description: string;
|
|
20
|
+
project_path?: string;
|
|
21
|
+
project_name?: string;
|
|
22
|
+
output_format?: 'markdown' | 'json';
|
|
23
|
+
}
|
|
24
|
+
export declare const bugFixAgentTool: {
|
|
25
|
+
name: string;
|
|
26
|
+
description: string;
|
|
27
|
+
parameters: z.ZodObject<{
|
|
28
|
+
bug_description: z.ZodString;
|
|
29
|
+
project_path: z.ZodOptional<z.ZodString>;
|
|
30
|
+
project_name: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
31
|
+
output_format: z.ZodDefault<z.ZodOptional<z.ZodEnum<["markdown", "json"]>>>;
|
|
32
|
+
}, "strip", z.ZodTypeAny, {
|
|
33
|
+
project_name: string;
|
|
34
|
+
output_format: "json" | "markdown";
|
|
35
|
+
bug_description: string;
|
|
36
|
+
project_path?: string | undefined;
|
|
37
|
+
}, {
|
|
38
|
+
bug_description: string;
|
|
39
|
+
project_name?: string | undefined;
|
|
40
|
+
project_path?: string | undefined;
|
|
41
|
+
output_format?: "json" | "markdown" | undefined;
|
|
42
|
+
}>;
|
|
43
|
+
execute: (args: BugFixAgentParams) => Promise<string>;
|
|
44
|
+
};
|
|
@@ -249,3 +249,24 @@ export declare const requirementAnalyzerTool: {
|
|
|
249
249
|
}>;
|
|
250
250
|
execute: (args: RequirementAnalyzerParams) => Promise<string>;
|
|
251
251
|
};
|
|
252
|
+
export declare enum ErrorType {
|
|
253
|
+
FILE_NOT_FOUND = "FILE_NOT_FOUND",
|
|
254
|
+
FILE_ACCESS_ERROR = "FILE_ACCESS_ERROR",
|
|
255
|
+
INVALID_INPUT = "INVALID_INPUT",
|
|
256
|
+
AI_SERVICE_ERROR = "AI_SERVICE_ERROR",
|
|
257
|
+
JSON_PARSE_ERROR = "JSON_PARSE_ERROR",
|
|
258
|
+
NETWORK_ERROR = "NETWORK_ERROR",
|
|
259
|
+
MEMORY_ERROR = "MEMORY_ERROR",
|
|
260
|
+
TIMEOUT_ERROR = "TIMEOUT_ERROR",
|
|
261
|
+
UNKNOWN_ERROR = "UNKNOWN_ERROR"
|
|
262
|
+
}
|
|
263
|
+
export declare function categorizeError(error: unknown): ErrorType;
|
|
264
|
+
export declare function generateUserFriendlyErrorMessage(errorType: ErrorType, originalMessage: string): string;
|
|
265
|
+
export declare function extractFeaturesWithNLP(inputContent: string): Promise<Array<{
|
|
266
|
+
featureName: string;
|
|
267
|
+
description: string;
|
|
268
|
+
priority: 'high' | 'medium' | 'low';
|
|
269
|
+
estimatedComplexity: '简单' | '中等' | '复杂';
|
|
270
|
+
type: '核心功能点' | '辅助功能点' | '扩展功能点';
|
|
271
|
+
businessValue: string;
|
|
272
|
+
}>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const apiTemplatePrompt = "\u4F60\u662F\u4E00\u4F4D\u4E13\u4E1A\u7684\u540E\u7AEF\u6280\u672F\u6587\u6863\u7F16\u5199\u4E13\u5BB6\u3002\u8BF7\u57FA\u4E8E\u7528\u6237\u63D0\u4F9B\u7684\u8F93\u5165\u5185\u5BB9\uFF0C\u751F\u6210\u4E00\u4EFD\u5B8C\u6574\u3001\u8BE6\u7EC6\u7684API\u63A5\u53E3\u6280\u672F\u9700\u6C42\u6587\u6863\u3002\n\n## \u4EFB\u52A1\u8981\u6C42\n- \u5FC5\u987B\u8F93\u51FA\u5B8C\u6574\u7684Markdown\u683C\u5F0F\u6280\u672F\u9700\u6C42\u6587\u6863\n- \u4E0D\u8981\u53EA\u7ED9\u51FA\u603B\u7ED3\uFF0C\u8981\u8F93\u51FA\u5B8C\u6574\u7684\u6587\u6863\u5185\u5BB9\n- \u6BCF\u4E2A\u7AE0\u8282\u90FD\u8981\u6709\u8BE6\u7EC6\u7684\u5185\u5BB9\uFF0C\u4E0D\u80FD\u7701\u7565\n- \u6587\u6863\u957F\u5EA6\u5E94\u8BE5\u57283000\u5B57\u4EE5\u4E0A\n- \u91CD\u70B9\u63CF\u8FF0API\u63A5\u53E3\u8BBE\u8BA1\u3001\u6570\u636E\u7ED3\u6784\u3001\u4EA4\u4E92\u903B\u8F91\u7B49\u540E\u7AEF\u76F8\u5173\u5185\u5BB9\n\n## \u8F93\u5165\u4FE1\u606F\n- **\u529F\u80FD\u540D\u79F0**: {featureName}\n- **\u4E1A\u52A1\u9886\u57DF**: {businessDomain}\n- **\u751F\u6210\u65F6\u5E8F\u56FE**: {generateSequenceDiagram}\n\n## \u539F\u59CB\u9700\u6C42\u5185\u5BB9\n```\n{inputContent}\n```\n\n## \u6587\u6863\u7ED3\u6784\u8981\u6C42\n\u8BF7\u4E25\u683C\u6309\u7167\u4EE5\u4E0B\u7ED3\u6784\u8F93\u51FA\u5B8C\u6574\u7684\u9700\u6C42\u6587\u6863\uFF0C\u6BCF\u4E2A\u7AE0\u8282\u90FD\u8981\u6709\u8BE6\u5B9E\u7684\u5185\u5BB9\uFF1A\n\n# {featureName} - API\u63A5\u53E3\u6280\u672F\u9700\u6C42\u6587\u6863\n\n> **\u751F\u6210\u65F6\u95F4**: {currentTime}\n> **\u4E1A\u52A1\u9886\u57DF**: {businessDomain}\n> **\u63A5\u53E3\u7C7B\u578B**: RESTful API\n\n---\n\n## 1. \u9700\u6C42\u80CC\u666F\n\n**\u80CC\u666F**: [\u8BE6\u7EC6\u63CF\u8FF0API\u63A5\u53E3\u7684\u80CC\u666F\u3001\u4E1A\u52A1\u9700\u6C42\u548C\u76EE\u6807]\n\n**\u5173\u952E\u529F\u80FD**: [\u5217\u51FAAPI\u63A5\u53E3\u7684\u4E3B\u8981\u529F\u80FD\u70B9]\n\n**\u6D89\u53CA\u89D2\u8272**: [\u5217\u51FA\u6240\u6709\u76F8\u5173\u7CFB\u7EDF\u89D2\u8272]\n\n## 2. {featureName}\u529F\u80FD\u8BBE\u8BA1\u8BF4\u660E\n\n| | | | | |\n|---|---|---|---|---|\n|**\u6D41\u7A0B\u7F16\u53F7**|F001|**\u6D41\u7A0B\u540D\u79F0**|{featureName}|\n|**\u4E1A\u52A1\u529F\u80FD\u7F16\u53F7**|BF001|**\u4E1A\u52A1\u529F\u80FD\u540D\u79F0**|{featureName}|\n|**\u529F\u80FD\u8BBE\u8BA1\u7F16\u53F7**|FD001|**\u7CFB\u7EDF\u529F\u80FD\u540D\u79F0**|{featureName}|\n|**\u524D\u7F6E\u6761\u4EF6**|[\u8BE6\u7EC6\u63CF\u8FF0API\u8C03\u7528\u7684\u524D\u7F6E\u6761\u4EF6]|\n|**\u89D2\u8272\uFF08\u5C97\u4F4D\uFF09**|[\u8BE6\u7EC6\u63CF\u8FF0\u8C03\u7528\u65B9\u89D2\u8272\u53CA\u5176\u6743\u9650]|\n|**\u5165\u53E3\u6E20\u9053**|[\u63CF\u8FF0API\u8C03\u7528\u5165\u53E3]|\n|**\u529F\u80FD\u63CF\u8FF0**|[\u8BE6\u7EC6\u7684\u529F\u80FD\u63CF\u8FF0]|\n|**\u8C03\u7528\u80FD\u529B\u57DF/\u4E2D\u5FC3**|[\u5982\u9002\u7528\u7684\u5176\u4ED6\u7CFB\u7EDF\u63A5\u53E3]|\n\n## 3. ER\u903B\u8F91\u56FE\u8BBE\u8BA1\n\n[\u63CF\u8FF0\u6570\u636E\u5E93\u8868\u4E4B\u95F4\u7684\u5173\u7CFB\u548CER\u56FE\u8BBE\u8BA1]\n\n## 4. \u6570\u636E\u8868\u5B9E\u4F53\u8BBE\u8BA1\n\n[\u8BE6\u7EC6\u63CF\u8FF0\u6D89\u53CA\u7684\u6570\u636E\u8868\u5B9E\u4F53\u7ED3\u6784\uFF0C\u5305\u62EC\u5B57\u6BB5\u540D\u3001\u7C7B\u578B\u3001\u7EA6\u675F\u6761\u4EF6\u7B49]\n\n## 5. API\u63A5\u53E3\u8BBE\u8BA1\n\n### 5.1 \u63A5\u53E3\u6982\u8FF0\n[\u8BE6\u7EC6\u63CF\u8FF0API\u63A5\u53E3\u7684\u6574\u4F53\u8BBE\u8BA1\u601D\u8DEF\u548C\u67B6\u6784]\n\n### 5.2 \u63A5\u53E3\u5217\u8868\n[\u5217\u51FA\u6240\u6709\u76F8\u5173\u7684API\u63A5\u53E3]\n\n## 5. \u63A5\u53E3\u8BE6\u7EC6\u8BF4\u660E\n\n### 5.1 \u63A5\u53E31 - [\u63A5\u53E3\u540D\u79F0]\n#### 5.1.1 \u57FA\u672C\u4FE1\u606F\n- **\u63A5\u53E3\u5730\u5740**: [URL\u8DEF\u5F84]\n- **\u8BF7\u6C42\u65B9\u6CD5**: [\u53EA\u5141\u8BB8\u4F7F\u7528POST\u8BF7\u6C42]\n- **\u534F\u8BAE**: [\u53EA\u5141\u8BB8\u4F7F\u7528HTTPS]\n- **\u5185\u5BB9\u7C7B\u578B**: [application/json\u7B49]\n\n#### 5.1.2 \u8BF7\u6C42\u53C2\u6570\n[\u8BE6\u7EC6\u8BF4\u660E\u8BF7\u6C42\u53C2\u6570]\n\n|\u53C2\u6570\u540D|\u7C7B\u578B|\u662F\u5426\u5FC5\u586B|\u4F4D\u7F6E|\u8BF4\u660E|\n|------|----|--------|----|----|\n|[\u53C2\u65701]|[string/int\u7B49]|[\u662F/\u5426]|[query/body/path]|[\u8BE6\u7EC6\u8BF4\u660E]|\n|[\u53C2\u65702]|[string/int\u7B49]|[\u662F/\u5426]|[query/body/path]|[\u8BE6\u7EC6\u8BF4\u660E]|\n\n#### 5.1.3 \u54CD\u5E94\u53C2\u6570\n[\u8BE6\u7EC6\u8BF4\u660E\u54CD\u5E94\u53C2\u6570]\n\n|\u53C2\u6570\u540D|\u7C7B\u578B|\u8BF4\u660E|\n|------|----|----|\n|[\u53C2\u65701]|[string/object\u7B49]|[\u8BE6\u7EC6\u8BF4\u660E]|\n|[\u53C2\u65702]|[string/object\u7B49]|[\u8BE6\u7EC6\u8BF4\u660E]|\n\n#### 5.1.4 \u9519\u8BEF\u7801\u8BF4\u660E\n[\u8BE6\u7EC6\u8BF4\u660E\u8BE5\u63A5\u53E3\u7684\u9519\u8BEF\u7801]\n\n|\u9519\u8BEF\u7801|\u8BF4\u660E|\n|------|----|\n|[\u9519\u8BEF\u78011]|[\u8BE6\u7EC6\u8BF4\u660E]|\n|[\u9519\u8BEF\u78012]|[\u8BE6\u7EC6\u8BF4\u660E]|\n\n#### 5.1.5 \u8BE6\u7EC6\u903B\u8F91\n[\u5206\u6B65\u9AA4\u8BE6\u7EC6\u63CF\u8FF0\u8BE5\u63A5\u53E3\u7684\u8BE6\u7EC6\u903B\u8F91]\n\n## 6. \u4E1A\u52A1\u5BF9\u8C61\u65F6\u5E8F\u56FE\n\n```mermaid\nsequenceDiagram\n participant \u5BA2\u6237\u7AEF\n participant API\u7F51\u5173\n participant \u8BA4\u8BC1\u670D\u52A1\n participant \u6743\u9650\u670D\u52A1\n participant \u4E1A\u52A1\u670D\u52A1\n participant \u6570\u636E\u5E93\n participant \u7F13\u5B58\u670D\u52A1\n participant \u6D88\u606F\u961F\u5217\n participant \u65E5\u5FD7\u670D\u52A1\n participant \u76D1\u63A7\u670D\u52A1\n \n \u5BA2\u6237\u7AEF->>API\u7F51\u5173: \u53D1\u9001API\u8BF7\u6C42\n API\u7F51\u5173->>\u8BA4\u8BC1\u670D\u52A1: \u9A8C\u8BC1\u8BF7\u6C42\u4EE4\u724C\n \u8BA4\u8BC1\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE\u8BA4\u8BC1\u7ED3\u679C\n API\u7F51\u5173->>\u6743\u9650\u670D\u52A1: \u68C0\u67E5\u8BBF\u95EE\u6743\u9650\n \u6743\u9650\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE\u6743\u9650\u4FE1\u606F\n API\u7F51\u5173->>\u4E1A\u52A1\u670D\u52A1: \u8F6C\u53D1\u8BF7\u6C42\n \u4E1A\u52A1\u670D\u52A1->>\u7F13\u5B58\u670D\u52A1: \u67E5\u8BE2\u7F13\u5B58\u6570\u636E\n alt \u7F13\u5B58\u547D\u4E2D\n \u7F13\u5B58\u670D\u52A1-->>\u4E1A\u52A1\u670D\u52A1: \u8FD4\u56DE\u7F13\u5B58\u6570\u636E\n \u4E1A\u52A1\u670D\u52A1->>\u76D1\u63A7\u670D\u52A1: \u8BB0\u5F55\u7F13\u5B58\u547D\u4E2D\n else \u7F13\u5B58\u672A\u547D\u4E2D\n \u4E1A\u52A1\u670D\u52A1->>\u6570\u636E\u5E93: \u67E5\u8BE2\u6570\u636E\n \u6570\u636E\u5E93-->>\u4E1A\u52A1\u670D\u52A1: \u8FD4\u56DE\u67E5\u8BE2\u7ED3\u679C\n \u4E1A\u52A1\u670D\u52A1->>\u7F13\u5B58\u670D\u52A1: \u5B58\u50A8\u5230\u7F13\u5B58\n \u4E1A\u52A1\u670D\u52A1->>\u76D1\u63A7\u670D\u52A1: \u8BB0\u5F55\u6570\u636E\u5E93\u67E5\u8BE2\n end\n \u4E1A\u52A1\u670D\u52A1->>\u6D88\u606F\u961F\u5217: \u53D1\u9001\u5F02\u6B65\u6D88\u606F\n \u4E1A\u52A1\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE\u54CD\u5E94\u6570\u636E\n API\u7F51\u5173->>\u65E5\u5FD7\u670D\u52A1: \u8BB0\u5F55\u8BBF\u95EE\u65E5\u5FD7\n API\u7F51\u5173->>\u76D1\u63A7\u670D\u52A1: \u8BB0\u5F55\u6027\u80FD\u6307\u6807\n API\u7F51\u5173->>\u5BA2\u6237\u7AEF: \u8FD4\u56DE\u54CD\u5E94\n```\n\n### 6.2 \u65B9\u6848\u4E8C\uFF1A\u66FF\u4EE3\u6D41\u7A0B\uFF08\u4E0D\u540C\u6709\u6548\u8DEF\u5F84\uFF09\n\n#### 6.2.1 \u8BA4\u8BC1/\u6388\u6743\u6D41\u7A0B\n```mermaid\nsequenceDiagram\n participant \u5BA2\u6237\u7AEF\n participant API\u7F51\u5173\n participant \u8BA4\u8BC1\u670D\u52A1\n participant \u6743\u9650\u670D\u52A1\n participant \u4E1A\u52A1\u670D\u52A1\n participant \u65E5\u5FD7\u670D\u52A1\n \n \u5BA2\u6237\u7AEF->>API\u7F51\u5173: \u53D1\u9001API\u8BF7\u6C42\n API\u7F51\u5173->>\u8BA4\u8BC1\u670D\u52A1: \u9A8C\u8BC1\u8BF7\u6C42\u4EE4\u724C\n alt \u4EE4\u724C\u6709\u6548\n \u8BA4\u8BC1\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE\u8BA4\u8BC1\u6210\u529F\n API\u7F51\u5173->>\u6743\u9650\u670D\u52A1: \u68C0\u67E5\u8BBF\u95EE\u6743\u9650\n \u6743\u9650\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE\u6743\u9650\u4FE1\u606F\n API\u7F51\u5173->>\u4E1A\u52A1\u670D\u52A1: \u8F6C\u53D1\u8BF7\u6C42\n \u4E1A\u52A1\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE\u54CD\u5E94\u6570\u636E\n API\u7F51\u5173->>\u5BA2\u6237\u7AEF: \u8FD4\u56DE\u54CD\u5E94\n else \u4EE4\u724C\u65E0\u6548\n \u8BA4\u8BC1\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE\u8BA4\u8BC1\u5931\u8D25\n API\u7F51\u5173->>\u65E5\u5FD7\u670D\u52A1: \u8BB0\u5F55\u8BA4\u8BC1\u5931\u8D25\n API\u7F51\u5173->>\u5BA2\u6237\u7AEF: \u8FD4\u56DE401\u9519\u8BEF\n end\n```\n\n### 6.3 \u5F02\u5E38\u6D41\u7A0B\uFF08\u9519\u8BEF\u5904\u7406\uFF09\n\n#### 6.3.1 \u9650\u6D41\u5904\u7406\n```mermaid\nsequenceDiagram\n participant \u5BA2\u6237\u7AEF\n participant API\u7F51\u5173\n participant \u9650\u6D41\u670D\u52A1\n participant \u65E5\u5FD7\u670D\u52A1\n \n \u5BA2\u6237\u7AEF->>API\u7F51\u5173: \u53D1\u9001API\u8BF7\u6C42\n API\u7F51\u5173->>\u9650\u6D41\u670D\u52A1: \u68C0\u67E5\u8BF7\u6C42\u9891\u7387\n \u9650\u6D41\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE\u9650\u6D41\u51B3\u5B9A\n alt \u8BF7\u6C42\u9891\u7387\u6B63\u5E38\n API\u7F51\u5173->>\u540E\u7EED\u670D\u52A1: \u5904\u7406\u8BF7\u6C42\n else \u8BF7\u6C42\u9891\u7387\u8FC7\u9AD8\n API\u7F51\u5173->>\u65E5\u5FD7\u670D\u52A1: \u8BB0\u5F55\u9650\u6D41\u4E8B\u4EF6\n API\u7F51\u5173->>\u5BA2\u6237\u7AEF: \u8FD4\u56DE429\u9519\u8BEF(\u8BF7\u6C42\u8FC7\u591A)\n end\n```\n\n#### 6.3.2 \u6570\u636E\u9A8C\u8BC1\u51B2\u7A81\n```mermaid\nsequenceDiagram\n participant \u5BA2\u6237\u7AEF\n participant API\u7F51\u5173\n participant \u4E1A\u52A1\u670D\u52A1\n participant \u6570\u636E\u9A8C\u8BC1\u5668\n participant \u65E5\u5FD7\u670D\u52A1\n \n \u5BA2\u6237\u7AEF->>API\u7F51\u5173: \u53D1\u9001\u5305\u542B\u65E0\u6548\u6570\u636E\u7684\u8BF7\u6C42\n API\u7F51\u5173->>\u4E1A\u52A1\u670D\u52A1: \u8F6C\u53D1\u8BF7\u6C42\n \u4E1A\u52A1\u670D\u52A1->>\u6570\u636E\u9A8C\u8BC1\u5668: \u9A8C\u8BC1\u6570\u636E\u683C\u5F0F\n \u6570\u636E\u9A8C\u8BC1\u5668-->>\u4E1A\u52A1\u670D\u52A1: \u8FD4\u56DE\u9A8C\u8BC1\u5931\u8D25\n \u4E1A\u52A1\u670D\u52A1->>\u65E5\u5FD7\u670D\u52A1: \u8BB0\u5F55\u9A8C\u8BC1\u9519\u8BEF\n \u4E1A\u52A1\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE400\u9519\u8BEF(\u8BF7\u6C42\u6570\u636E\u65E0\u6548)\n API\u7F51\u5173->>\u5BA2\u6237\u7AEF: \u8FD4\u56DE400\u9519\u8BEF\u53CA\u9519\u8BEF\u8BE6\u60C5\n```\n\n#### 6.3.3 API Schema\u9A8C\u8BC1\u9519\u8BEF\n```mermaid\nsequenceDiagram\n participant \u5F00\u53D1\u8005\n participant API\u7F51\u5173\n participant Schema\u9A8C\u8BC1\u5668\n participant \u7248\u672C\u7BA1\u7406\u5668\n participant \u65E5\u5FD7\u670D\u52A1\n participant \u76D1\u63A7\u670D\u52A1\n \n \u5F00\u53D1\u8005->>API\u7F51\u5173: \u90E8\u7F72API\u5B9A\u4E49\n API\u7F51\u5173->>Schema\u9A8C\u8BC1\u5668: \u9A8C\u8BC1API Schema\n Schema\u9A8C\u8BC1\u5668->>\u7248\u672C\u7BA1\u7406\u5668: \u83B7\u53D6\u5386\u53F2\u7248\u672C\n \u7248\u672C\u7BA1\u7406\u5668-->>Schema\u9A8C\u8BC1\u5668: \u8FD4\u56DE\u5386\u53F2\u5B9A\u4E49\n Schema\u9A8C\u8BC1\u5668->>Schema\u9A8C\u8BC1\u5668: \u6267\u884C\u517C\u5BB9\u6027\u68C0\u67E5\n alt Schema\u6709\u6548\n Schema\u9A8C\u8BC1\u5668-->>API\u7F51\u5173: \u8FD4\u56DE\u9A8C\u8BC1\u901A\u8FC7\n API\u7F51\u5173->>\u5F00\u53D1\u8005: \u901A\u77E5\u90E8\u7F72\u6210\u529F\n else Schema\u65E0\u6548\n Schema\u9A8C\u8BC1\u5668-->>API\u7F51\u5173: \u8FD4\u56DE\u9A8C\u8BC1\u5931\u8D25\n API\u7F51\u5173->>\u65E5\u5FD7\u670D\u52A1: \u8BB0\u5F55Schema\u9519\u8BEF\n API\u7F51\u5173->>\u76D1\u63A7\u670D\u52A1: \u8BB0\u5F55\u9A8C\u8BC1\u5931\u8D25\u6307\u6807\n API\u7F51\u5173->>\u5F00\u53D1\u8005: \u8FD4\u56DE\u9519\u8BEF\u8BE6\u60C5\u548C\u4FEE\u590D\u5EFA\u8BAE\n end\n```\n\n### 6.4 \u8FB9\u7F18\u60C5\u51B5\u6D41\u7A0B\uFF08\u5E76\u53D1\u3001\u8D85\u65F6\u7B49\uFF09\n\n#### 6.4.1 \u5E76\u53D1\u51B2\u7A81\u5904\u7406\n```mermaid\nsequenceDiagram\n participant \u5BA2\u6237\u7AEF\n participant API\u7F51\u5173\n participant \u6570\u636E\u5E93\n participant \u65E5\u5FD7\u670D\u52A1\n participant \u7F13\u5B58\u670D\u52A1\n \n alt \u9AD8\u5E76\u53D1\u573A\u666F\n \u5BA2\u6237\u7AEF->>API\u7F51\u5173: \u5E76\u53D1\u8BF7\u6C42\n API\u7F51\u5173->>\u6570\u636E\u5E93: \u6267\u884C\u6570\u636E\u64CD\u4F5C\n \u6570\u636E\u5E93-->>API\u7F51\u5173: \u8FD4\u56DE\u7ED3\u679C\n API\u7F51\u5173->>\u7F13\u5B58\u670D\u52A1: \u7F13\u5B58\u54CD\u5E94\u6570\u636E\n API\u7F51\u5173->>\u65E5\u5FD7\u670D\u52A1: \u8BB0\u5F55\u5E76\u53D1\u51B2\u7A81\n else \u975E\u9AD8\u5E76\u53D1\u573A\u666F\n API\u7F51\u5173->>\u6570\u636E\u5E93: \u6267\u884C\u6570\u636E\u64CD\u4F5C\n \u6570\u636E\u5E93-->>API\u7F51\u5173: \u8FD4\u56DE\u7ED3\u679C\n API\u7F51\u5173->>\u7F13\u5B58\u670D\u52A1: \u7F13\u5B58\u54CD\u5E94\u6570\u636E\n end\n API\u7F51\u5173->>\u5BA2\u6237\u7AEF: \u8FD4\u56DE\u54CD\u5E94\n```\n#### 6.4.2 \u8D85\u65F6\u5904\u7406\n```mermaid\nsequenceDiagram\n participant \u5BA2\u6237\u7AEF\n participant API\u7F51\u5173\n participant \u4E1A\u52A1\u670D\u52A1\n participant \u65E5\u5FD7\u670D\u52A1\n participant \u76D1\u63A7\u670D\u52A1\n participant \u5907\u7528\u670D\u52A1\n \n \u5BA2\u6237\u7AEF->>API\u7F51\u5173: \u53D1\u9001\u5305\u542B\u65E0\u6548\u6570\u636E\u7684\u8BF7\u6C42\n API\u7F51\u5173->>\u4E1A\u52A1\u670D\u52A1: \u8F6C\u53D1\u8BF7\u6C42\n \u4E1A\u52A1\u670D\u52A1->>\u65E5\u5FD7\u670D\u52A1: \u8BB0\u5F55\u8D85\u65F6\u4E8B\u4EF6\n \u4E1A\u52A1\u670D\u52A1->>\u76D1\u63A7\u670D\u52A1: \u4E0A\u62A5\u8D85\u65F6\u6307\u6807\n \u4E1A\u52A1\u670D\u52A1-->>\u4E1A\u52A1\u670D\u52A1: \u91CD\u8BD5\u8BF7\u6C42\n \u4E1A\u52A1\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE408\u9519\u8BEF(\u8BF7\u6C42\u8D85\u65F6)\n API\u7F51\u5173->>\u5907\u7528\u670D\u52A1: \u8F6C\u53D1\u8BF7\u6C42\n \u5907\u7528\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE\u9519\u8BEF\u54CD\u5E94\n API\u7F51\u5173->>\u65E5\u5FD7\u670D\u52A1: \u65E5\u5FD7\u8BB0\u5F55\u5907\u7528\u670D\u52A1\u54CD\u5E94\n API\u7F51\u5173->>\u76D1\u63A7\u670D\u52A1: \u8BB0\u5F55\u5907\u7528\u670D\u52A1\u5931\u8D25\n API\u7F51\u5173->>\u5BA2\u6237\u7AEF: \u8FD4\u56DE\u5907\u7528\u670D\u52A1\u54CD\u5E94\n```\n\n#### 6.4.3 API\u6027\u80FD\u964D\u7EA7\u5904\u7406\n```mermaid\nsequenceDiagram\n participant \u5BA2\u6237\u7AEF\n participant API\u7F51\u5173\n participant \u6027\u80FD\u76D1\u63A7\u5668\n participant \u964D\u7EA7\u7B56\u7565\u5668\n participant \u7F13\u5B58\u670D\u52A1\n participant \u65E5\u5FD7\u670D\u52A1\n \n \u5BA2\u6237\u7AEF->>API\u7F51\u5173: \u53D1\u9001API\u8BF7\u6C42\n API\u7F51\u5173->>\u6027\u80FD\u76D1\u63A7\u5668: \u68C0\u67E5\u670D\u52A1\u6027\u80FD\n \u6027\u80FD\u76D1\u63A7\u5668-->>API\u7F51\u5173: \u8FD4\u56DE\u6027\u80FD\u72B6\u6001\n alt \u6027\u80FD\u6B63\u5E38\n API\u7F51\u5173->>\u540E\u7EED\u670D\u52A1: \u6B63\u5E38\u5904\u7406\u8BF7\u6C42\n \u540E\u7EED\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE\u5B8C\u6574\u54CD\u5E94\n else \u6027\u80FD\u964D\u7EA7\n API\u7F51\u5173->>\u964D\u7EA7\u7B56\u7565\u5668: \u5E94\u7528\u964D\u7EA7\u7B56\u7565\n \u964D\u7EA7\u7B56\u7565\u5668-->>API\u7F51\u5173: \u8FD4\u56DE\u964D\u7EA7\u914D\u7F6E\n API\u7F51\u5173->>\u7F13\u5B58\u670D\u52A1: \u83B7\u53D6\u7F13\u5B58\u6570\u636E\n \u7F13\u5B58\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE\u7F13\u5B58\u54CD\u5E94\n API\u7F51\u5173->>\u65E5\u5FD7\u670D\u52A1: \u8BB0\u5F55\u964D\u7EA7\u4E8B\u4EF6\n end\n API\u7F51\u5173->>\u5BA2\u6237\u7AEF: \u8FD4\u56DE\u54CD\u5E94\n```\n\n## 7. \u4E1A\u52A1\u72B6\u6001\u63CF\u8FF0\n\n| | | |\n|---|---|---|\n|**\u72B6\u6001\u7F16\u53F7**|**\u72B6\u6001\u540D\u79F0**|**\u63CF\u8FF0**|\n|01|\u8BF7\u6C42\u63A5\u6536|API\u63A5\u6536\u5230\u8BF7\u6C42|\n|02|\u53C2\u6570\u9A8C\u8BC1|\u6B63\u5728\u9A8C\u8BC1\u8BF7\u6C42\u53C2\u6570|\n|03|\u4E1A\u52A1\u5904\u7406|\u6B63\u5728\u5904\u7406\u4E1A\u52A1\u903B\u8F91|\n|04|\u6570\u636E\u64CD\u4F5C|\u6B63\u5728\u6267\u884C\u6570\u636E\u64CD\u4F5C|\n|05|\u54CD\u5E94\u8FD4\u56DE|\u6B63\u5728\u8FD4\u56DE\u54CD\u5E94|\n|06|\u5904\u7406\u5B8C\u6210|\u8BF7\u6C42\u5904\u7406\u5B8C\u6210|\n|[\u6DFB\u52A0\u66F4\u591A\u72B6\u6001...]||\n\n## 8. \u4F2A\u4EE3\u7801\u793A\u4F8B\n\n```gherkin\nScenario Outline: \u7528\u6237\u901A\u8FC7API\u67E5\u8BE2\u8BA2\u5355\u4FE1\u606F\n Given \u7528\u6237\u5DF2\u901A\u8FC7\u8BA4\u8BC1\u5E76\u62E5\u6709\u67E5\u8BE2\u6743\u9650\n When \u7528\u6237\u5411/orders/<order_id>\u63A5\u53E3\u53D1\u9001POST\u8BF7\u6C42\n Then \u7CFB\u7EDF\u5E94\u8FD4\u56DE\u8BA2\u5355\u4FE1\u606F\u6216 <error_message>\n\n Examples:\n | order_id | error_message |\n | 12345 | null (\u6210\u529F\u8FD4\u56DE\u8BA2\u5355\u4FE1\u606F) |\n | 99999 | \"\u8BA2\u5355\u4E0D\u5B58\u5728\" |\n\nScenario Outline: API\u8BA4\u8BC1\u4E0E\u6388\u6743\u6D41\u7A0B\n Given \u5BA2\u6237\u7AEF\u4F7F\u7528<auth_type>\u65B9\u5F0F\u8FDB\u884C\u8BA4\u8BC1\n When \u5BA2\u6237\u7AEF\u8BBF\u95EE<api_endpoint>\u63A5\u53E3\u65F6\n Then \u7CFB\u7EDF\u5E94:\n 1. \u9A8C\u8BC1\u8BA4\u8BC1\u51ED\u8BC1\u7684\u6709\u6548\u6027\n 2. \u68C0\u67E5\u7528\u6237\u6743\u9650\n 3. \u6839\u636E\u9A8C\u8BC1\u7ED3\u679C\u8FD4\u56DE\u76F8\u5E94\u54CD\u5E94\n\n Examples:\n | auth_type | api_endpoint | \u9884\u671F\u884C\u4E3A |\n | Bearer Token | /orders | \u9A8C\u8BC1\u4EE4\u724C\u6709\u6548\u6027\uFF0C\u68C0\u67E5\u8BA2\u5355\u8BBF\u95EE\u6743\u9650 |\n | API Key | /products | \u9A8C\u8BC1API Key\uFF0C\u68C0\u67E5\u4EA7\u54C1\u8BBF\u95EE\u6743\u9650 |\n | \u65E0\u6548\u4EE4\u724C | /orders | \u8FD4\u56DE401\u672A\u6388\u6743\u9519\u8BEF |\n | \u65E0\u6743\u9650\u7528\u6237 | /admin | \u8FD4\u56DE403\u7981\u6B62\u8BBF\u95EE\u9519\u8BEF |\n\nScenario Outline: API\u8C03\u7528\u4E0E\u6570\u636E\u5904\u7406\u6D41\u7A0B\n Given \u5BA2\u6237\u7AEF\u5411<api_endpoint>\u53D1\u9001<http_method>\u8BF7\u6C42\n When \u8BF7\u6C42\u5305\u542B<data_status>\u6570\u636E\u65F6\n Then \u7CFB\u7EDF\u5E94:\n 1. \u9A8C\u8BC1\u8BF7\u6C42\u53C2\u6570\u683C\u5F0F\n 2. \u6267\u884C\u4E1A\u52A1\u903B\u8F91\u5904\u7406\n 3. \u8FD4\u56DE\u6807\u51C6\u5316\u54CD\u5E94\u683C\u5F0F\n\n Examples:\n | api_endpoint | http_method | data_status | \u5904\u7406\u903B\u8F91 |\n | /users | POST | \u6709\u6548\u6570\u636E | \u521B\u5EFA\u65B0\u7528\u6237\uFF0C\u8FD4\u56DE\u7528\u6237ID\u548C\u521B\u5EFA\u65F6\u95F4 |\n | /users | POST | \u7F3A\u5931\u5FC5\u586B\u9879 | \u8FD4\u56DE400\u9519\u8BEF\uFF0C\u8BE6\u7EC6\u8BF4\u660E\u7F3A\u5931\u5B57\u6BB5 |\n | /users/123 | PUT | \u66F4\u65B0\u6570\u636E | \u66F4\u65B0\u7528\u6237\u4FE1\u606F\uFF0C\u8FD4\u56DE\u66F4\u65B0\u540E\u7684\u5B8C\u6574\u7528\u6237\u4FE1\u606F |\n | /users/123 | DELETE | \u5B58\u5728\u8D44\u6E90 | \u5220\u9664\u7528\u6237\uFF0C\u8FD4\u56DE204\u72B6\u6001\u7801 |\n | /users/999 | POST | \u4E0D\u5B58\u5728\u8D44\u6E90 | \u8FD4\u56DE404\u9519\u8BEF\uFF0C\u8BF4\u660E\u8D44\u6E90\u672A\u627E\u5230 |\n | /users | POST | \u5927\u91CF\u6570\u636E | \u5206\u9875\u8FD4\u56DE\u7528\u6237\u5217\u8868\uFF0C\u5305\u542B\u603B\u6570\u548C\u5206\u9875\u4FE1\u606F |\n\nScenario Outline: API\u9650\u6D41\u4E0E\u9519\u8BEF\u6062\u590D\u5904\u7406\n Given \u5BA2\u6237\u7AEF\u5728<time_window>\u5185\u53D1\u9001<request_count>\u4E2A\u8BF7\u6C42\n When \u7CFB\u7EDF\u68C0\u6D4B\u5230<traffic_pattern>\u65F6\n Then \u7CFB\u7EDF\u5E94:\n 1. \u5E94\u7528\u9650\u6D41\u7B56\u7565\u63A7\u5236\u8BF7\u6C42\u9891\u7387\n 2. \u8FD4\u56DE\u9002\u5F53\u7684\u9650\u6D41\u54CD\u5E94\u7801\n 3. \u63D0\u4F9B\u91CD\u8BD5\u5EFA\u8BAE\u548C\u65F6\u95F4\u7A97\u53E3\u4FE1\u606F\n\n Examples:\n | time_window | request_count | traffic_pattern | \u9650\u6D41\u7B56\u7565 |\n | 1\u5206\u949F | 60\u4E2A\u8BF7\u6C42 | \u6B63\u5E38\u6D41\u91CF | \u5141\u8BB8\u8BF7\u6C42\u901A\u8FC7\uFF0C\u8BB0\u5F55\u8BBF\u95EE\u65E5\u5FD7 |\n | 1\u5206\u949F | 120\u4E2A\u8BF7\u6C42 | \u7A81\u53D1\u6D41\u91CF | \u8FD4\u56DE429\u72B6\u6001\u7801\uFF0C\u5EFA\u8BAE\u7B49\u5F8530\u79D2\u540E\u91CD\u8BD5 |\n | 1\u5206\u949F | 1000\u4E2A\u8BF7\u6C42 | \u6076\u610F\u653B\u51FB | \u7ACB\u5373\u62D2\u7EDD\u8BF7\u6C42\uFF0C\u8BB0\u5F55IP\u5E76\u89E6\u53D1\u5B89\u5168\u9632\u62A4\u673A\u5236 |\n | 5\u5206\u949F | 50\u4E2A\u8BF7\u6C42 | \u5468\u671F\u6027\u8BF7\u6C42 | \u5141\u8BB8\u8BF7\u6C42\u901A\u8FC7\uFF0C\u4F18\u5316\u7F13\u5B58\u7B56\u7565\u63D0\u5347\u54CD\u5E94\u901F\u5EA6 |\n | 1\u5C0F\u65F6 | 10000\u4E2A\u8BF7\u6C42 | \u6B63\u5E38\u4E1A\u52A1\u9AD8\u5CF0 | \u52A8\u6001\u8C03\u6574\u9650\u6D41\u9608\u503C\uFF0C\u542F\u7528\u8D1F\u8F7D\u5747\u8861\u7B56\u7565 |\n```\n\n---\n\n**\u91CD\u8981\u63D0\u9192**: \n1. \u8BF7\u8F93\u51FA\u5B8C\u6574\u7684Markdown\u6587\u6863\uFF0C\u4E0D\u8981\u7701\u7565\u4EFB\u4F55\u7AE0\u8282\n2. \u6BCF\u4E2A\u7AE0\u8282\u90FD\u8981\u6709\u5B9E\u8D28\u6027\u7684\u5185\u5BB9\uFF0C\u4E0D\u80FD\u53EA\u662F\u6A21\u677F\n3. \u6839\u636E\u8F93\u5165\u7684\u539F\u59CB\u5185\u5BB9\u8FDB\u884C\u5177\u4F53\u5206\u6790\uFF0C\u4E0D\u8981\u4F7F\u7528\u901A\u7528\u6A21\u677F\n4. \u6587\u6863\u603B\u957F\u5EA6\u5E94\u8BE5\u57283000\u5B57\u4EE5\u4E0A\n5. \u8868\u683C\u4E2D\u7684\u5185\u5BB9\u8981\u586B\u5199\u5177\u4F53\u4FE1\u606F\uFF0C\u4E0D\u8981\u4FDD\u7559\u5360\u4F4D\u7B26\n6. \u91CD\u70B9\u5173\u6CE8API\u63A5\u53E3\u8BBE\u8BA1\u3001\u6570\u636E\u7ED3\u6784\u3001\u4EA4\u4E92\u903B\u8F91\u7B49\u6280\u672F\u7EC6\u8282\n\n\u73B0\u5728\u8BF7\u5F00\u59CB\u751F\u6210\u5B8C\u6574\u7684API\u63A5\u53E3\u6280\u672F\u9700\u6C42\u6587\u6863\uFF1A";
|
|
1
|
+
export declare const apiTemplatePrompt = "\u4F60\u662F\u4E00\u4F4D\u4E13\u4E1A\u7684\u540E\u7AEF\u6280\u672F\u6587\u6863\u7F16\u5199\u4E13\u5BB6\u3002\u8BF7\u57FA\u4E8E\u7528\u6237\u63D0\u4F9B\u7684\u8F93\u5165\u5185\u5BB9\uFF0C\u751F\u6210\u4E00\u4EFD\u5B8C\u6574\u3001\u8BE6\u7EC6\u7684API\u63A5\u53E3\u6280\u672F\u9700\u6C42\u6587\u6863\u3002\n\n## \u4EFB\u52A1\u8981\u6C42\n- \u5FC5\u987B\u8F93\u51FA\u5B8C\u6574\u7684Markdown\u683C\u5F0F\u6280\u672F\u9700\u6C42\u6587\u6863\n- \u4E0D\u8981\u53EA\u7ED9\u51FA\u603B\u7ED3\uFF0C\u8981\u8F93\u51FA\u5B8C\u6574\u7684\u6587\u6863\u5185\u5BB9\n- \u6BCF\u4E2A\u7AE0\u8282\u90FD\u8981\u6709\u8BE6\u7EC6\u7684\u5185\u5BB9\uFF0C\u4E0D\u80FD\u7701\u7565\n- \u6587\u6863\u957F\u5EA6\u5E94\u8BE5\u57283000\u5B57\u4EE5\u4E0A\n- \u91CD\u70B9\u63CF\u8FF0API\u63A5\u53E3\u8BBE\u8BA1\u3001\u6570\u636E\u7ED3\u6784\u3001\u4EA4\u4E92\u903B\u8F91\u7B49\u540E\u7AEF\u76F8\u5173\u5185\u5BB9\n\n## \u8F93\u5165\u4FE1\u606F\n- **\u529F\u80FD\u540D\u79F0**: {featureName}\n- **\u4E1A\u52A1\u9886\u57DF**: {businessDomain}\n- **\u751F\u6210\u65F6\u5E8F\u56FE**: {generateSequenceDiagram}\n\n## \u539F\u59CB\u9700\u6C42\u5185\u5BB9\n```\n{inputContent}\n```\n\n## \u6587\u6863\u7ED3\u6784\u8981\u6C42\n\u8BF7\u4E25\u683C\u6309\u7167\u4EE5\u4E0B\u7ED3\u6784\u8F93\u51FA\u5B8C\u6574\u7684\u9700\u6C42\u6587\u6863\uFF0C\u6BCF\u4E2A\u7AE0\u8282\u90FD\u8981\u6709\u8BE6\u5B9E\u7684\u5185\u5BB9\uFF1A\n\n# {featureName} - API\u63A5\u53E3\u6280\u672F\u9700\u6C42\u6587\u6863\n\n> **\u751F\u6210\u65F6\u95F4**: {currentTime}\n> **\u4E1A\u52A1\u9886\u57DF**: {businessDomain}\n> **\u63A5\u53E3\u7C7B\u578B**: RESTful API\n\n---\n\n## 1. \u9700\u6C42\u80CC\u666F\n\n**\u80CC\u666F**: [\u8BE6\u7EC6\u63CF\u8FF0API\u63A5\u53E3\u7684\u80CC\u666F\u3001\u4E1A\u52A1\u9700\u6C42\u548C\u76EE\u6807]\n\n**\u5173\u952E\u529F\u80FD**: [\u5217\u51FAAPI\u63A5\u53E3\u7684\u4E3B\u8981\u529F\u80FD\u70B9]\n\n**\u6D89\u53CA\u89D2\u8272**: [\u5217\u51FA\u6240\u6709\u76F8\u5173\u7CFB\u7EDF\u89D2\u8272]\n\n## 2. {featureName}\u529F\u80FD\u8BBE\u8BA1\u8BF4\u660E\n\n| | | | | |\n|---|---|---|---|---|\n|**\u6D41\u7A0B\u7F16\u53F7**|F001|**\u6D41\u7A0B\u540D\u79F0**|{featureName}|\n|**\u4E1A\u52A1\u529F\u80FD\u7F16\u53F7**|BF001|**\u4E1A\u52A1\u529F\u80FD\u540D\u79F0**|{featureName}|\n|**\u529F\u80FD\u8BBE\u8BA1\u7F16\u53F7**|FD001|**\u7CFB\u7EDF\u529F\u80FD\u540D\u79F0**|{featureName}|\n|**\u524D\u7F6E\u6761\u4EF6**|[\u8BE6\u7EC6\u63CF\u8FF0API\u8C03\u7528\u7684\u524D\u7F6E\u6761\u4EF6]|\n|**\u89D2\u8272\uFF08\u5C97\u4F4D\uFF09**|[\u8BE6\u7EC6\u63CF\u8FF0\u8C03\u7528\u65B9\u89D2\u8272\u53CA\u5176\u6743\u9650]|\n|**\u5165\u53E3\u6E20\u9053**|[\u63CF\u8FF0API\u8C03\u7528\u5165\u53E3]|\n|**\u529F\u80FD\u63CF\u8FF0**|[\u8BE6\u7EC6\u7684\u529F\u80FD\u63CF\u8FF0]|\n|**\u8C03\u7528\u80FD\u529B\u57DF/\u4E2D\u5FC3**|[\u5982\u9002\u7528\u7684\u5176\u4ED6\u7CFB\u7EDF\u63A5\u53E3]|\n\n## 3. \u6570\u636E\u5EFA\u6A21\n## 3.1 ER\u903B\u8F91\u56FE\u8BBE\u8BA1\n\n[\u63CF\u8FF0\u6570\u636E\u5E93\u8868\u4E4B\u95F4\u7684\u5173\u7CFB\u548CER\u56FE\u8BBE\u8BA1]\n```mermaid\n```\n\n## 4. \u6570\u636E\u8868\u5B9E\u4F53\u8BBE\u8BA1\n\n[\u8BE6\u7EC6\u63CF\u8FF0\u6D89\u53CA\u7684\u6570\u636E\u8868\u5B9E\u4F53\u7ED3\u6784\uFF0C\u5305\u62EC\u5B57\u6BB5\u540D\u3001\u7C7B\u578B\u3001\u7EA6\u675F\u6761\u4EF6\u7B49]\n\n## 5. API\u63A5\u53E3\u8BBE\u8BA1\n\n### 5.1 \u63A5\u53E3\u5217\u8868\n[\u5217\u51FA\u6240\u6709\u76F8\u5173\u7684API\u63A5\u53E3]\n\n### 5.2 \u63A5\u53E3\u8BE6\u7EC6\u8BF4\u660E\n\n#### 5.2.1 \u63A5\u53E31 - [\u63A5\u53E3\u540D\u79F0]\n#### 5.2.2 \u57FA\u672C\u4FE1\u606F\n- **\u63A5\u53E3\u5730\u5740**: [URL\u8DEF\u5F84]\n- **\u8BF7\u6C42\u65B9\u6CD5**: [\u53EA\u5141\u8BB8\u4F7F\u7528POST\u8BF7\u6C42]\n- **\u534F\u8BAE**: [\u53EA\u5141\u8BB8\u4F7F\u7528HTTPS]\n- **\u5185\u5BB9\u7C7B\u578B**: [application/json\u7B49]\n\n#### 5.2.3 \u8BF7\u6C42\u53C2\u6570\n[\u8BE6\u7EC6\u8BF4\u660E\u8BF7\u6C42\u53C2\u6570]\n\n|\u53C2\u6570\u540D|\u7C7B\u578B|\u662F\u5426\u5FC5\u586B|\u4F4D\u7F6E|\u8BF4\u660E|\n|------|----|--------|----|----|\n|[\u53C2\u65701]|[string/int\u7B49]|[\u662F/\u5426]|[query/body/path]|[\u8BE6\u7EC6\u8BF4\u660E]|\n|[\u53C2\u65702]|[string/int\u7B49]|[\u662F/\u5426]|[query/body/path]|[\u8BE6\u7EC6\u8BF4\u660E]|\n\n#### 5.2.4 \u54CD\u5E94\u53C2\u6570\n[\u8BE6\u7EC6\u8BF4\u660E\u54CD\u5E94\u53C2\u6570]\n\n|\u53C2\u6570\u540D|\u7C7B\u578B|\u8BF4\u660E|\n|------|----|----|\n|[\u53C2\u65701]|[string/object\u7B49]|[\u8BE6\u7EC6\u8BF4\u660E]|\n|[\u53C2\u65702]|[string/object\u7B49]|[\u8BE6\u7EC6\u8BF4\u660E]|\n\n#### 5.2.5 \u9519\u8BEF\u7801\u8BF4\u660E\n[\u8BE6\u7EC6\u8BF4\u660E\u8BE5\u63A5\u53E3\u7684\u9519\u8BEF\u7801]\n\n|\u9519\u8BEF\u7801|\u8BF4\u660E|\n|------|----|\n|[\u9519\u8BEF\u78011]|[\u8BE6\u7EC6\u8BF4\u660E]|\n|[\u9519\u8BEF\u78012]|[\u8BE6\u7EC6\u8BF4\u660E]|\n\n#### 5.2.6 \u8BE6\u7EC6\u5B9E\u73B0\u903B\u8F91\n[\u5206\u6B65\u9AA4\u8BE6\u7EC6\u63CF\u8FF0\u8BE5\u63A5\u53E3\u7684\u8BE6\u7EC6\u903B\u8F91\uFF0C\u5982\u679C\u5B58\u5728sql\u8BED\u53E5\uFF0C\u9700\u8981\u6DFB\u52A0sql\u8BED\u53E5\u5E76\u5728sql\u8BED\u53E5\u4E2D\u6DFB\u52A0\u6CE8\u91CA\u8BF4\u660E]\n\n## 6. \u4E1A\u52A1\u5BF9\u8C61\u65F6\u5E8F\u56FE\n\n#### 6.2.1 \u6B63\u5411\u6D41\u7A0B\n```mermaid\nsequenceDiagram\n participant \u5BA2\u6237\u7AEF\n participant API\u7F51\u5173\n participant \u8BA4\u8BC1\u670D\u52A1\n participant \u6743\u9650\u670D\u52A1\n participant \u4E1A\u52A1\u670D\u52A1\n participant \u65E5\u5FD7\u670D\u52A1\n \n \u5BA2\u6237\u7AEF->>API\u7F51\u5173: \u53D1\u9001API\u8BF7\u6C42\n API\u7F51\u5173->>\u8BA4\u8BC1\u670D\u52A1: \u9A8C\u8BC1\u8BF7\u6C42\u4EE4\u724C\n alt \u4EE4\u724C\u6709\u6548\n \u8BA4\u8BC1\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE\u8BA4\u8BC1\u6210\u529F\n API\u7F51\u5173->>\u6743\u9650\u670D\u52A1: \u68C0\u67E5\u8BBF\u95EE\u6743\u9650\n \u6743\u9650\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE\u6743\u9650\u4FE1\u606F\n API\u7F51\u5173->>\u4E1A\u52A1\u670D\u52A1: \u8F6C\u53D1\u8BF7\u6C42\n \u4E1A\u52A1\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE\u54CD\u5E94\u6570\u636E\n API\u7F51\u5173->>\u5BA2\u6237\u7AEF: \u8FD4\u56DE\u54CD\u5E94\n else \u4EE4\u724C\u65E0\u6548\n \u8BA4\u8BC1\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE\u8BA4\u8BC1\u5931\u8D25\n API\u7F51\u5173->>\u65E5\u5FD7\u670D\u52A1: \u8BB0\u5F55\u8BA4\u8BC1\u5931\u8D25\n API\u7F51\u5173->>\u5BA2\u6237\u7AEF: \u8FD4\u56DE401\u9519\u8BEF\n end\n```\n\n### 6.3 \u5F02\u5E38\u6D41\u7A0B\uFF08\u903B\u8F91\u4E2D\u51FA\u73B0\u5F02\u5E38\u60C5\u51B5\u7684\u4E0B\u7684\u5904\u7406\uFF09\n\n#### 6.3.1 xx\u5F02\u5E38\u5904\u7406\u6D41\u7A0B\n```mermaid\nsequenceDiagram\n participant \u5BA2\u6237\u7AEF\n participant API\u7F51\u5173\n participant \u9650\u6D41\u670D\u52A1\n participant \u65E5\u5FD7\u670D\u52A1\n \n \u5BA2\u6237\u7AEF->>API\u7F51\u5173: \u53D1\u9001API\u8BF7\u6C42\n API\u7F51\u5173->>\u9650\u6D41\u670D\u52A1: \u68C0\u67E5\u8BF7\u6C42\u9891\u7387\n \u9650\u6D41\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE\u9650\u6D41\u51B3\u5B9A\n alt \u8BF7\u6C42\u9891\u7387\u6B63\u5E38\n API\u7F51\u5173->>\u540E\u7EED\u670D\u52A1: \u5904\u7406\u8BF7\u6C42\n else \u8BF7\u6C42\u9891\u7387\u8FC7\u9AD8\n API\u7F51\u5173->>\u65E5\u5FD7\u670D\u52A1: \u8BB0\u5F55\u9650\u6D41\u4E8B\u4EF6\n API\u7F51\u5173->>\u5BA2\u6237\u7AEF: \u8FD4\u56DE429\u9519\u8BEF(\u8BF7\u6C42\u8FC7\u591A)\n end\n```\n\n#### 6.3.2 xx\u5F02\u5E38\u5904\u7406\u6D41\u7A0B\n```mermaid\nsequenceDiagram\n participant \u5BA2\u6237\u7AEF\n participant API\u7F51\u5173\n participant \u4E1A\u52A1\u670D\u52A1\n participant \u6570\u636E\u9A8C\u8BC1\u5668\n participant \u65E5\u5FD7\u670D\u52A1\n \n \u5BA2\u6237\u7AEF->>API\u7F51\u5173: \u53D1\u9001\u5305\u542B\u65E0\u6548\u6570\u636E\u7684\u8BF7\u6C42\n API\u7F51\u5173->>\u4E1A\u52A1\u670D\u52A1: \u8F6C\u53D1\u8BF7\u6C42\n \u4E1A\u52A1\u670D\u52A1->>\u6570\u636E\u9A8C\u8BC1\u5668: \u9A8C\u8BC1\u6570\u636E\u683C\u5F0F\n \u6570\u636E\u9A8C\u8BC1\u5668-->>\u4E1A\u52A1\u670D\u52A1: \u8FD4\u56DE\u9A8C\u8BC1\u5931\u8D25\n \u4E1A\u52A1\u670D\u52A1->>\u65E5\u5FD7\u670D\u52A1: \u8BB0\u5F55\u9A8C\u8BC1\u9519\u8BEF\n \u4E1A\u52A1\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE400\u9519\u8BEF(\u8BF7\u6C42\u6570\u636E\u65E0\u6548)\n API\u7F51\u5173->>\u5BA2\u6237\u7AEF: \u8FD4\u56DE400\u9519\u8BEF\u53CA\u9519\u8BEF\u8BE6\u60C5\n```\n\n### 6.4 \u8FB9\u7F18\u60C5\u51B5\u6D41\u7A0B\uFF08\u5E76\u53D1\u3001\u8D85\u65F6\u3001\u6570\u636E\u8FB9\u754C\u7B49\uFF09\n\n#### 6.4.1 \u5E76\u53D1\u51B2\u7A81\u5904\u7406\n```mermaid\nsequenceDiagram\n participant \u5BA2\u6237\u7AEF\n participant API\u7F51\u5173\n participant \u6570\u636E\u5E93\n participant \u65E5\u5FD7\u670D\u52A1\n participant \u7F13\u5B58\u670D\u52A1\n \n alt \u9AD8\u5E76\u53D1\u573A\u666F\n \u5BA2\u6237\u7AEF->>API\u7F51\u5173: \u5E76\u53D1\u8BF7\u6C42\n API\u7F51\u5173->>\u6570\u636E\u5E93: \u6267\u884C\u6570\u636E\u64CD\u4F5C\n \u6570\u636E\u5E93-->>API\u7F51\u5173: \u8FD4\u56DE\u7ED3\u679C\n API\u7F51\u5173->>\u7F13\u5B58\u670D\u52A1: \u7F13\u5B58\u54CD\u5E94\u6570\u636E\n API\u7F51\u5173->>\u65E5\u5FD7\u670D\u52A1: \u8BB0\u5F55\u5E76\u53D1\u51B2\u7A81\n else \u975E\u9AD8\u5E76\u53D1\u573A\u666F\n API\u7F51\u5173->>\u6570\u636E\u5E93: \u6267\u884C\u6570\u636E\u64CD\u4F5C\n \u6570\u636E\u5E93-->>API\u7F51\u5173: \u8FD4\u56DE\u7ED3\u679C\n API\u7F51\u5173->>\u7F13\u5B58\u670D\u52A1: \u7F13\u5B58\u54CD\u5E94\u6570\u636E\n end\n API\u7F51\u5173->>\u5BA2\u6237\u7AEF: \u8FD4\u56DE\u54CD\u5E94\n```\n#### 6.4.2 \u8D85\u65F6\u5904\u7406\n```mermaid\nsequenceDiagram\n participant \u5BA2\u6237\u7AEF\n participant API\u7F51\u5173\n participant \u4E1A\u52A1\u670D\u52A1\n participant \u65E5\u5FD7\u670D\u52A1\n participant \u76D1\u63A7\u670D\u52A1\n participant \u5907\u7528\u670D\u52A1\n \n \u5BA2\u6237\u7AEF->>API\u7F51\u5173: \u53D1\u9001\u5305\u542B\u65E0\u6548\u6570\u636E\u7684\u8BF7\u6C42\n API\u7F51\u5173->>\u4E1A\u52A1\u670D\u52A1: \u8F6C\u53D1\u8BF7\u6C42\n \u4E1A\u52A1\u670D\u52A1->>\u65E5\u5FD7\u670D\u52A1: \u8BB0\u5F55\u8D85\u65F6\u4E8B\u4EF6\n \u4E1A\u52A1\u670D\u52A1->>\u76D1\u63A7\u670D\u52A1: \u4E0A\u62A5\u8D85\u65F6\u6307\u6807\n \u4E1A\u52A1\u670D\u52A1-->>\u4E1A\u52A1\u670D\u52A1: \u91CD\u8BD5\u8BF7\u6C42\n \u4E1A\u52A1\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE408\u9519\u8BEF(\u8BF7\u6C42\u8D85\u65F6)\n API\u7F51\u5173->>\u5907\u7528\u670D\u52A1: \u8F6C\u53D1\u8BF7\u6C42\n \u5907\u7528\u670D\u52A1-->>API\u7F51\u5173: \u8FD4\u56DE\u9519\u8BEF\u54CD\u5E94\n API\u7F51\u5173->>\u65E5\u5FD7\u670D\u52A1: \u65E5\u5FD7\u8BB0\u5F55\u5907\u7528\u670D\u52A1\u54CD\u5E94\n API\u7F51\u5173->>\u76D1\u63A7\u670D\u52A1: \u8BB0\u5F55\u5907\u7528\u670D\u52A1\u5931\u8D25\n API\u7F51\u5173->>\u5BA2\u6237\u7AEF: \u8FD4\u56DE\u5907\u7528\u670D\u52A1\u54CD\u5E94\n```\n\n## 7. \u4E1A\u52A1\u72B6\u6001\u63CF\u8FF0\n\n| | | |\n|---|---|---|\n|**\u72B6\u6001\u7F16\u53F7**|**\u72B6\u6001\u540D\u79F0**|**\u63CF\u8FF0**|\n|01|\u6536\u5230\u5BA1\u6838\u7533\u8BF7|\u5F53\u63A5\u6536\u5230\u5BA1\u6838\u7533\u8BF7\u65F6\uFF0C\u7CFB\u7EDF\u4F1A\u8BB0\u5F55\u7533\u8BF7\u4FE1\u606F\u5E76\u8FD4\u56DE\u5BA1\u6838\u4E2D\u72B6\u6001|\n|02|\u5BA1\u6279\u5BA1\u6838\u72B6\u6001|\u5F53\u5BA1\u6279\u4EBA\u5BF9\u7533\u8BF7\u8FDB\u884C\u5BA1\u6279\u540E\uFF0C\u7CFB\u7EDF\u4F1A\u66F4\u65B0\u5BA1\u6838\u72B6\u6001\u5E76\u8FD4\u56DE\u5BA1\u6279\u7ED3\u679C|\n|[\u6DFB\u52A0\u66F4\u591A\u72B6\u6001...]||\n\n## 8. \u4F2A\u4EE3\u7801\u793A\u4F8B\n\n```gherkin\nScenario Outline: \u7528\u6237\u901A\u8FC7API\u67E5\u8BE2\u8BA2\u5355\u4FE1\u606F\n Given \u7528\u6237\u5DF2\u901A\u8FC7\u8BA4\u8BC1\u5E76\u62E5\u6709\u67E5\u8BE2\u6743\u9650\n When \u7528\u6237\u5411/orders/<order_id>\u63A5\u53E3\u53D1\u9001POST\u8BF7\u6C42\n Then \u7CFB\u7EDF\u5E94\u8FD4\u56DE\u8BA2\u5355\u4FE1\u606F\u6216 <error_message>\n\n Examples:\n | order_id | error_message |\n | 12345 | null (\u6210\u529F\u8FD4\u56DE\u8BA2\u5355\u4FE1\u606F) |\n | 99999 | \"\u8BA2\u5355\u4E0D\u5B58\u5728\" |\n\nScenario Outline: API\u8BA4\u8BC1\u4E0E\u6388\u6743\u6D41\u7A0B\n Given \u5BA2\u6237\u7AEF\u4F7F\u7528<auth_type>\u65B9\u5F0F\u8FDB\u884C\u8BA4\u8BC1\n When \u5BA2\u6237\u7AEF\u8BBF\u95EE<api_endpoint>\u63A5\u53E3\u65F6\n Then \u7CFB\u7EDF\u5E94:\n 1. \u9A8C\u8BC1\u8BA4\u8BC1\u51ED\u8BC1\u7684\u6709\u6548\u6027\n 2. \u68C0\u67E5\u7528\u6237\u6743\u9650\n 3. \u6839\u636E\u9A8C\u8BC1\u7ED3\u679C\u8FD4\u56DE\u76F8\u5E94\u54CD\u5E94\n\n Examples:\n | auth_type | api_endpoint | \u9884\u671F\u884C\u4E3A |\n | Bearer Token | /orders | \u9A8C\u8BC1\u4EE4\u724C\u6709\u6548\u6027\uFF0C\u68C0\u67E5\u8BA2\u5355\u8BBF\u95EE\u6743\u9650 |\n | API Key | /products | \u9A8C\u8BC1API Key\uFF0C\u68C0\u67E5\u4EA7\u54C1\u8BBF\u95EE\u6743\u9650 |\n | \u65E0\u6548\u4EE4\u724C | /orders | \u8FD4\u56DE401\u672A\u6388\u6743\u9519\u8BEF |\n | \u65E0\u6743\u9650\u7528\u6237 | /admin | \u8FD4\u56DE403\u7981\u6B62\u8BBF\u95EE\u9519\u8BEF |\n\nScenario Outline: API\u8C03\u7528\u4E0E\u6570\u636E\u5904\u7406\u6D41\u7A0B\n Given \u5BA2\u6237\u7AEF\u5411<api_endpoint>\u53D1\u9001<http_method>\u8BF7\u6C42\n When \u8BF7\u6C42\u5305\u542B<data_status>\u6570\u636E\u65F6\n Then \u7CFB\u7EDF\u5E94:\n 1. \u9A8C\u8BC1\u8BF7\u6C42\u53C2\u6570\u683C\u5F0F\n 2. \u6267\u884C\u4E1A\u52A1\u903B\u8F91\u5904\u7406\n 3. \u8FD4\u56DE\u6807\u51C6\u5316\u54CD\u5E94\u683C\u5F0F\n\n Examples:\n | api_endpoint | http_method | data_status | \u5904\u7406\u903B\u8F91 |\n | /users | POST | \u6709\u6548\u6570\u636E | \u521B\u5EFA\u65B0\u7528\u6237\uFF0C\u8FD4\u56DE\u7528\u6237ID\u548C\u521B\u5EFA\u65F6\u95F4 |\n | /users | POST | \u7F3A\u5931\u5FC5\u586B\u9879 | \u8FD4\u56DE400\u9519\u8BEF\uFF0C\u8BE6\u7EC6\u8BF4\u660E\u7F3A\u5931\u5B57\u6BB5 |\n | /users/123 | PUT | \u66F4\u65B0\u6570\u636E | \u66F4\u65B0\u7528\u6237\u4FE1\u606F\uFF0C\u8FD4\u56DE\u66F4\u65B0\u540E\u7684\u5B8C\u6574\u7528\u6237\u4FE1\u606F |\n | /users/123 | DELETE | \u5B58\u5728\u8D44\u6E90 | \u5220\u9664\u7528\u6237\uFF0C\u8FD4\u56DE204\u72B6\u6001\u7801 |\n | /users/999 | POST | \u4E0D\u5B58\u5728\u8D44\u6E90 | \u8FD4\u56DE404\u9519\u8BEF\uFF0C\u8BF4\u660E\u8D44\u6E90\u672A\u627E\u5230 |\n | /users | POST | \u5927\u91CF\u6570\u636E | \u5206\u9875\u8FD4\u56DE\u7528\u6237\u5217\u8868\uFF0C\u5305\u542B\u603B\u6570\u548C\u5206\u9875\u4FE1\u606F |\n\nScenario Outline: API\u9650\u6D41\u4E0E\u9519\u8BEF\u6062\u590D\u5904\u7406\n Given \u5BA2\u6237\u7AEF\u5728<time_window>\u5185\u53D1\u9001<request_count>\u4E2A\u8BF7\u6C42\n When \u7CFB\u7EDF\u68C0\u6D4B\u5230<traffic_pattern>\u65F6\n Then \u7CFB\u7EDF\u5E94:\n 1. \u5E94\u7528\u9650\u6D41\u7B56\u7565\u63A7\u5236\u8BF7\u6C42\u9891\u7387\n 2. \u8FD4\u56DE\u9002\u5F53\u7684\u9650\u6D41\u54CD\u5E94\u7801\n 3. \u63D0\u4F9B\u91CD\u8BD5\u5EFA\u8BAE\u548C\u65F6\u95F4\u7A97\u53E3\u4FE1\u606F\n\n Examples:\n | time_window | request_count | traffic_pattern | \u9650\u6D41\u7B56\u7565 |\n | 1\u5206\u949F | 60\u4E2A\u8BF7\u6C42 | \u6B63\u5E38\u6D41\u91CF | \u5141\u8BB8\u8BF7\u6C42\u901A\u8FC7\uFF0C\u8BB0\u5F55\u8BBF\u95EE\u65E5\u5FD7 |\n | 1\u5206\u949F | 120\u4E2A\u8BF7\u6C42 | \u7A81\u53D1\u6D41\u91CF | \u8FD4\u56DE429\u72B6\u6001\u7801\uFF0C\u5EFA\u8BAE\u7B49\u5F8530\u79D2\u540E\u91CD\u8BD5 |\n | 1\u5206\u949F | 1000\u4E2A\u8BF7\u6C42 | \u6076\u610F\u653B\u51FB | \u7ACB\u5373\u62D2\u7EDD\u8BF7\u6C42\uFF0C\u8BB0\u5F55IP\u5E76\u89E6\u53D1\u5B89\u5168\u9632\u62A4\u673A\u5236 |\n | 5\u5206\u949F | 50\u4E2A\u8BF7\u6C42 | \u5468\u671F\u6027\u8BF7\u6C42 | \u5141\u8BB8\u8BF7\u6C42\u901A\u8FC7\uFF0C\u4F18\u5316\u7F13\u5B58\u7B56\u7565\u63D0\u5347\u54CD\u5E94\u901F\u5EA6 |\n | 1\u5C0F\u65F6 | 10000\u4E2A\u8BF7\u6C42 | \u6B63\u5E38\u4E1A\u52A1\u9AD8\u5CF0 | \u52A8\u6001\u8C03\u6574\u9650\u6D41\u9608\u503C\uFF0C\u542F\u7528\u8D1F\u8F7D\u5747\u8861\u7B56\u7565 |\n```\n\n---\n\n**\u91CD\u8981\u63D0\u9192**: \n1. \u8BF7\u8F93\u51FA\u5B8C\u6574\u7684Markdown\u6587\u6863\uFF0C\u4E0D\u8981\u7701\u7565\u4EFB\u4F55\u7AE0\u8282\n2. \u6BCF\u4E2A\u7AE0\u8282\u90FD\u8981\u6709\u5B9E\u8D28\u6027\u7684\u5185\u5BB9\uFF0C\u4E0D\u80FD\u53EA\u662F\u6A21\u677F\n3. \u6839\u636E\u8F93\u5165\u7684\u539F\u59CB\u5185\u5BB9\u8FDB\u884C\u5177\u4F53\u5206\u6790\uFF0C\u4E0D\u8981\u4F7F\u7528\u901A\u7528\u6A21\u677F\n4. \u6587\u6863\u603B\u957F\u5EA6\u5E94\u8BE5\u57283000\u5B57\u4EE5\u4E0A\n5. \u8868\u683C\u4E2D\u7684\u5185\u5BB9\u8981\u586B\u5199\u5177\u4F53\u4FE1\u606F\uFF0C\u4E0D\u8981\u4FDD\u7559\u5360\u4F4D\u7B26\n6. \u91CD\u70B9\u5173\u6CE8API\u63A5\u53E3\u8BBE\u8BA1\u3001\u6570\u636E\u7ED3\u6784\u3001\u4EA4\u4E92\u903B\u8F91\u7B49\u6280\u672F\u7EC6\u8282\n\n\u73B0\u5728\u8BF7\u5F00\u59CB\u751F\u6210\u5B8C\u6574\u7684API\u63A5\u53E3\u6280\u672F\u9700\u6C42\u6587\u6863\uFF1A";
|