@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.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
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
activeSession.
|
|
236
|
-
|
|
237
|
-
|
|
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,
|
|
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 >
|
|
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\
|
|
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\
|
|
582
|
-
${session.context.devStandards.slice(0,
|
|
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\
|
|
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\
|
|
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\
|
|
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
|
-
- \
|
|
1409
|
-
- \u4E1A\u52A1\
|
|
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
|
-
\
|
|
1425
|
-
- \u4EFB\u52A1\u540D\u79F0
|
|
1426
|
-
- \u4EFB\u52A1\u63CF\u8FF0
|
|
1427
|
-
- \
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
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();
|