@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.js CHANGED
@@ -180,7 +180,7 @@ async function executeWorkflow(ctx) {
180
180
  for (const url of urls) {
181
181
  lines.push(chalk9__default.default.gray(` \u{1F4CE} ${url}`));
182
182
  try {
183
- const resource = await fetchAndAnalyzeReference(url, ctx);
183
+ const resource = await fetchAndAnalyzeReference(url, ctx, activeSession.context || void 0);
184
184
  activeSession.referenceResources.push(resource);
185
185
  lines.push(chalk9__default.default.green(` \u2713 \u5DF2\u5206\u6790`));
186
186
  activeSession.refinedRequirement += `
@@ -254,23 +254,38 @@ ${resource.analysis}`;
254
254
  lines.push("");
255
255
  lines.push(chalk9__default.default.cyan("\u2501\u2501\u2501 \u9636\u6BB5 6/9: OpenSpec \u89C4\u683C \u2501\u2501\u2501"));
256
256
  lines.push("");
257
- activeSession.specItems = generateSpecItems(
258
- activeSession.refinedRequirement,
259
- activeSession.context,
260
- activeSession.bddScenarios,
261
- activeSession.clarificationQuestions,
262
- activeSession.referenceResources
263
- );
257
+ const loader = new LoadingIndicator("AI \u6B63\u5728\u62C6\u5206\u89C4\u683C");
258
+ loader.start();
259
+ try {
260
+ activeSession.specItems = await generateSpecItemsWithAI(
261
+ activeSession.refinedRequirement,
262
+ activeSession.context,
263
+ activeSession.bddScenarios,
264
+ activeSession.clarificationQuestions,
265
+ activeSession.referenceResources,
266
+ ctx
267
+ );
268
+ loader.stop();
269
+ } catch {
270
+ loader.stop(chalk9__default.default.yellow(" \u26A0 \u4F7F\u7528\u57FA\u7840\u89C4\u683C\u62C6\u5206"));
271
+ activeSession.specItems = generateSpecItems(
272
+ activeSession.refinedRequirement,
273
+ activeSession.context,
274
+ activeSession.bddScenarios,
275
+ activeSession.clarificationQuestions,
276
+ activeSession.referenceResources
277
+ );
278
+ }
264
279
  const specPath = await saveSpecFile(ctx.options.workingDirectory, activeSession);
265
280
  lines.push(chalk9__default.default.green(" \u2713 \u89C4\u683C\u6587\u4EF6\u5DF2\u751F\u6210"));
266
281
  lines.push(chalk9__default.default.gray(` \u8DEF\u5F84: ${specPath}`));
267
282
  lines.push("");
268
283
  lines.push(chalk9__default.default.cyan(" \u4EFB\u52A1\u6982\u89C8:"));
269
- for (const item of activeSession.specItems.slice(0, 5)) {
284
+ for (const item of activeSession.specItems.slice(0, 8)) {
270
285
  const icon = item.priority === "high" ? "\u{1F534}" : item.priority === "medium" ? "\u{1F7E1}" : "\u{1F7E2}";
271
286
  lines.push(chalk9__default.default.gray(` ${icon} [${item.id}] ${item.title}`));
272
287
  }
273
- if (activeSession.specItems.length > 5) {
288
+ if (activeSession.specItems.length > 8) {
274
289
  lines.push(chalk9__default.default.gray(` ... \u5171 ${activeSession.specItems.length} \u4E2A\u4EFB\u52A1`));
275
290
  }
276
291
  lines.push("");
@@ -417,13 +432,15 @@ async function handleWorkflowInput(input, ctx) {
417
432
  activeSession.bddScenarios = generateBDDScenarios(
418
433
  activeSession.refinedRequirement,
419
434
  activeSession.context,
420
- activeSession.clarificationQuestions
435
+ activeSession.clarificationQuestions,
436
+ activeSession.referenceResources
421
437
  );
422
438
  activeSession.specItems = generateSpecItems(
423
439
  activeSession.refinedRequirement,
424
440
  activeSession.context,
425
441
  activeSession.bddScenarios,
426
- activeSession.clarificationQuestions
442
+ activeSession.clarificationQuestions,
443
+ activeSession.referenceResources
427
444
  );
428
445
  const specPath = await saveSpecFile(ctx.options.workingDirectory, activeSession);
429
446
  return {
@@ -591,7 +608,12 @@ async function executeDevelopment(ctx, session) {
591
608
  role: "system",
592
609
  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
593
610
 
594
- \u8981\u6C42\uFF1A
611
+ \u26A0\uFE0F \u91CD\u8981\u89C4\u5219\uFF1A
612
+ 1. \u6280\u672F\u5B9E\u73B0\u5FC5\u987B\u4E25\u683C\u9075\u5FAA\u9879\u76EE\u73B0\u6709\u7684\u5F00\u53D1\u89C4\u8303
613
+ 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
614
+ 3. \u4F7F\u7528\u9879\u76EE\u6307\u5B9A\u7684\u6280\u672F\u6808\u548C\u6846\u67B6
615
+
616
+ \u4EE3\u7801\u8981\u6C42\uFF1A
595
617
  1. \u751F\u6210\u5B8C\u6574\u3001\u53EF\u8FD0\u884C\u7684\u4EE3\u7801
596
618
  2. \u9075\u5FAA\u9879\u76EE\u73B0\u6709\u7684\u4EE3\u7801\u98CE\u683C\u548C\u89C4\u8303
597
619
  3. \u4F7F\u7528\u9879\u76EE\u6307\u5B9A\u7684\u6280\u672F\u6808
@@ -603,8 +625,8 @@ async function executeDevelopment(ctx, session) {
603
625
  - \u6846\u67B6: ${session.context?.framework || "\u672A\u6307\u5B9A"}
604
626
  - \u6280\u672F\u6808: ${session.context?.techStack.join(", ") || "\u672A\u6307\u5B9A"}
605
627
 
606
- ${session.context?.devStandards ? `\u5F00\u53D1\u89C4\u8303\uFF1A
607
- ${session.context.devStandards.slice(0, 2e3)}` : ""}`
628
+ ${session.context?.devStandards ? `\u3010\u5FC5\u987B\u9075\u5FAA\u7684\u5F00\u53D1\u89C4\u8303\u3011
629
+ ${session.context.devStandards.slice(0, 2500)}` : ""}`
608
630
  },
609
631
  {
610
632
  role: "user",
@@ -944,21 +966,26 @@ ${requirement}
944
966
  ## \u9879\u76EE\u4E0A\u4E0B\u6587
945
967
  - \u6280\u672F\u6808: ${context.techStack?.join(", ") || "\u672A\u6307\u5B9A"}
946
968
  - \u6846\u67B6: ${context.framework || "\u672A\u6307\u5B9A"}
969
+ ${context.devStandards ? `
970
+ ## \u9879\u76EE\u5F00\u53D1\u89C4\u8303\uFF08\u5FC5\u987B\u9075\u5FAA\uFF09
971
+ ${context.devStandards.slice(0, 2e3)}
972
+ ` : ""}
947
973
 
948
974
  ## \u6F84\u6E05\u95EE\u7B54
949
975
  ${questions.filter((q) => q.answered).map((q) => `- Q: ${q.question}
950
976
  A: ${q.answer}`).join("\n")}
951
977
 
952
- ## \u53C2\u8003\u8D44\u6E90\u5206\u6790
953
- ${references.map((r) => `### ${r.url}
954
- ${r.analysis}`).join("\n\n")}
978
+ ## \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
979
+ ${references.length > 0 ? references.map((r) => `### ${r.url}
980
+ ${r.analysis}`).join("\n\n") : "\u65E0"}
955
981
 
956
982
  ## \u8981\u6C42
957
983
  1. \u6BCF\u4E2A\u529F\u80FD\u6A21\u5757\u751F\u6210\u4E00\u4E2A\u72EC\u7ACB\u7684 Feature
958
984
  2. \u6BCF\u4E2A Feature \u5305\u542B\u591A\u4E2A\u5177\u4F53\u7684 Scenario
959
985
  3. \u4F7F\u7528 Given-When-Then \u683C\u5F0F
960
986
  4. \u573A\u666F\u8981\u8986\u76D6: \u6B63\u5E38\u6D41\u7A0B\u3001\u8FB9\u754C\u60C5\u51B5\u3001\u5F02\u5E38\u5904\u7406
961
- 5. \u573A\u666F\u8981\u5177\u4F53\u53EF\u6D4B\u8BD5\uFF0C\u4E0D\u8981\u6CDB\u6CDB\u800C\u8C08
987
+ 5. \u573A\u666F\u8981\u5177\u4F53\u53EF\u6D4B\u8BD5\uFF0C\u805A\u7126\u4E1A\u52A1\u903B\u8F91
988
+ 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
962
989
 
963
990
  ## \u8F93\u51FA\u683C\u5F0F (JSON)
964
991
  \`\`\`json
@@ -1139,6 +1166,89 @@ function generateSpecItems(requirement, context, bddScenarios, questions, refere
1139
1166
  });
1140
1167
  return items;
1141
1168
  }
1169
+ async function generateSpecItemsWithAI(requirement, context, bddScenarios, questions, references, ctx) {
1170
+ 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
1171
+
1172
+ ## \u9700\u6C42\u63CF\u8FF0
1173
+ ${requirement}
1174
+
1175
+ ## \u9879\u76EE\u4E0A\u4E0B\u6587
1176
+ - \u6280\u672F\u6808: ${context.techStack?.join(", ") || "TypeScript"}
1177
+ - \u6846\u67B6: ${context.framework || "\u672A\u6307\u5B9A"}
1178
+ ${context.devStandards ? `
1179
+ ## \u5F00\u53D1\u89C4\u8303\uFF08\u5FC5\u987B\u9075\u5FAA\uFF09
1180
+ ${context.devStandards.slice(0, 2e3)}
1181
+ ` : ""}
1182
+
1183
+ ## BDD \u573A\u666F\u53C2\u8003
1184
+ ${bddScenarios.map((s) => `- Feature: ${s.feature} (${s.scenarios.length} \u4E2A\u573A\u666F)`).join("\n")}
1185
+
1186
+ ## \u6F84\u6E05\u4FE1\u606F
1187
+ ${questions.filter((q) => q.answered).map((q) => `- ${q.question}: ${q.answer}`).join("\n") || "\u65E0"}
1188
+
1189
+ ## \u62C6\u5206\u8981\u6C42
1190
+
1191
+ \u8BF7\u5C06\u9700\u6C42\u62C6\u5206\u4E3A **\u7EC6\u7C92\u5EA6\u7684\u5F00\u53D1\u4EFB\u52A1**\uFF0C\u6BCF\u4E2A\u4EFB\u52A1\u5E94\u8BE5\uFF1A
1192
+ 1. **\u5355\u4E00\u804C\u8D23** - \u4E00\u4E2A\u4EFB\u52A1\u53EA\u505A\u4E00\u4EF6\u4E8B
1193
+ 2. **\u53EF\u72EC\u7ACB\u6D4B\u8BD5** - \u6709\u660E\u786E\u7684\u9A8C\u6536\u6807\u51C6
1194
+ 3. **2-4\u5C0F\u65F6\u53EF\u5B8C\u6210** - \u5982\u679C\u4EFB\u52A1\u592A\u5927\uFF0C\u7EE7\u7EED\u62C6\u5206
1195
+ 4. **\u6709\u660E\u786E\u7684\u8F93\u5165\u8F93\u51FA** - \u6E05\u695A\u77E5\u9053\u9700\u8981\u4EC0\u4E48\u3001\u4EA7\u51FA\u4EC0\u4E48
1196
+
1197
+ ## \u8F93\u51FA\u683C\u5F0F (JSON)
1198
+ \`\`\`json
1199
+ [
1200
+ {
1201
+ "id": "T001",
1202
+ "title": "\u4EFB\u52A1\u6807\u9898\uFF08\u7B80\u77ED\u660E\u786E\uFF09",
1203
+ "description": "\u8BE6\u7EC6\u63CF\u8FF0\uFF1A\u8981\u505A\u4EC0\u4E48\u3001\u5982\u4F55\u505A\u3001\u9A8C\u6536\u6807\u51C6",
1204
+ "priority": "high",
1205
+ "estimatedHours": 2,
1206
+ "dependencies": [],
1207
+ "acceptanceCriteria": ["\u9A8C\u6536\u6807\u51C61", "\u9A8C\u6536\u6807\u51C62"]
1208
+ }
1209
+ ]
1210
+ \`\`\`
1211
+
1212
+ ## \u62C6\u5206\u5EFA\u8BAE
1213
+ \u5BF9\u4E8E\u590D\u6742\u529F\u80FD\uFF08\u5982\u7B97\u6CD5\u7C7B\uFF09\uFF0C\u5E94\u8BE5\u62C6\u5206\u4E3A\uFF1A
1214
+ - \u6570\u636E\u7ED3\u6784/\u6A21\u578B\u5B9A\u4E49
1215
+ - \u6838\u5FC3\u7B97\u6CD5\u5206\u6B65\u5B9E\u73B0\uFF08\u6BCF\u4E2A\u8BA1\u7B97\u6B65\u9AA4\u4E00\u4E2A\u4EFB\u52A1\uFF09
1216
+ - \u8F93\u5165\u9A8C\u8BC1
1217
+ - \u7ED3\u679C\u683C\u5F0F\u5316
1218
+ - UI \u5C55\u793A\u7EC4\u4EF6
1219
+ - \u96C6\u6210\u6D4B\u8BD5
1220
+
1221
+ \u8BF7\u76F4\u63A5\u8F93\u51FA JSON \u6570\u7EC4\u3002`;
1222
+ const loader = new LoadingIndicator("AI \u6B63\u5728\u62C6\u5206\u89C4\u683C");
1223
+ loader.start();
1224
+ try {
1225
+ const response = await ctx.modelService.sendMessage([
1226
+ { role: "user", content: prompt2 }
1227
+ ], {
1228
+ temperature: 0.3,
1229
+ maxTokens: 4e3,
1230
+ timeout: 12e4
1231
+ });
1232
+ const jsonMatch = response.content.match(/```json\s*([\s\S]*?)```/);
1233
+ if (jsonMatch) {
1234
+ const parsed = JSON.parse(jsonMatch[1].trim());
1235
+ loader.stop(chalk9__default.default.green(` \u2713 \u5DF2\u62C6\u5206 ${parsed.length} \u4E2A\u4EFB\u52A1`));
1236
+ return parsed.map((item) => ({
1237
+ id: item.id || `T${String(parsed.indexOf(item) + 1).padStart(3, "0")}`,
1238
+ title: item.title,
1239
+ description: item.description,
1240
+ priority: item.priority || "medium",
1241
+ files: [],
1242
+ tests: item.acceptanceCriteria || []
1243
+ }));
1244
+ }
1245
+ loader.stop(chalk9__default.default.yellow(" \u26A0 \u89E3\u6790\u5931\u8D25\uFF0C\u4F7F\u7528\u57FA\u7840\u62C6\u5206"));
1246
+ return generateSpecItems(requirement, context, bddScenarios, questions, references);
1247
+ } catch (error) {
1248
+ loader.stop(chalk9__default.default.yellow(" \u26A0 AI \u62C6\u5206\u5931\u8D25\uFF0C\u4F7F\u7528\u57FA\u7840\u62C6\u5206"));
1249
+ return generateSpecItems(requirement, context, bddScenarios, questions, references);
1250
+ }
1251
+ }
1142
1252
  async function saveSpecFile(workingDir, session) {
1143
1253
  const specDir = path4__namespace.join(workingDir, "openspec", "changes");
1144
1254
  await fs4__namespace.mkdir(specDir, { recursive: true });
@@ -1375,7 +1485,7 @@ function extractUrls(text) {
1375
1485
  const matches = text.match(urlRegex);
1376
1486
  return matches ? [...new Set(matches)] : [];
1377
1487
  }
1378
- async function fetchAndAnalyzeReference(url, ctx) {
1488
+ async function fetchAndAnalyzeReference(url, ctx, projectContext) {
1379
1489
  const type = detectResourceType(url);
1380
1490
  let content = "";
1381
1491
  let analysis = "";
@@ -1390,7 +1500,7 @@ async function fetchAndAnalyzeReference(url, ctx) {
1390
1500
  }
1391
1501
  content = await response.text();
1392
1502
  if (ctx.modelService.getCurrentModel()) {
1393
- analysis = await analyzeReferenceContent(url, content, type, ctx);
1503
+ analysis = await analyzeReferenceContent(url, content, type, ctx, projectContext);
1394
1504
  } else {
1395
1505
  analysis = extractBasicInfo(content, type);
1396
1506
  }
@@ -1411,9 +1521,20 @@ function detectResourceType(url) {
1411
1521
  }
1412
1522
  return "webpage";
1413
1523
  }
1414
- async function analyzeReferenceContent(url, content, type, ctx) {
1524
+ async function analyzeReferenceContent(url, content, type, ctx, projectContext) {
1415
1525
  const prompt2 = `
1416
- \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
1526
+ \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
1527
+
1528
+ ## \u91CD\u8981\u8BF4\u660E
1529
+ \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
1530
+ \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
1531
+
1532
+ ${projectContext ? `## \u5F53\u524D\u9879\u76EE\u89C4\u8303
1533
+ - \u9879\u76EE\u540D\u79F0: ${projectContext.name}
1534
+ - \u6280\u672F\u6808: ${projectContext.techStack.join(", ") || "\u672A\u6307\u5B9A"}
1535
+ - \u6846\u67B6: ${projectContext.framework || "\u672A\u6307\u5B9A"}
1536
+ - \u5F00\u53D1\u89C4\u8303\u6458\u8981: ${projectContext.devStandards?.slice(0, 1500) || "\u672A\u6307\u5B9A"}
1537
+ ` : ""}
1417
1538
 
1418
1539
  ## \u53C2\u8003\u8D44\u6E90\u4FE1\u606F
1419
1540
  - URL: ${url}
@@ -1426,38 +1547,31 @@ ${content.slice(0, 8e3)}
1426
1547
 
1427
1548
  ## \u5206\u6790\u8981\u6C42
1428
1549
 
1429
- \u8BF7\u6309\u7167\u4EE5\u4E0B\u7ED3\u6784\u8FDB\u884C\u8BE6\u7EC6\u5206\u6790\uFF1A
1550
+ \u8BF7\u6309\u7167\u4EE5\u4E0B\u7ED3\u6784\u8FDB\u884C\u5206\u6790\uFF1A
1430
1551
 
1431
- ### 1. \u4E1A\u52A1\u529F\u80FD\u5206\u6790
1432
- - \u6838\u5FC3\u4E1A\u52A1\u529F\u80FD\u662F\u4EC0\u4E48\uFF1F\uFF08\u8BE6\u7EC6\u63CF\u8FF0\uFF09
1433
- - \u7528\u6237\u53EF\u4EE5\u505A\u4EC0\u4E48\u64CD\u4F5C\uFF1F
1434
- - \u4E1A\u52A1\u6D41\u7A0B\u662F\u4EC0\u4E48\uFF1F
1435
- - \u6570\u636E\u8F93\u5165\u8F93\u51FA\u662F\u4EC0\u4E48\uFF1F
1552
+ ### 1. \u4E1A\u52A1\u529F\u80FD\u5206\u6790\uFF08\u91CD\u70B9\uFF09
1553
+ - \u6838\u5FC3\u4E1A\u52A1\u529F\u80FD\u662F\u4EC0\u4E48\uFF1F\uFF08\u8BE6\u7EC6\u63CF\u8FF0\u7528\u6237\u80FD\u505A\u4EC0\u4E48\uFF09
1554
+ - \u4E1A\u52A1\u6D41\u7A0B\u662F\u4EC0\u4E48\uFF1F\uFF08\u7528\u6237\u64CD\u4F5C\u6B65\u9AA4\uFF09
1555
+ - \u4E1A\u52A1\u89C4\u5219\u662F\u4EC0\u4E48\uFF1F\uFF08\u8F93\u5165\u9650\u5236\u3001\u8BA1\u7B97\u89C4\u5219\u7B49\uFF09
1436
1556
 
1437
1557
  ### 2. UI/UX \u7ED3\u6784\u5206\u6790
1438
- - \u9875\u9762\u5E03\u5C40\u7ED3\u6784
1439
- - \u4E3B\u8981\u7EC4\u4EF6\u6709\u54EA\u4E9B\uFF1F
1440
- - \u7EC4\u4EF6\u4E4B\u95F4\u7684\u5173\u7CFB
1558
+ - \u9875\u9762\u5E03\u5C40\u7ED3\u6784\uFF08\u4E0D\u6D89\u53CA\u5177\u4F53\u6280\u672F\u5B9E\u73B0\uFF09
1559
+ - \u4E3B\u8981\u7EC4\u4EF6/\u6A21\u5757\u6709\u54EA\u4E9B\uFF1F
1441
1560
  - \u4EA4\u4E92\u65B9\u5F0F\uFF08\u70B9\u51FB\u3001\u8F93\u5165\u3001\u62D6\u62FD\u7B49\uFF09
1442
1561
 
1443
1562
  ### 3. \u6570\u636E\u6A21\u578B\u5206\u6790
1444
- - \u9700\u8981\u54EA\u4E9B\u6570\u636E\uFF1F
1563
+ - \u9700\u8981\u54EA\u4E9B\u6570\u636E\u5B57\u6BB5\uFF1F
1445
1564
  - \u6570\u636E\u4E4B\u95F4\u7684\u5173\u7CFB
1446
1565
  - \u6570\u636E\u6765\u6E90\uFF08\u7528\u6237\u8F93\u5165/\u8BA1\u7B97/API\uFF09
1447
1566
 
1448
1567
  ### 4. \u529F\u80FD\u62C6\u5206\u5EFA\u8BAE
1449
- \u8BF7\u5C06\u529F\u80FD\u62C6\u5206\u4E3A\u53EF\u72EC\u7ACB\u5F00\u53D1\u7684\u4EFB\u52A1\uFF0C\u6BCF\u4E2A\u4EFB\u52A1\u5305\u542B\uFF1A
1450
- - \u4EFB\u52A1\u540D\u79F0
1451
- - \u4EFB\u52A1\u63CF\u8FF0
1452
- - \u6280\u672F\u8981\u70B9
1453
- - \u4F9D\u8D56\u5173\u7CFB
1454
-
1455
- ### 5. \u6280\u672F\u5B9E\u73B0\u5EFA\u8BAE
1456
- - \u63A8\u8350\u7684\u6280\u672F\u65B9\u6848
1457
- - \u9700\u8981\u6CE8\u610F\u7684\u6280\u672F\u96BE\u70B9
1458
- - \u6027\u80FD\u4F18\u5316\u5EFA\u8BAE
1459
-
1460
- \u8BF7\u4EE5 Markdown \u683C\u5F0F\u8F93\u51FA\uFF0C\u91CD\u70B9\u7A81\u51FA\u4E1A\u52A1\u903B\u8F91\u548C\u529F\u80FD\u5B9E\u73B0\u7EC6\u8282\u3002
1568
+ \u5C06\u529F\u80FD\u62C6\u5206\u4E3A\u53EF\u72EC\u7ACB\u5F00\u53D1\u7684\u4EFB\u52A1\uFF1A
1569
+ - \u4EFB\u52A1\u540D\u79F0\uFF08\u7B80\u77ED\u660E\u786E\uFF09
1570
+ - \u4EFB\u52A1\u63CF\u8FF0\uFF08\u4E1A\u52A1\u89D2\u5EA6\uFF09
1571
+ - \u9A8C\u6536\u6807\u51C6
1572
+
1573
+ \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
1574
+ \u6280\u672F\u5B9E\u73B0\u65B9\u6848\u7531\u9879\u76EE\u89C4\u8303\u51B3\u5B9A\uFF0C\u6B64\u5904\u4E0D\u6D89\u53CA\u3002
1461
1575
  `;
1462
1576
  const loader = new LoadingIndicator("AI \u6B63\u5728\u5206\u6790\u53C2\u8003\u8D44\u6E90");
1463
1577
  loader.start();