@nick848/sf-cli 1.0.18 → 1.0.20

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.mjs CHANGED
@@ -155,7 +155,7 @@ async function executeWorkflow(ctx) {
155
155
  for (const url of urls) {
156
156
  lines.push(chalk9.gray(` \u{1F4CE} ${url}`));
157
157
  try {
158
- const resource = await fetchAndAnalyzeReference(url, ctx);
158
+ const resource = await fetchAndAnalyzeReference(url, ctx, activeSession.context || void 0);
159
159
  activeSession.referenceResources.push(resource);
160
160
  lines.push(chalk9.green(` \u2713 \u5DF2\u5206\u6790`));
161
161
  activeSession.refinedRequirement += `
@@ -229,23 +229,38 @@ ${resource.analysis}`;
229
229
  lines.push("");
230
230
  lines.push(chalk9.cyan("\u2501\u2501\u2501 \u9636\u6BB5 6/9: OpenSpec \u89C4\u683C \u2501\u2501\u2501"));
231
231
  lines.push("");
232
- activeSession.specItems = generateSpecItems(
233
- activeSession.refinedRequirement,
234
- activeSession.context,
235
- activeSession.bddScenarios,
236
- activeSession.clarificationQuestions,
237
- activeSession.referenceResources
238
- );
232
+ const loader = new LoadingIndicator("AI \u6B63\u5728\u62C6\u5206\u89C4\u683C");
233
+ loader.start();
234
+ try {
235
+ activeSession.specItems = await generateSpecItemsWithAI(
236
+ activeSession.refinedRequirement,
237
+ activeSession.context,
238
+ activeSession.bddScenarios,
239
+ activeSession.clarificationQuestions,
240
+ activeSession.referenceResources,
241
+ ctx
242
+ );
243
+ loader.stop();
244
+ } catch {
245
+ loader.stop(chalk9.yellow(" \u26A0 \u4F7F\u7528\u57FA\u7840\u89C4\u683C\u62C6\u5206"));
246
+ activeSession.specItems = generateSpecItems(
247
+ activeSession.refinedRequirement,
248
+ activeSession.context,
249
+ activeSession.bddScenarios,
250
+ activeSession.clarificationQuestions,
251
+ activeSession.referenceResources
252
+ );
253
+ }
239
254
  const specPath = await saveSpecFile(ctx.options.workingDirectory, activeSession);
240
255
  lines.push(chalk9.green(" \u2713 \u89C4\u683C\u6587\u4EF6\u5DF2\u751F\u6210"));
241
256
  lines.push(chalk9.gray(` \u8DEF\u5F84: ${specPath}`));
242
257
  lines.push("");
243
258
  lines.push(chalk9.cyan(" \u4EFB\u52A1\u6982\u89C8:"));
244
- for (const item of activeSession.specItems.slice(0, 5)) {
259
+ for (const item of activeSession.specItems.slice(0, 8)) {
245
260
  const icon = item.priority === "high" ? "\u{1F534}" : item.priority === "medium" ? "\u{1F7E1}" : "\u{1F7E2}";
246
261
  lines.push(chalk9.gray(` ${icon} [${item.id}] ${item.title}`));
247
262
  }
248
- if (activeSession.specItems.length > 5) {
263
+ if (activeSession.specItems.length > 8) {
249
264
  lines.push(chalk9.gray(` ... \u5171 ${activeSession.specItems.length} \u4E2A\u4EFB\u52A1`));
250
265
  }
251
266
  lines.push("");
@@ -392,13 +407,15 @@ async function handleWorkflowInput(input, ctx) {
392
407
  activeSession.bddScenarios = generateBDDScenarios(
393
408
  activeSession.refinedRequirement,
394
409
  activeSession.context,
395
- activeSession.clarificationQuestions
410
+ activeSession.clarificationQuestions,
411
+ activeSession.referenceResources
396
412
  );
397
413
  activeSession.specItems = generateSpecItems(
398
414
  activeSession.refinedRequirement,
399
415
  activeSession.context,
400
416
  activeSession.bddScenarios,
401
- activeSession.clarificationQuestions
417
+ activeSession.clarificationQuestions,
418
+ activeSession.referenceResources
402
419
  );
403
420
  const specPath = await saveSpecFile(ctx.options.workingDirectory, activeSession);
404
421
  return {
@@ -566,7 +583,12 @@ async function executeDevelopment(ctx, session) {
566
583
  role: "system",
567
584
  content: `\u4F60\u662F\u4E00\u4E2A\u4E13\u4E1A\u7684\u524D\u7AEF\u5F00\u53D1\u5DE5\u7A0B\u5E08\u3002\u8BF7\u6839\u636E\u9700\u6C42\u89C4\u683C\u751F\u6210\u4EE3\u7801\u5B9E\u73B0\u3002
568
585
 
569
- \u8981\u6C42\uFF1A
586
+ \u26A0\uFE0F \u91CD\u8981\u89C4\u5219\uFF1A
587
+ 1. \u6280\u672F\u5B9E\u73B0\u5FC5\u987B\u4E25\u683C\u9075\u5FAA\u9879\u76EE\u73B0\u6709\u7684\u5F00\u53D1\u89C4\u8303
588
+ 2. \u53C2\u8003\u8D44\u6E90\uFF08\u5982\u679C\u6709\uFF09\u4EC5\u7528\u4E8E\u7406\u89E3\u4E1A\u52A1\u529F\u80FD\uFF0C\u4E0D\u8981\u590D\u5236\u5176\u6280\u672F\u5B9E\u73B0
589
+ 3. \u4F7F\u7528\u9879\u76EE\u6307\u5B9A\u7684\u6280\u672F\u6808\u548C\u6846\u67B6
590
+
591
+ \u4EE3\u7801\u8981\u6C42\uFF1A
570
592
  1. \u751F\u6210\u5B8C\u6574\u3001\u53EF\u8FD0\u884C\u7684\u4EE3\u7801
571
593
  2. \u9075\u5FAA\u9879\u76EE\u73B0\u6709\u7684\u4EE3\u7801\u98CE\u683C\u548C\u89C4\u8303
572
594
  3. \u4F7F\u7528\u9879\u76EE\u6307\u5B9A\u7684\u6280\u672F\u6808
@@ -578,8 +600,8 @@ async function executeDevelopment(ctx, session) {
578
600
  - \u6846\u67B6: ${session.context?.framework || "\u672A\u6307\u5B9A"}
579
601
  - \u6280\u672F\u6808: ${session.context?.techStack.join(", ") || "\u672A\u6307\u5B9A"}
580
602
 
581
- ${session.context?.devStandards ? `\u5F00\u53D1\u89C4\u8303\uFF1A
582
- ${session.context.devStandards.slice(0, 2e3)}` : ""}`
603
+ ${session.context?.devStandards ? `\u3010\u5FC5\u987B\u9075\u5FAA\u7684\u5F00\u53D1\u89C4\u8303\u3011
604
+ ${session.context.devStandards.slice(0, 2500)}` : ""}`
583
605
  },
584
606
  {
585
607
  role: "user",
@@ -919,21 +941,26 @@ ${requirement}
919
941
  ## \u9879\u76EE\u4E0A\u4E0B\u6587
920
942
  - \u6280\u672F\u6808: ${context.techStack?.join(", ") || "\u672A\u6307\u5B9A"}
921
943
  - \u6846\u67B6: ${context.framework || "\u672A\u6307\u5B9A"}
944
+ ${context.devStandards ? `
945
+ ## \u9879\u76EE\u5F00\u53D1\u89C4\u8303\uFF08\u5FC5\u987B\u9075\u5FAA\uFF09
946
+ ${context.devStandards.slice(0, 2e3)}
947
+ ` : ""}
922
948
 
923
949
  ## \u6F84\u6E05\u95EE\u7B54
924
950
  ${questions.filter((q) => q.answered).map((q) => `- Q: ${q.question}
925
951
  A: ${q.answer}`).join("\n")}
926
952
 
927
- ## \u53C2\u8003\u8D44\u6E90\u5206\u6790
928
- ${references.map((r) => `### ${r.url}
929
- ${r.analysis}`).join("\n\n")}
953
+ ## \u53C2\u8003\u8D44\u6E90\u5206\u6790\uFF08\u4EC5\u4F5C\u4E1A\u52A1\u53C2\u8003\uFF0C\u6280\u672F\u5B9E\u73B0\u9075\u5FAA\u9879\u76EE\u89C4\u8303\uFF09
954
+ ${references.length > 0 ? references.map((r) => `### ${r.url}
955
+ ${r.analysis}`).join("\n\n") : "\u65E0"}
930
956
 
931
957
  ## \u8981\u6C42
932
958
  1. \u6BCF\u4E2A\u529F\u80FD\u6A21\u5757\u751F\u6210\u4E00\u4E2A\u72EC\u7ACB\u7684 Feature
933
959
  2. \u6BCF\u4E2A Feature \u5305\u542B\u591A\u4E2A\u5177\u4F53\u7684 Scenario
934
960
  3. \u4F7F\u7528 Given-When-Then \u683C\u5F0F
935
961
  4. \u573A\u666F\u8981\u8986\u76D6: \u6B63\u5E38\u6D41\u7A0B\u3001\u8FB9\u754C\u60C5\u51B5\u3001\u5F02\u5E38\u5904\u7406
936
- 5. \u573A\u666F\u8981\u5177\u4F53\u53EF\u6D4B\u8BD5\uFF0C\u4E0D\u8981\u6CDB\u6CDB\u800C\u8C08
962
+ 5. \u573A\u666F\u8981\u5177\u4F53\u53EF\u6D4B\u8BD5\uFF0C\u805A\u7126\u4E1A\u52A1\u903B\u8F91
963
+ 6. \u26A0\uFE0F \u53C2\u8003\u8D44\u6E90\u4EC5\u7528\u4E8E\u7406\u89E3\u4E1A\u52A1\u529F\u80FD\uFF0C\u6280\u672F\u5B9E\u73B0\u5FC5\u987B\u9075\u5FAA\u9879\u76EE\u89C4\u8303
937
964
 
938
965
  ## \u8F93\u51FA\u683C\u5F0F (JSON)
939
966
  \`\`\`json
@@ -1114,6 +1141,89 @@ function generateSpecItems(requirement, context, bddScenarios, questions, refere
1114
1141
  });
1115
1142
  return items;
1116
1143
  }
1144
+ async function generateSpecItemsWithAI(requirement, context, bddScenarios, questions, references, ctx) {
1145
+ const prompt2 = `\u4F60\u662F\u4E00\u4E2A\u4E13\u4E1A\u7684\u9879\u76EE\u7ECF\u7406\u548C\u6280\u672F\u67B6\u6784\u5E08\u3002\u8BF7\u5C06\u4EE5\u4E0B\u9700\u6C42\u62C6\u5206\u4E3A\u7CBE\u7EC6\u5316\u7684\u5F00\u53D1\u4EFB\u52A1\u3002
1146
+
1147
+ ## \u9700\u6C42\u63CF\u8FF0
1148
+ ${requirement}
1149
+
1150
+ ## \u9879\u76EE\u4E0A\u4E0B\u6587
1151
+ - \u6280\u672F\u6808: ${context.techStack?.join(", ") || "TypeScript"}
1152
+ - \u6846\u67B6: ${context.framework || "\u672A\u6307\u5B9A"}
1153
+ ${context.devStandards ? `
1154
+ ## \u5F00\u53D1\u89C4\u8303\uFF08\u5FC5\u987B\u9075\u5FAA\uFF09
1155
+ ${context.devStandards.slice(0, 2e3)}
1156
+ ` : ""}
1157
+
1158
+ ## BDD \u573A\u666F\u53C2\u8003
1159
+ ${bddScenarios.map((s) => `- Feature: ${s.feature} (${s.scenarios.length} \u4E2A\u573A\u666F)`).join("\n")}
1160
+
1161
+ ## \u6F84\u6E05\u4FE1\u606F
1162
+ ${questions.filter((q) => q.answered).map((q) => `- ${q.question}: ${q.answer}`).join("\n") || "\u65E0"}
1163
+
1164
+ ## \u62C6\u5206\u8981\u6C42
1165
+
1166
+ \u8BF7\u5C06\u9700\u6C42\u62C6\u5206\u4E3A **\u7EC6\u7C92\u5EA6\u7684\u5F00\u53D1\u4EFB\u52A1**\uFF0C\u6BCF\u4E2A\u4EFB\u52A1\u5E94\u8BE5\uFF1A
1167
+ 1. **\u5355\u4E00\u804C\u8D23** - \u4E00\u4E2A\u4EFB\u52A1\u53EA\u505A\u4E00\u4EF6\u4E8B
1168
+ 2. **\u53EF\u72EC\u7ACB\u6D4B\u8BD5** - \u6709\u660E\u786E\u7684\u9A8C\u6536\u6807\u51C6
1169
+ 3. **2-4\u5C0F\u65F6\u53EF\u5B8C\u6210** - \u5982\u679C\u4EFB\u52A1\u592A\u5927\uFF0C\u7EE7\u7EED\u62C6\u5206
1170
+ 4. **\u6709\u660E\u786E\u7684\u8F93\u5165\u8F93\u51FA** - \u6E05\u695A\u77E5\u9053\u9700\u8981\u4EC0\u4E48\u3001\u4EA7\u51FA\u4EC0\u4E48
1171
+
1172
+ ## \u8F93\u51FA\u683C\u5F0F (JSON)
1173
+ \`\`\`json
1174
+ [
1175
+ {
1176
+ "id": "T001",
1177
+ "title": "\u4EFB\u52A1\u6807\u9898\uFF08\u7B80\u77ED\u660E\u786E\uFF09",
1178
+ "description": "\u8BE6\u7EC6\u63CF\u8FF0\uFF1A\u8981\u505A\u4EC0\u4E48\u3001\u5982\u4F55\u505A\u3001\u9A8C\u6536\u6807\u51C6",
1179
+ "priority": "high",
1180
+ "estimatedHours": 2,
1181
+ "dependencies": [],
1182
+ "acceptanceCriteria": ["\u9A8C\u6536\u6807\u51C61", "\u9A8C\u6536\u6807\u51C62"]
1183
+ }
1184
+ ]
1185
+ \`\`\`
1186
+
1187
+ ## \u62C6\u5206\u5EFA\u8BAE
1188
+ \u5BF9\u4E8E\u590D\u6742\u529F\u80FD\uFF08\u5982\u7B97\u6CD5\u7C7B\uFF09\uFF0C\u5E94\u8BE5\u62C6\u5206\u4E3A\uFF1A
1189
+ - \u6570\u636E\u7ED3\u6784/\u6A21\u578B\u5B9A\u4E49
1190
+ - \u6838\u5FC3\u7B97\u6CD5\u5206\u6B65\u5B9E\u73B0\uFF08\u6BCF\u4E2A\u8BA1\u7B97\u6B65\u9AA4\u4E00\u4E2A\u4EFB\u52A1\uFF09
1191
+ - \u8F93\u5165\u9A8C\u8BC1
1192
+ - \u7ED3\u679C\u683C\u5F0F\u5316
1193
+ - UI \u5C55\u793A\u7EC4\u4EF6
1194
+ - \u96C6\u6210\u6D4B\u8BD5
1195
+
1196
+ \u8BF7\u76F4\u63A5\u8F93\u51FA JSON \u6570\u7EC4\u3002`;
1197
+ const loader = new LoadingIndicator("AI \u6B63\u5728\u62C6\u5206\u89C4\u683C");
1198
+ loader.start();
1199
+ try {
1200
+ const response = await ctx.modelService.sendMessage([
1201
+ { role: "user", content: prompt2 }
1202
+ ], {
1203
+ temperature: 0.3,
1204
+ maxTokens: 4e3,
1205
+ timeout: 12e4
1206
+ });
1207
+ const jsonMatch = response.content.match(/```json\s*([\s\S]*?)```/);
1208
+ if (jsonMatch) {
1209
+ const parsed = JSON.parse(jsonMatch[1].trim());
1210
+ loader.stop(chalk9.green(` \u2713 \u5DF2\u62C6\u5206 ${parsed.length} \u4E2A\u4EFB\u52A1`));
1211
+ return parsed.map((item) => ({
1212
+ id: item.id || `T${String(parsed.indexOf(item) + 1).padStart(3, "0")}`,
1213
+ title: item.title,
1214
+ description: item.description,
1215
+ priority: item.priority || "medium",
1216
+ files: [],
1217
+ tests: item.acceptanceCriteria || []
1218
+ }));
1219
+ }
1220
+ loader.stop(chalk9.yellow(" \u26A0 \u89E3\u6790\u5931\u8D25\uFF0C\u4F7F\u7528\u57FA\u7840\u62C6\u5206"));
1221
+ return generateSpecItems(requirement, context, bddScenarios, questions, references);
1222
+ } catch (error) {
1223
+ loader.stop(chalk9.yellow(" \u26A0 AI \u62C6\u5206\u5931\u8D25\uFF0C\u4F7F\u7528\u57FA\u7840\u62C6\u5206"));
1224
+ return generateSpecItems(requirement, context, bddScenarios, questions, references);
1225
+ }
1226
+ }
1117
1227
  async function saveSpecFile(workingDir, session) {
1118
1228
  const specDir = path5.join(workingDir, "openspec", "changes");
1119
1229
  await fs4.mkdir(specDir, { recursive: true });
@@ -1350,7 +1460,7 @@ function extractUrls(text) {
1350
1460
  const matches = text.match(urlRegex);
1351
1461
  return matches ? [...new Set(matches)] : [];
1352
1462
  }
1353
- async function fetchAndAnalyzeReference(url, ctx) {
1463
+ async function fetchAndAnalyzeReference(url, ctx, projectContext) {
1354
1464
  const type = detectResourceType(url);
1355
1465
  let content = "";
1356
1466
  let analysis = "";
@@ -1365,7 +1475,7 @@ async function fetchAndAnalyzeReference(url, ctx) {
1365
1475
  }
1366
1476
  content = await response.text();
1367
1477
  if (ctx.modelService.getCurrentModel()) {
1368
- analysis = await analyzeReferenceContent(url, content, type, ctx);
1478
+ analysis = await analyzeReferenceContent(url, content, type, ctx, projectContext);
1369
1479
  } else {
1370
1480
  analysis = extractBasicInfo(content, type);
1371
1481
  }
@@ -1386,9 +1496,20 @@ function detectResourceType(url) {
1386
1496
  }
1387
1497
  return "webpage";
1388
1498
  }
1389
- async function analyzeReferenceContent(url, content, type, ctx) {
1499
+ async function analyzeReferenceContent(url, content, type, ctx, projectContext) {
1390
1500
  const prompt2 = `
1391
- \u4F60\u662F\u4E00\u4E2A\u4E13\u4E1A\u7684\u4EA7\u54C1\u7ECF\u7406\u548C\u524D\u7AEF\u5F00\u53D1\u5DE5\u7A0B\u5E08\u3002\u8BF7\u6DF1\u5165\u5206\u6790\u4EE5\u4E0B\u53C2\u8003\u8D44\u6E90\uFF0C\u63D0\u53D6\u4E1A\u52A1\u529F\u80FD\u548C\u6280\u672F\u5B9E\u73B0\u7EC6\u8282\u3002
1501
+ \u4F60\u662F\u4E00\u4E2A\u4E13\u4E1A\u7684\u4EA7\u54C1\u7ECF\u7406\u3002\u8BF7\u5206\u6790\u4EE5\u4E0B\u53C2\u8003\u8D44\u6E90\uFF0C\u63D0\u53D6\u4E1A\u52A1\u529F\u80FD\u548C\u754C\u9762\u7ED3\u6784\u3002
1502
+
1503
+ ## \u91CD\u8981\u8BF4\u660E
1504
+ \u26A0\uFE0F \u6B64\u5206\u6790\u4EC5\u7528\u4E8E\u7406\u89E3\u4E1A\u52A1\u529F\u80FD\uFF0C**\u6280\u672F\u5B9E\u73B0\u65B9\u6848\u5FC5\u987B\u9075\u5FAA\u5F53\u524D\u9879\u76EE\u7684\u5F00\u53D1\u89C4\u8303**\u3002
1505
+ \u53C2\u8003\u8D44\u6E90\u4E2D\u7684\u6280\u672F\u6808\u3001\u6846\u67B6\u3001\u4EE3\u7801\u98CE\u683C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5B9E\u9645\u5F00\u53D1\u5E94\u4F7F\u7528\u9879\u76EE\u73B0\u6709\u89C4\u8303\u3002
1506
+
1507
+ ${projectContext ? `## \u5F53\u524D\u9879\u76EE\u89C4\u8303
1508
+ - \u9879\u76EE\u540D\u79F0: ${projectContext.name}
1509
+ - \u6280\u672F\u6808: ${projectContext.techStack.join(", ") || "\u672A\u6307\u5B9A"}
1510
+ - \u6846\u67B6: ${projectContext.framework || "\u672A\u6307\u5B9A"}
1511
+ - \u5F00\u53D1\u89C4\u8303\u6458\u8981: ${projectContext.devStandards?.slice(0, 1500) || "\u672A\u6307\u5B9A"}
1512
+ ` : ""}
1392
1513
 
1393
1514
  ## \u53C2\u8003\u8D44\u6E90\u4FE1\u606F
1394
1515
  - URL: ${url}
@@ -1401,38 +1522,31 @@ ${content.slice(0, 8e3)}
1401
1522
 
1402
1523
  ## \u5206\u6790\u8981\u6C42
1403
1524
 
1404
- \u8BF7\u6309\u7167\u4EE5\u4E0B\u7ED3\u6784\u8FDB\u884C\u8BE6\u7EC6\u5206\u6790\uFF1A
1525
+ \u8BF7\u6309\u7167\u4EE5\u4E0B\u7ED3\u6784\u8FDB\u884C\u5206\u6790\uFF1A
1405
1526
 
1406
- ### 1. \u4E1A\u52A1\u529F\u80FD\u5206\u6790
1407
- - \u6838\u5FC3\u4E1A\u52A1\u529F\u80FD\u662F\u4EC0\u4E48\uFF1F\uFF08\u8BE6\u7EC6\u63CF\u8FF0\uFF09
1408
- - \u7528\u6237\u53EF\u4EE5\u505A\u4EC0\u4E48\u64CD\u4F5C\uFF1F
1409
- - \u4E1A\u52A1\u6D41\u7A0B\u662F\u4EC0\u4E48\uFF1F
1410
- - \u6570\u636E\u8F93\u5165\u8F93\u51FA\u662F\u4EC0\u4E48\uFF1F
1527
+ ### 1. \u4E1A\u52A1\u529F\u80FD\u5206\u6790\uFF08\u91CD\u70B9\uFF09
1528
+ - \u6838\u5FC3\u4E1A\u52A1\u529F\u80FD\u662F\u4EC0\u4E48\uFF1F\uFF08\u8BE6\u7EC6\u63CF\u8FF0\u7528\u6237\u80FD\u505A\u4EC0\u4E48\uFF09
1529
+ - \u4E1A\u52A1\u6D41\u7A0B\u662F\u4EC0\u4E48\uFF1F\uFF08\u7528\u6237\u64CD\u4F5C\u6B65\u9AA4\uFF09
1530
+ - \u4E1A\u52A1\u89C4\u5219\u662F\u4EC0\u4E48\uFF1F\uFF08\u8F93\u5165\u9650\u5236\u3001\u8BA1\u7B97\u89C4\u5219\u7B49\uFF09
1411
1531
 
1412
1532
  ### 2. UI/UX \u7ED3\u6784\u5206\u6790
1413
- - \u9875\u9762\u5E03\u5C40\u7ED3\u6784
1414
- - \u4E3B\u8981\u7EC4\u4EF6\u6709\u54EA\u4E9B\uFF1F
1415
- - \u7EC4\u4EF6\u4E4B\u95F4\u7684\u5173\u7CFB
1533
+ - \u9875\u9762\u5E03\u5C40\u7ED3\u6784\uFF08\u4E0D\u6D89\u53CA\u5177\u4F53\u6280\u672F\u5B9E\u73B0\uFF09
1534
+ - \u4E3B\u8981\u7EC4\u4EF6/\u6A21\u5757\u6709\u54EA\u4E9B\uFF1F
1416
1535
  - \u4EA4\u4E92\u65B9\u5F0F\uFF08\u70B9\u51FB\u3001\u8F93\u5165\u3001\u62D6\u62FD\u7B49\uFF09
1417
1536
 
1418
1537
  ### 3. \u6570\u636E\u6A21\u578B\u5206\u6790
1419
- - \u9700\u8981\u54EA\u4E9B\u6570\u636E\uFF1F
1538
+ - \u9700\u8981\u54EA\u4E9B\u6570\u636E\u5B57\u6BB5\uFF1F
1420
1539
  - \u6570\u636E\u4E4B\u95F4\u7684\u5173\u7CFB
1421
1540
  - \u6570\u636E\u6765\u6E90\uFF08\u7528\u6237\u8F93\u5165/\u8BA1\u7B97/API\uFF09
1422
1541
 
1423
1542
  ### 4. \u529F\u80FD\u62C6\u5206\u5EFA\u8BAE
1424
- \u8BF7\u5C06\u529F\u80FD\u62C6\u5206\u4E3A\u53EF\u72EC\u7ACB\u5F00\u53D1\u7684\u4EFB\u52A1\uFF0C\u6BCF\u4E2A\u4EFB\u52A1\u5305\u542B\uFF1A
1425
- - \u4EFB\u52A1\u540D\u79F0
1426
- - \u4EFB\u52A1\u63CF\u8FF0
1427
- - \u6280\u672F\u8981\u70B9
1428
- - \u4F9D\u8D56\u5173\u7CFB
1429
-
1430
- ### 5. \u6280\u672F\u5B9E\u73B0\u5EFA\u8BAE
1431
- - \u63A8\u8350\u7684\u6280\u672F\u65B9\u6848
1432
- - \u9700\u8981\u6CE8\u610F\u7684\u6280\u672F\u96BE\u70B9
1433
- - \u6027\u80FD\u4F18\u5316\u5EFA\u8BAE
1434
-
1435
- \u8BF7\u4EE5 Markdown \u683C\u5F0F\u8F93\u51FA\uFF0C\u91CD\u70B9\u7A81\u51FA\u4E1A\u52A1\u903B\u8F91\u548C\u529F\u80FD\u5B9E\u73B0\u7EC6\u8282\u3002
1543
+ \u5C06\u529F\u80FD\u62C6\u5206\u4E3A\u53EF\u72EC\u7ACB\u5F00\u53D1\u7684\u4EFB\u52A1\uFF1A
1544
+ - \u4EFB\u52A1\u540D\u79F0\uFF08\u7B80\u77ED\u660E\u786E\uFF09
1545
+ - \u4EFB\u52A1\u63CF\u8FF0\uFF08\u4E1A\u52A1\u89D2\u5EA6\uFF09
1546
+ - \u9A8C\u6536\u6807\u51C6
1547
+
1548
+ \u6CE8\u610F\uFF1A\u8BF7\u4EE5 Markdown \u683C\u5F0F\u8F93\u51FA\uFF0C\u91CD\u70B9\u7A81\u51FA**\u4E1A\u52A1\u903B\u8F91**\u548C**\u529F\u80FD\u7279\u6027**\u3002
1549
+ \u6280\u672F\u5B9E\u73B0\u65B9\u6848\u7531\u9879\u76EE\u89C4\u8303\u51B3\u5B9A\uFF0C\u6B64\u5904\u4E0D\u6D89\u53CA\u3002
1436
1550
  `;
1437
1551
  const loader = new LoadingIndicator("AI \u6B63\u5728\u5206\u6790\u53C2\u8003\u8D44\u6E90");
1438
1552
  loader.start();