@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 +159 -45
- package/dist/cli/index.js.map +1 -1
- package/dist/index.js +159 -45
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +159 -45
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
activeSession.
|
|
261
|
-
|
|
262
|
-
|
|
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,
|
|
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 >
|
|
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\
|
|
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\
|
|
607
|
-
${session.context.devStandards.slice(0,
|
|
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\
|
|
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\
|
|
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\
|
|
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
|
-
- \
|
|
1434
|
-
- \u4E1A\u52A1\
|
|
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
|
-
\
|
|
1450
|
-
- \u4EFB\u52A1\u540D\u79F0
|
|
1451
|
-
- \u4EFB\u52A1\u63CF\u8FF0
|
|
1452
|
-
- \
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
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();
|