@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/cli/index.js CHANGED
@@ -1510,7 +1510,7 @@ async function executeWorkflow(ctx) {
1510
1510
  for (const url of urls) {
1511
1511
  lines.push(chalk9__default.default.gray(` \u{1F4CE} ${url}`));
1512
1512
  try {
1513
- const resource = await fetchAndAnalyzeReference(url, ctx);
1513
+ const resource = await fetchAndAnalyzeReference(url, ctx, activeSession.context || void 0);
1514
1514
  activeSession.referenceResources.push(resource);
1515
1515
  lines.push(chalk9__default.default.green(` \u2713 \u5DF2\u5206\u6790`));
1516
1516
  activeSession.refinedRequirement += `
@@ -1584,23 +1584,38 @@ ${resource.analysis}`;
1584
1584
  lines.push("");
1585
1585
  lines.push(chalk9__default.default.cyan("\u2501\u2501\u2501 \u9636\u6BB5 6/9: OpenSpec \u89C4\u683C \u2501\u2501\u2501"));
1586
1586
  lines.push("");
1587
- activeSession.specItems = generateSpecItems(
1588
- activeSession.refinedRequirement,
1589
- activeSession.context,
1590
- activeSession.bddScenarios,
1591
- activeSession.clarificationQuestions,
1592
- activeSession.referenceResources
1593
- );
1587
+ const loader = new LoadingIndicator("AI \u6B63\u5728\u62C6\u5206\u89C4\u683C");
1588
+ loader.start();
1589
+ try {
1590
+ activeSession.specItems = await generateSpecItemsWithAI(
1591
+ activeSession.refinedRequirement,
1592
+ activeSession.context,
1593
+ activeSession.bddScenarios,
1594
+ activeSession.clarificationQuestions,
1595
+ activeSession.referenceResources,
1596
+ ctx
1597
+ );
1598
+ loader.stop();
1599
+ } catch {
1600
+ loader.stop(chalk9__default.default.yellow(" \u26A0 \u4F7F\u7528\u57FA\u7840\u89C4\u683C\u62C6\u5206"));
1601
+ activeSession.specItems = generateSpecItems(
1602
+ activeSession.refinedRequirement,
1603
+ activeSession.context,
1604
+ activeSession.bddScenarios,
1605
+ activeSession.clarificationQuestions,
1606
+ activeSession.referenceResources
1607
+ );
1608
+ }
1594
1609
  const specPath = await saveSpecFile(ctx.options.workingDirectory, activeSession);
1595
1610
  lines.push(chalk9__default.default.green(" \u2713 \u89C4\u683C\u6587\u4EF6\u5DF2\u751F\u6210"));
1596
1611
  lines.push(chalk9__default.default.gray(` \u8DEF\u5F84: ${specPath}`));
1597
1612
  lines.push("");
1598
1613
  lines.push(chalk9__default.default.cyan(" \u4EFB\u52A1\u6982\u89C8:"));
1599
- for (const item of activeSession.specItems.slice(0, 5)) {
1614
+ for (const item of activeSession.specItems.slice(0, 8)) {
1600
1615
  const icon = item.priority === "high" ? "\u{1F534}" : item.priority === "medium" ? "\u{1F7E1}" : "\u{1F7E2}";
1601
1616
  lines.push(chalk9__default.default.gray(` ${icon} [${item.id}] ${item.title}`));
1602
1617
  }
1603
- if (activeSession.specItems.length > 5) {
1618
+ if (activeSession.specItems.length > 8) {
1604
1619
  lines.push(chalk9__default.default.gray(` ... \u5171 ${activeSession.specItems.length} \u4E2A\u4EFB\u52A1`));
1605
1620
  }
1606
1621
  lines.push("");
@@ -1747,13 +1762,15 @@ async function handleWorkflowInput(input, ctx) {
1747
1762
  activeSession.bddScenarios = generateBDDScenarios(
1748
1763
  activeSession.refinedRequirement,
1749
1764
  activeSession.context,
1750
- activeSession.clarificationQuestions
1765
+ activeSession.clarificationQuestions,
1766
+ activeSession.referenceResources
1751
1767
  );
1752
1768
  activeSession.specItems = generateSpecItems(
1753
1769
  activeSession.refinedRequirement,
1754
1770
  activeSession.context,
1755
1771
  activeSession.bddScenarios,
1756
- activeSession.clarificationQuestions
1772
+ activeSession.clarificationQuestions,
1773
+ activeSession.referenceResources
1757
1774
  );
1758
1775
  const specPath = await saveSpecFile(ctx.options.workingDirectory, activeSession);
1759
1776
  return {
@@ -1921,7 +1938,12 @@ async function executeDevelopment(ctx, session) {
1921
1938
  role: "system",
1922
1939
  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
1923
1940
 
1924
- \u8981\u6C42\uFF1A
1941
+ \u26A0\uFE0F \u91CD\u8981\u89C4\u5219\uFF1A
1942
+ 1. \u6280\u672F\u5B9E\u73B0\u5FC5\u987B\u4E25\u683C\u9075\u5FAA\u9879\u76EE\u73B0\u6709\u7684\u5F00\u53D1\u89C4\u8303
1943
+ 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
1944
+ 3. \u4F7F\u7528\u9879\u76EE\u6307\u5B9A\u7684\u6280\u672F\u6808\u548C\u6846\u67B6
1945
+
1946
+ \u4EE3\u7801\u8981\u6C42\uFF1A
1925
1947
  1. \u751F\u6210\u5B8C\u6574\u3001\u53EF\u8FD0\u884C\u7684\u4EE3\u7801
1926
1948
  2. \u9075\u5FAA\u9879\u76EE\u73B0\u6709\u7684\u4EE3\u7801\u98CE\u683C\u548C\u89C4\u8303
1927
1949
  3. \u4F7F\u7528\u9879\u76EE\u6307\u5B9A\u7684\u6280\u672F\u6808
@@ -1933,8 +1955,8 @@ async function executeDevelopment(ctx, session) {
1933
1955
  - \u6846\u67B6: ${session.context?.framework || "\u672A\u6307\u5B9A"}
1934
1956
  - \u6280\u672F\u6808: ${session.context?.techStack.join(", ") || "\u672A\u6307\u5B9A"}
1935
1957
 
1936
- ${session.context?.devStandards ? `\u5F00\u53D1\u89C4\u8303\uFF1A
1937
- ${session.context.devStandards.slice(0, 2e3)}` : ""}`
1958
+ ${session.context?.devStandards ? `\u3010\u5FC5\u987B\u9075\u5FAA\u7684\u5F00\u53D1\u89C4\u8303\u3011
1959
+ ${session.context.devStandards.slice(0, 2500)}` : ""}`
1938
1960
  },
1939
1961
  {
1940
1962
  role: "user",
@@ -2274,21 +2296,26 @@ ${requirement}
2274
2296
  ## \u9879\u76EE\u4E0A\u4E0B\u6587
2275
2297
  - \u6280\u672F\u6808: ${context.techStack?.join(", ") || "\u672A\u6307\u5B9A"}
2276
2298
  - \u6846\u67B6: ${context.framework || "\u672A\u6307\u5B9A"}
2299
+ ${context.devStandards ? `
2300
+ ## \u9879\u76EE\u5F00\u53D1\u89C4\u8303\uFF08\u5FC5\u987B\u9075\u5FAA\uFF09
2301
+ ${context.devStandards.slice(0, 2e3)}
2302
+ ` : ""}
2277
2303
 
2278
2304
  ## \u6F84\u6E05\u95EE\u7B54
2279
2305
  ${questions.filter((q) => q.answered).map((q) => `- Q: ${q.question}
2280
2306
  A: ${q.answer}`).join("\n")}
2281
2307
 
2282
- ## \u53C2\u8003\u8D44\u6E90\u5206\u6790
2283
- ${references.map((r) => `### ${r.url}
2284
- ${r.analysis}`).join("\n\n")}
2308
+ ## \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
2309
+ ${references.length > 0 ? references.map((r) => `### ${r.url}
2310
+ ${r.analysis}`).join("\n\n") : "\u65E0"}
2285
2311
 
2286
2312
  ## \u8981\u6C42
2287
2313
  1. \u6BCF\u4E2A\u529F\u80FD\u6A21\u5757\u751F\u6210\u4E00\u4E2A\u72EC\u7ACB\u7684 Feature
2288
2314
  2. \u6BCF\u4E2A Feature \u5305\u542B\u591A\u4E2A\u5177\u4F53\u7684 Scenario
2289
2315
  3. \u4F7F\u7528 Given-When-Then \u683C\u5F0F
2290
2316
  4. \u573A\u666F\u8981\u8986\u76D6: \u6B63\u5E38\u6D41\u7A0B\u3001\u8FB9\u754C\u60C5\u51B5\u3001\u5F02\u5E38\u5904\u7406
2291
- 5. \u573A\u666F\u8981\u5177\u4F53\u53EF\u6D4B\u8BD5\uFF0C\u4E0D\u8981\u6CDB\u6CDB\u800C\u8C08
2317
+ 5. \u573A\u666F\u8981\u5177\u4F53\u53EF\u6D4B\u8BD5\uFF0C\u805A\u7126\u4E1A\u52A1\u903B\u8F91
2318
+ 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
2292
2319
 
2293
2320
  ## \u8F93\u51FA\u683C\u5F0F (JSON)
2294
2321
  \`\`\`json
@@ -2469,6 +2496,89 @@ function generateSpecItems(requirement, context, bddScenarios, questions, refere
2469
2496
  });
2470
2497
  return items;
2471
2498
  }
2499
+ async function generateSpecItemsWithAI(requirement, context, bddScenarios, questions, references, ctx) {
2500
+ 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
2501
+
2502
+ ## \u9700\u6C42\u63CF\u8FF0
2503
+ ${requirement}
2504
+
2505
+ ## \u9879\u76EE\u4E0A\u4E0B\u6587
2506
+ - \u6280\u672F\u6808: ${context.techStack?.join(", ") || "TypeScript"}
2507
+ - \u6846\u67B6: ${context.framework || "\u672A\u6307\u5B9A"}
2508
+ ${context.devStandards ? `
2509
+ ## \u5F00\u53D1\u89C4\u8303\uFF08\u5FC5\u987B\u9075\u5FAA\uFF09
2510
+ ${context.devStandards.slice(0, 2e3)}
2511
+ ` : ""}
2512
+
2513
+ ## BDD \u573A\u666F\u53C2\u8003
2514
+ ${bddScenarios.map((s) => `- Feature: ${s.feature} (${s.scenarios.length} \u4E2A\u573A\u666F)`).join("\n")}
2515
+
2516
+ ## \u6F84\u6E05\u4FE1\u606F
2517
+ ${questions.filter((q) => q.answered).map((q) => `- ${q.question}: ${q.answer}`).join("\n") || "\u65E0"}
2518
+
2519
+ ## \u62C6\u5206\u8981\u6C42
2520
+
2521
+ \u8BF7\u5C06\u9700\u6C42\u62C6\u5206\u4E3A **\u7EC6\u7C92\u5EA6\u7684\u5F00\u53D1\u4EFB\u52A1**\uFF0C\u6BCF\u4E2A\u4EFB\u52A1\u5E94\u8BE5\uFF1A
2522
+ 1. **\u5355\u4E00\u804C\u8D23** - \u4E00\u4E2A\u4EFB\u52A1\u53EA\u505A\u4E00\u4EF6\u4E8B
2523
+ 2. **\u53EF\u72EC\u7ACB\u6D4B\u8BD5** - \u6709\u660E\u786E\u7684\u9A8C\u6536\u6807\u51C6
2524
+ 3. **2-4\u5C0F\u65F6\u53EF\u5B8C\u6210** - \u5982\u679C\u4EFB\u52A1\u592A\u5927\uFF0C\u7EE7\u7EED\u62C6\u5206
2525
+ 4. **\u6709\u660E\u786E\u7684\u8F93\u5165\u8F93\u51FA** - \u6E05\u695A\u77E5\u9053\u9700\u8981\u4EC0\u4E48\u3001\u4EA7\u51FA\u4EC0\u4E48
2526
+
2527
+ ## \u8F93\u51FA\u683C\u5F0F (JSON)
2528
+ \`\`\`json
2529
+ [
2530
+ {
2531
+ "id": "T001",
2532
+ "title": "\u4EFB\u52A1\u6807\u9898\uFF08\u7B80\u77ED\u660E\u786E\uFF09",
2533
+ "description": "\u8BE6\u7EC6\u63CF\u8FF0\uFF1A\u8981\u505A\u4EC0\u4E48\u3001\u5982\u4F55\u505A\u3001\u9A8C\u6536\u6807\u51C6",
2534
+ "priority": "high",
2535
+ "estimatedHours": 2,
2536
+ "dependencies": [],
2537
+ "acceptanceCriteria": ["\u9A8C\u6536\u6807\u51C61", "\u9A8C\u6536\u6807\u51C62"]
2538
+ }
2539
+ ]
2540
+ \`\`\`
2541
+
2542
+ ## \u62C6\u5206\u5EFA\u8BAE
2543
+ \u5BF9\u4E8E\u590D\u6742\u529F\u80FD\uFF08\u5982\u7B97\u6CD5\u7C7B\uFF09\uFF0C\u5E94\u8BE5\u62C6\u5206\u4E3A\uFF1A
2544
+ - \u6570\u636E\u7ED3\u6784/\u6A21\u578B\u5B9A\u4E49
2545
+ - \u6838\u5FC3\u7B97\u6CD5\u5206\u6B65\u5B9E\u73B0\uFF08\u6BCF\u4E2A\u8BA1\u7B97\u6B65\u9AA4\u4E00\u4E2A\u4EFB\u52A1\uFF09
2546
+ - \u8F93\u5165\u9A8C\u8BC1
2547
+ - \u7ED3\u679C\u683C\u5F0F\u5316
2548
+ - UI \u5C55\u793A\u7EC4\u4EF6
2549
+ - \u96C6\u6210\u6D4B\u8BD5
2550
+
2551
+ \u8BF7\u76F4\u63A5\u8F93\u51FA JSON \u6570\u7EC4\u3002`;
2552
+ const loader = new LoadingIndicator("AI \u6B63\u5728\u62C6\u5206\u89C4\u683C");
2553
+ loader.start();
2554
+ try {
2555
+ const response = await ctx.modelService.sendMessage([
2556
+ { role: "user", content: prompt2 }
2557
+ ], {
2558
+ temperature: 0.3,
2559
+ maxTokens: 4e3,
2560
+ timeout: 12e4
2561
+ });
2562
+ const jsonMatch = response.content.match(/```json\s*([\s\S]*?)```/);
2563
+ if (jsonMatch) {
2564
+ const parsed = JSON.parse(jsonMatch[1].trim());
2565
+ loader.stop(chalk9__default.default.green(` \u2713 \u5DF2\u62C6\u5206 ${parsed.length} \u4E2A\u4EFB\u52A1`));
2566
+ return parsed.map((item) => ({
2567
+ id: item.id || `T${String(parsed.indexOf(item) + 1).padStart(3, "0")}`,
2568
+ title: item.title,
2569
+ description: item.description,
2570
+ priority: item.priority || "medium",
2571
+ files: [],
2572
+ tests: item.acceptanceCriteria || []
2573
+ }));
2574
+ }
2575
+ loader.stop(chalk9__default.default.yellow(" \u26A0 \u89E3\u6790\u5931\u8D25\uFF0C\u4F7F\u7528\u57FA\u7840\u62C6\u5206"));
2576
+ return generateSpecItems(requirement, context, bddScenarios, questions, references);
2577
+ } catch (error) {
2578
+ loader.stop(chalk9__default.default.yellow(" \u26A0 AI \u62C6\u5206\u5931\u8D25\uFF0C\u4F7F\u7528\u57FA\u7840\u62C6\u5206"));
2579
+ return generateSpecItems(requirement, context, bddScenarios, questions, references);
2580
+ }
2581
+ }
2472
2582
  async function saveSpecFile(workingDir, session) {
2473
2583
  const specDir = path5__namespace.join(workingDir, "openspec", "changes");
2474
2584
  await fs5__namespace.mkdir(specDir, { recursive: true });
@@ -2705,7 +2815,7 @@ function extractUrls(text) {
2705
2815
  const matches = text.match(urlRegex);
2706
2816
  return matches ? [...new Set(matches)] : [];
2707
2817
  }
2708
- async function fetchAndAnalyzeReference(url, ctx) {
2818
+ async function fetchAndAnalyzeReference(url, ctx, projectContext) {
2709
2819
  const type = detectResourceType(url);
2710
2820
  let content = "";
2711
2821
  let analysis = "";
@@ -2720,7 +2830,7 @@ async function fetchAndAnalyzeReference(url, ctx) {
2720
2830
  }
2721
2831
  content = await response.text();
2722
2832
  if (ctx.modelService.getCurrentModel()) {
2723
- analysis = await analyzeReferenceContent(url, content, type, ctx);
2833
+ analysis = await analyzeReferenceContent(url, content, type, ctx, projectContext);
2724
2834
  } else {
2725
2835
  analysis = extractBasicInfo(content, type);
2726
2836
  }
@@ -2741,9 +2851,20 @@ function detectResourceType(url) {
2741
2851
  }
2742
2852
  return "webpage";
2743
2853
  }
2744
- async function analyzeReferenceContent(url, content, type, ctx) {
2854
+ async function analyzeReferenceContent(url, content, type, ctx, projectContext) {
2745
2855
  const prompt2 = `
2746
- \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
2856
+ \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
2857
+
2858
+ ## \u91CD\u8981\u8BF4\u660E
2859
+ \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
2860
+ \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
2861
+
2862
+ ${projectContext ? `## \u5F53\u524D\u9879\u76EE\u89C4\u8303
2863
+ - \u9879\u76EE\u540D\u79F0: ${projectContext.name}
2864
+ - \u6280\u672F\u6808: ${projectContext.techStack.join(", ") || "\u672A\u6307\u5B9A"}
2865
+ - \u6846\u67B6: ${projectContext.framework || "\u672A\u6307\u5B9A"}
2866
+ - \u5F00\u53D1\u89C4\u8303\u6458\u8981: ${projectContext.devStandards?.slice(0, 1500) || "\u672A\u6307\u5B9A"}
2867
+ ` : ""}
2747
2868
 
2748
2869
  ## \u53C2\u8003\u8D44\u6E90\u4FE1\u606F
2749
2870
  - URL: ${url}
@@ -2756,38 +2877,31 @@ ${content.slice(0, 8e3)}
2756
2877
 
2757
2878
  ## \u5206\u6790\u8981\u6C42
2758
2879
 
2759
- \u8BF7\u6309\u7167\u4EE5\u4E0B\u7ED3\u6784\u8FDB\u884C\u8BE6\u7EC6\u5206\u6790\uFF1A
2880
+ \u8BF7\u6309\u7167\u4EE5\u4E0B\u7ED3\u6784\u8FDB\u884C\u5206\u6790\uFF1A
2760
2881
 
2761
- ### 1. \u4E1A\u52A1\u529F\u80FD\u5206\u6790
2762
- - \u6838\u5FC3\u4E1A\u52A1\u529F\u80FD\u662F\u4EC0\u4E48\uFF1F\uFF08\u8BE6\u7EC6\u63CF\u8FF0\uFF09
2763
- - \u7528\u6237\u53EF\u4EE5\u505A\u4EC0\u4E48\u64CD\u4F5C\uFF1F
2764
- - \u4E1A\u52A1\u6D41\u7A0B\u662F\u4EC0\u4E48\uFF1F
2765
- - \u6570\u636E\u8F93\u5165\u8F93\u51FA\u662F\u4EC0\u4E48\uFF1F
2882
+ ### 1. \u4E1A\u52A1\u529F\u80FD\u5206\u6790\uFF08\u91CD\u70B9\uFF09
2883
+ - \u6838\u5FC3\u4E1A\u52A1\u529F\u80FD\u662F\u4EC0\u4E48\uFF1F\uFF08\u8BE6\u7EC6\u63CF\u8FF0\u7528\u6237\u80FD\u505A\u4EC0\u4E48\uFF09
2884
+ - \u4E1A\u52A1\u6D41\u7A0B\u662F\u4EC0\u4E48\uFF1F\uFF08\u7528\u6237\u64CD\u4F5C\u6B65\u9AA4\uFF09
2885
+ - \u4E1A\u52A1\u89C4\u5219\u662F\u4EC0\u4E48\uFF1F\uFF08\u8F93\u5165\u9650\u5236\u3001\u8BA1\u7B97\u89C4\u5219\u7B49\uFF09
2766
2886
 
2767
2887
  ### 2. UI/UX \u7ED3\u6784\u5206\u6790
2768
- - \u9875\u9762\u5E03\u5C40\u7ED3\u6784
2769
- - \u4E3B\u8981\u7EC4\u4EF6\u6709\u54EA\u4E9B\uFF1F
2770
- - \u7EC4\u4EF6\u4E4B\u95F4\u7684\u5173\u7CFB
2888
+ - \u9875\u9762\u5E03\u5C40\u7ED3\u6784\uFF08\u4E0D\u6D89\u53CA\u5177\u4F53\u6280\u672F\u5B9E\u73B0\uFF09
2889
+ - \u4E3B\u8981\u7EC4\u4EF6/\u6A21\u5757\u6709\u54EA\u4E9B\uFF1F
2771
2890
  - \u4EA4\u4E92\u65B9\u5F0F\uFF08\u70B9\u51FB\u3001\u8F93\u5165\u3001\u62D6\u62FD\u7B49\uFF09
2772
2891
 
2773
2892
  ### 3. \u6570\u636E\u6A21\u578B\u5206\u6790
2774
- - \u9700\u8981\u54EA\u4E9B\u6570\u636E\uFF1F
2893
+ - \u9700\u8981\u54EA\u4E9B\u6570\u636E\u5B57\u6BB5\uFF1F
2775
2894
  - \u6570\u636E\u4E4B\u95F4\u7684\u5173\u7CFB
2776
2895
  - \u6570\u636E\u6765\u6E90\uFF08\u7528\u6237\u8F93\u5165/\u8BA1\u7B97/API\uFF09
2777
2896
 
2778
2897
  ### 4. \u529F\u80FD\u62C6\u5206\u5EFA\u8BAE
2779
- \u8BF7\u5C06\u529F\u80FD\u62C6\u5206\u4E3A\u53EF\u72EC\u7ACB\u5F00\u53D1\u7684\u4EFB\u52A1\uFF0C\u6BCF\u4E2A\u4EFB\u52A1\u5305\u542B\uFF1A
2780
- - \u4EFB\u52A1\u540D\u79F0
2781
- - \u4EFB\u52A1\u63CF\u8FF0
2782
- - \u6280\u672F\u8981\u70B9
2783
- - \u4F9D\u8D56\u5173\u7CFB
2784
-
2785
- ### 5. \u6280\u672F\u5B9E\u73B0\u5EFA\u8BAE
2786
- - \u63A8\u8350\u7684\u6280\u672F\u65B9\u6848
2787
- - \u9700\u8981\u6CE8\u610F\u7684\u6280\u672F\u96BE\u70B9
2788
- - \u6027\u80FD\u4F18\u5316\u5EFA\u8BAE
2789
-
2790
- \u8BF7\u4EE5 Markdown \u683C\u5F0F\u8F93\u51FA\uFF0C\u91CD\u70B9\u7A81\u51FA\u4E1A\u52A1\u903B\u8F91\u548C\u529F\u80FD\u5B9E\u73B0\u7EC6\u8282\u3002
2898
+ \u5C06\u529F\u80FD\u62C6\u5206\u4E3A\u53EF\u72EC\u7ACB\u5F00\u53D1\u7684\u4EFB\u52A1\uFF1A
2899
+ - \u4EFB\u52A1\u540D\u79F0\uFF08\u7B80\u77ED\u660E\u786E\uFF09
2900
+ - \u4EFB\u52A1\u63CF\u8FF0\uFF08\u4E1A\u52A1\u89D2\u5EA6\uFF09
2901
+ - \u9A8C\u6536\u6807\u51C6
2902
+
2903
+ \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
2904
+ \u6280\u672F\u5B9E\u73B0\u65B9\u6848\u7531\u9879\u76EE\u89C4\u8303\u51B3\u5B9A\uFF0C\u6B64\u5904\u4E0D\u6D89\u53CA\u3002
2791
2905
  `;
2792
2906
  const loader = new LoadingIndicator("AI \u6B63\u5728\u5206\u6790\u53C2\u8003\u8D44\u6E90");
2793
2907
  loader.start();