sparrow-ddd 0.1.0

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 ADDED
@@ -0,0 +1,2817 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
3
+
4
+ // src/cli/index.ts
5
+ import { Command } from "commander";
6
+ import { resolve, basename } from "node:path";
7
+
8
+ // src/core/init.ts
9
+ import { existsSync } from "node:fs";
10
+ import { join as join2 } from "node:path";
11
+
12
+ // src/core/config.ts
13
+ var SUPPORTED_TOOLS = [
14
+ {
15
+ id: "claude",
16
+ name: "Claude Code",
17
+ skillsDir: ".claude/skills",
18
+ commandsDir: ".claude/commands/sparrow",
19
+ format: "claude-style",
20
+ detectionPaths: [".claude", ".claude/settings.json", ".claude/settings.local.json"]
21
+ },
22
+ {
23
+ id: "opencode",
24
+ name: "OpenCode",
25
+ skillsDir: ".opencode/skills",
26
+ commandsDir: ".opencode/commands",
27
+ format: "opencode-style",
28
+ detectionPaths: [".opencode", ".opencode/config.json"]
29
+ },
30
+ {
31
+ id: "cursor",
32
+ name: "Cursor",
33
+ skillsDir: ".cursor/skills",
34
+ commandsDir: ".cursor/commands",
35
+ format: "cursor-style",
36
+ detectionPaths: [".cursor", ".cursorrules", ".cursor/rules"]
37
+ }
38
+ ];
39
+ function getSupportedToolIds() {
40
+ return SUPPORTED_TOOLS.map((t) => t.id);
41
+ }
42
+ var SKILLS = [
43
+ {
44
+ id: "sparrow-explore",
45
+ name: "Sparrow Explore",
46
+ description: "Identify and define business services from raw requirements",
47
+ phase: "product",
48
+ order: 1,
49
+ nextSkill: "sparrow-arch",
50
+ commandName: "sparrow-explore",
51
+ category: "DDD"
52
+ },
53
+ {
54
+ id: "sparrow-arch",
55
+ name: "Sparrow Arch",
56
+ description: "Define business architecture and application architecture with bounded contexts",
57
+ phase: "product",
58
+ order: 2,
59
+ nextSkill: "sparrow-design",
60
+ commandName: "sparrow-arch",
61
+ category: "DDD"
62
+ },
63
+ {
64
+ id: "sparrow-design",
65
+ name: "Sparrow Design",
66
+ description: "Define API contracts and technology stack for a bounded context",
67
+ phase: "team",
68
+ order: 3,
69
+ nextSkill: "sparrow-model",
70
+ commandName: "sparrow-design",
71
+ category: "DDD"
72
+ },
73
+ {
74
+ id: "sparrow-model",
75
+ name: "Sparrow Model",
76
+ description: "Extract domain model (static and dynamic) for a bounded context",
77
+ phase: "team",
78
+ order: 4,
79
+ nextSkill: "sparrow-plan",
80
+ commandName: "sparrow-model",
81
+ category: "DDD"
82
+ },
83
+ {
84
+ id: "sparrow-plan",
85
+ name: "Sparrow Plan",
86
+ description: "Devise implementation plan based on spec, API, tech stack, and domain model",
87
+ phase: "team",
88
+ order: 5,
89
+ nextSkill: "sparrow-apply",
90
+ commandName: "sparrow-plan",
91
+ category: "DDD"
92
+ },
93
+ {
94
+ id: "sparrow-apply",
95
+ name: "Sparrow Apply",
96
+ description: "Execute the implementation plan and generate DDD-structured code",
97
+ phase: "team",
98
+ order: 6,
99
+ nextSkill: null,
100
+ commandName: "sparrow-apply",
101
+ category: "DDD"
102
+ }
103
+ ];
104
+ function getOrderedSkills() {
105
+ return [...SKILLS].sort((a, b) => a.order - b.order);
106
+ }
107
+
108
+ // src/core/skill-generation.ts
109
+ import { mkdirSync, writeFileSync } from "node:fs";
110
+ import { join, dirname } from "node:path";
111
+
112
+ // src/core/adapters/claude.ts
113
+ var claudeAdapter = {
114
+ toolId: "claude",
115
+ getSkillPath(skillId) {
116
+ return `.claude/skills/${skillId}/SKILL.md`;
117
+ },
118
+ getCommandPath(skillId) {
119
+ return `.claude/commands/sparrow/${skillId}.md`;
120
+ },
121
+ formatSkill(content) {
122
+ const frontmatter = [
123
+ "---",
124
+ `name: ${content.id}`,
125
+ `description: ${content.description}`,
126
+ `category: ${content.category}`,
127
+ `tags: [${content.tags.join(", ")}]`,
128
+ "---"
129
+ ].join("\n");
130
+ return `${frontmatter}
131
+
132
+ ${content.body}`;
133
+ },
134
+ formatCommand(content) {
135
+ const frontmatter = [
136
+ "---",
137
+ `name: ${content.id}`,
138
+ `description: ${content.description}`,
139
+ `category: ${content.category}`,
140
+ `tags: [${content.tags.join(", ")}]`,
141
+ "---"
142
+ ].join("\n");
143
+ return `${frontmatter}
144
+
145
+ ${content.body}`;
146
+ }
147
+ };
148
+
149
+ // src/core/adapters/opencode.ts
150
+ var opencodeAdapter = {
151
+ toolId: "opencode",
152
+ getSkillPath(skillId) {
153
+ return `.opencode/skills/${skillId}/SKILL.md`;
154
+ },
155
+ getCommandPath(skillId) {
156
+ return `.opencode/commands/${skillId}.md`;
157
+ },
158
+ formatSkill(content) {
159
+ const frontmatter = [
160
+ "---",
161
+ `name: ${content.id}`,
162
+ `description: ${content.description}`,
163
+ `category: ${content.category}`,
164
+ `tags: [${content.tags.join(", ")}]`,
165
+ "---"
166
+ ].join("\n");
167
+ return `${frontmatter}
168
+
169
+ ${content.body}`;
170
+ },
171
+ formatCommand(content) {
172
+ const frontmatter = [
173
+ "---",
174
+ `name: ${content.id}`,
175
+ `description: ${content.description}`,
176
+ `category: ${content.category}`,
177
+ `tags: [${content.tags.join(", ")}]`,
178
+ "---"
179
+ ].join("\n");
180
+ return `${frontmatter}
181
+
182
+ ${content.body}`;
183
+ }
184
+ };
185
+
186
+ // src/core/adapters/cursor.ts
187
+ var cursorAdapter = {
188
+ toolId: "cursor",
189
+ getSkillPath(skillId) {
190
+ return `.cursor/skills/${skillId}/SKILL.md`;
191
+ },
192
+ getCommandPath(skillId) {
193
+ return `.cursor/commands/${skillId}.md`;
194
+ },
195
+ formatSkill(content) {
196
+ const frontmatter = [
197
+ "---",
198
+ `name: ${content.id}`,
199
+ `description: ${content.description}`,
200
+ `category: ${content.category}`,
201
+ `tags: [${content.tags.join(", ")}]`,
202
+ "---"
203
+ ].join("\n");
204
+ return `${frontmatter}
205
+
206
+ ${content.body}`;
207
+ },
208
+ formatCommand(content) {
209
+ const frontmatter = [
210
+ "---",
211
+ `name: ${content.id}`,
212
+ `description: ${content.description}`,
213
+ `category: ${content.category}`,
214
+ `tags: [${content.tags.join(", ")}]`,
215
+ "---"
216
+ ].join("\n");
217
+ return `${frontmatter}
218
+
219
+ ${content.body}`;
220
+ }
221
+ };
222
+
223
+ // src/core/adapters/index.ts
224
+ var _registry = /* @__PURE__ */ new Map();
225
+ var _adapters = [
226
+ claudeAdapter,
227
+ opencodeAdapter,
228
+ cursorAdapter
229
+ ];
230
+ for (const adapter of _adapters) {
231
+ if (_registry.has(adapter.toolId)) {
232
+ throw new Error(`Duplicate tool id registered: ${adapter.toolId}`);
233
+ }
234
+ _registry.set(adapter.toolId, adapter);
235
+ }
236
+ function getAdapter(toolId) {
237
+ const adapter = _registry.get(toolId);
238
+ if (!adapter) {
239
+ const supported = Array.from(_registry.keys()).join(", ");
240
+ throw new Error(
241
+ `No adapter registered for tool '${toolId}'. Supported tools: ${supported}`
242
+ );
243
+ }
244
+ return adapter;
245
+ }
246
+
247
+ // src/core/project-md.ts
248
+ function generateProjectMdContent(projectName, sparrowVersion, toolIds) {
249
+ const now = (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19);
250
+ const toolList = toolIds.join(", ");
251
+ return `# Sparrow \u9879\u76EE\uFF1A${projectName}
252
+
253
+ > \u672C\u6587\u4EF6\u7531 Sparrow \u81EA\u52A8\u751F\u6210\u548C\u7EF4\u62A4\uFF0C\u4F5C\u4E3A\u9879\u76EE\u7684\u6587\u6863\u5411\u5BFC\u7D22\u5F15\u3002
254
+ >
255
+ > \u6700\u540E\u66F4\u65B0\uFF1A${now}
256
+ > Sparrow \u7248\u672C\uFF1A${sparrowVersion}
257
+
258
+ ---
259
+
260
+ ## \u9879\u76EE\u4FE1\u606F
261
+
262
+ | \u5C5E\u6027 | \u503C |
263
+ |------|-----|
264
+ | \u9879\u76EE\u540D\u79F0 | \`${projectName}\` |
265
+ | \u521B\u5EFA\u65F6\u95F4 | ${now} |
266
+ | Sparrow \u7248\u672C | ${sparrowVersion} |
267
+ | \u914D\u7F6E\u5DE5\u5177 | ${toolList} |
268
+ | \u6587\u6863\u57FA\u8DEF\u5F84 | \`docs/sparrow/\` |
269
+ | \u4EE3\u7801\u57FA\u8DEF\u5F84 | \`backend/\` |
270
+
271
+ ---
272
+
273
+ ## \u6587\u6863\u7D22\u5F15
274
+
275
+ ### 1. \u4E1A\u52A1\u9700\u6C42
276
+
277
+ - [ ] [\u4E1A\u52A1\u670D\u52A1\u5B9A\u4E49](./requirement/spec.md) \u2014 *\u5F85\u751F\u6210 (sparrow-explore)*
278
+
279
+ ### 2. \u4E1A\u52A1\u67B6\u6784
280
+
281
+ - [ ] [\u4E1A\u52A1\u67B6\u6784](./architecture/business.md) \u2014 *\u5F85\u751F\u6210 (sparrow-arch)*
282
+ - [ ] [\u5E94\u7528\u67B6\u6784](./architecture/application.md) \u2014 *\u5F85\u751F\u6210 (sparrow-arch)*
283
+
284
+ ### 3. \u9650\u754C\u4E0A\u4E0B\u6587\u8BBE\u8BA1
285
+
286
+ > \u6BCF\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u7684\u8BBE\u8BA1\u6587\u6863\u5C06\u5728\u6B64\u5217\u51FA\u3002\u6267\u884C \`sparrow-arch\` \u540E\u81EA\u52A8\u6DFB\u52A0\u3002
287
+
288
+ ---
289
+
290
+ ### 4. API \u76EE\u5F55
291
+
292
+ - [ ] [API \u603B\u76EE\u5F55](./api.md) \u2014 *\u5F85\u751F\u6210 (sparrow-design)*
293
+
294
+ > \u6BCF\u5B8C\u6210\u4E00\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u7684 sparrow-design \u540E\u66F4\u65B0\u6B64\u6587\u4EF6\u3002
295
+
296
+ ---
297
+
298
+ ### 5. \u4EA7\u54C1\u4EE3\u7801
299
+
300
+ - [\`backend/\`](../backend/) \u2014 \u4EA7\u54C1\u4EE3\u7801\u6839\u76EE\u5F55
301
+
302
+ ---
303
+
304
+ ## \u4E0B\u4E00\u6B65
305
+
306
+ 1. \u6267\u884C **/sparrow-explore** \u2014 \u4ECE\u539F\u59CB\u9700\u6C42\u4E2D\u8BC6\u522B\u4E1A\u52A1\u670D\u52A1
307
+ 2. \u6267\u884C **/sparrow-arch** \u2014 \u5212\u5206\u5B50\u9886\u57DF\uFF0C\u5B9A\u4E49\u4E1A\u52A1\u67B6\u6784\u548C\u5E94\u7528\u67B6\u6784
308
+ 3. \u5BF9\u6BCF\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u4F9D\u6B21\u6267\u884C\uFF1A**design \u2192 model \u2192 plan \u2192 apply**
309
+ `;
310
+ }
311
+
312
+ // src/core/skill-generation.ts
313
+ var skillTemplateRegistry = /* @__PURE__ */ new Map();
314
+ function registerSkillTemplate(skillId, templateFn) {
315
+ skillTemplateRegistry.set(skillId, templateFn);
316
+ }
317
+ function assembleSkillContent(skill) {
318
+ const templateFn = skillTemplateRegistry.get(skill.id);
319
+ if (!templateFn) {
320
+ throw new Error(`No template registered for skill: ${skill.id}`);
321
+ }
322
+ const body = templateFn();
323
+ return {
324
+ id: skill.id,
325
+ name: skill.name,
326
+ description: skill.description,
327
+ category: skill.category,
328
+ tags: ["sparrow", "ddd", skill.phase === "product" ? "product-level" : "team-level"],
329
+ body
330
+ };
331
+ }
332
+ function generateSkillFiles(projectRoot, toolIds) {
333
+ const skills = getOrderedSkills();
334
+ const results = [];
335
+ for (const toolId of toolIds) {
336
+ const adapter = getAdapter(toolId);
337
+ const createdFiles = [];
338
+ for (const skill of skills) {
339
+ const content = assembleSkillContent(skill);
340
+ const skillPath = join(projectRoot, adapter.getSkillPath(skill.id));
341
+ mkdirSync(join(skillPath, ".."), { recursive: true });
342
+ writeFileSync(skillPath, adapter.formatSkill(content), "utf-8");
343
+ createdFiles.push(adapter.getSkillPath(skill.id));
344
+ const commandPath = join(projectRoot, adapter.getCommandPath(skill.id));
345
+ mkdirSync(join(commandPath, ".."), { recursive: true });
346
+ writeFileSync(commandPath, adapter.formatCommand(content), "utf-8");
347
+ createdFiles.push(adapter.getCommandPath(skill.id));
348
+ }
349
+ results.push({ toolId, files: createdFiles });
350
+ }
351
+ return results;
352
+ }
353
+ var SPARROW_DIR = ".sparrow";
354
+ function generateProjectConfig(projectRoot, toolIds, version, projectName) {
355
+ const config = {
356
+ version,
357
+ tools: toolIds,
358
+ projectName,
359
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
360
+ outputBase: "docs/sparrow",
361
+ codeBase: "backend"
362
+ };
363
+ const sparrowDir = join(projectRoot, SPARROW_DIR);
364
+ mkdirSync(sparrowDir, { recursive: true });
365
+ const configPath = join(sparrowDir, "sparrow.json");
366
+ writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n", "utf-8");
367
+ return configPath;
368
+ }
369
+ function generateProjectMd(projectRoot, projectName, sparrowVersion, toolIds) {
370
+ const mdPath = join(projectRoot, "docs", "sparrow", "project.md");
371
+ mkdirSync(dirname(mdPath), { recursive: true });
372
+ const content = generateProjectMdContent(projectName, sparrowVersion, toolIds);
373
+ writeFileSync(mdPath, content, "utf-8");
374
+ return mdPath;
375
+ }
376
+
377
+ // src/skills/explore.ts
378
+ var EXPLORE_BODY = `# Sparrow Explore \u2014 \u4E1A\u52A1\u670D\u52A1\u8BC6\u522B
379
+
380
+ ## \u6267\u884C\u987A\u5E8F\u68C0\u67E5
381
+
382
+ \u5728\u6267\u884C\u4E4B\u524D\uFF0C\u8BF7\u68C0\u67E5\u5F53\u524D\u9636\u6BB5\u662F\u5426\u5408\u9002\uFF1A
383
+
384
+ - **\u672C\u9636\u6BB5**\uFF1Asparrow-explore\uFF08\u7B2C 1 \u6B65\uFF0C\u5171 6 \u6B65\uFF09
385
+ - **\u6240\u5C5E\u5C42\u7EA7**\uFF1A\u4EA7\u54C1\u7EA7\uFF08product-level\uFF09
386
+ - **\u524D\u7F6E\u6761\u4EF6**\uFF1A\u65E0\uFF08\u8FD9\u662F\u6574\u4E2A DDD \u6D41\u7A0B\u7684\u7B2C\u4E00\u6B65\uFF09
387
+ - **\u8F93\u5165\u8981\u6C42**\uFF1A\u7528\u6237\u9700\u8981\u63D0\u4F9B\u539F\u59CB\u9700\u6C42\u6587\u6863\u6216\u9700\u6C42\u63CF\u8FF0
388
+ - **\u68C0\u67E5\u903B\u8F91**\uFF1A
389
+ - \u5982\u679C\u5F53\u524D\u76EE\u5F55\u4E0B\u4E0D\u5B58\u5728 \`docs/sparrow/requirement/spec.md\`\uFF0C\u53EF\u4EE5\u7EE7\u7EED\u6267\u884C
390
+ - \u5982\u679C\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u53C2\u8003\u4E0B\u65B9"\u8F93\u51FA\u6587\u4EF6\u5B58\u5728\u6027\u68C0\u67E5"\u7AE0\u8282\u5904\u7406
391
+
392
+ ---
393
+
394
+ ## \u{1F6D1} \u8F93\u51FA\u6587\u4EF6\u5B58\u5728\u6027\u68C0\u67E5\uFF08\u5FC5\u987B\u5728\u751F\u6210\u524D\u6267\u884C\uFF09
395
+
396
+ \u5728\u5F00\u59CB\u751F\u6210\u5185\u5BB9\u4E4B\u524D\uFF0C\u8BF7\u68C0\u67E5\u4EE5\u4E0B\u8F93\u51FA\u6587\u4EF6\u662F\u5426\u5DF2\u7ECF\u5B58\u5728\uFF1A
397
+
398
+ - \`docs/sparrow/requirement/spec.md\`
399
+
400
+ \u5982\u679C\u4EFB\u4E00\u6587\u4EF6\u5DF2\u5B58\u5728\uFF0C\u8BF7**\u8BA9\u7528\u6237\u8FDB\u884C\u4E00\u6B21\u9009\u62E9**\uFF08\u8BE5\u9009\u62E9\u5C06\u5E94\u7528\u4E8E\u6240\u6709\u5DF2\u5B58\u5728\u7684\u6587\u4EF6\uFF09\uFF1A
401
+
402
+ - **\u8DF3\u8FC7 (skip)**\uFF1A\u4FDD\u7559\u5DF2\u6709\u6587\u4EF6\uFF0C\u4E0D\u6267\u884C\u4EFB\u4F55\u751F\u6210\u64CD\u4F5C\uFF0C\u505C\u6B62\u6267\u884C
403
+ - **\u8986\u76D6 (overwrite)**\uFF1A\u5220\u9664\u5DF2\u6709\u6587\u4EF6\uFF0C\u91CD\u65B0\u751F\u6210\u5168\u65B0\u7684\u5185\u5BB9
404
+ - **\u66F4\u65B0 (update)**\uFF1A\u5728\u5DF2\u6709\u6587\u4EF6\u57FA\u7840\u4E0A\u8FDB\u884C\u4FEE\u6539\u548C\u5B8C\u5584
405
+
406
+ > \u26A0\uFE0F \u4E00\u6B21\u547D\u4EE4\u53EA\u786E\u8BA4\u4E00\u6B21\uFF0C\u7528\u6237\u7684\u9009\u62E9\u5E94\u7528\u4E8E\u6240\u6709\u8F93\u51FA\u6587\u4EF6\u3002
407
+
408
+ ---
409
+
410
+ ## \u{1F4CB} project.md \u66F4\u65B0
411
+
412
+ \u5B8C\u6210\u8F93\u51FA\u540E\uFF0C**\u5FC5\u987B**\u66F4\u65B0 \`docs/sparrow/project.md\`\uFF1A
413
+
414
+ 1. \u5982\u679C \`project.md\` \u4E0D\u5B58\u5728\uFF0C\u6839\u636E\u5F53\u524D\u9879\u76EE\u4FE1\u606F\u521B\u5EFA\u5B83\uFF08\u53C2\u8003\u9879\u76EE\u4FE1\u606F\u6A21\u677F\uFF09
415
+ 2. \u5728"\u6587\u6863\u7D22\u5F15"\u90E8\u5206\uFF0C\u66F4\u65B0 \`requirement/spec.md\` \u7684\u94FE\u63A5
416
+ 3. \u5C06\u5BF9\u5E94\u6761\u76EE\u7684\u72B6\u6001\u4ECE \`_\u5F85\u751F\u6210 (sparrow-explore)_\` \u66F4\u65B0\u4E3A \`_v{version}_\`\uFF08\u4F7F\u7528\u5B9E\u9645\u7248\u672C\u53F7\uFF09
417
+ 4. \u66F4\u65B0\u6587\u4EF6\u5934\u90E8\u7684"\u6700\u540E\u66F4\u65B0"\u65F6\u95F4\u6233
418
+
419
+ **project.md \u8DEF\u5F84**: \`docs/sparrow/project.md\`
420
+
421
+ ---
422
+
423
+ ## \u{1F4CC} \u7248\u672C\u5143\u6570\u636E\u7BA1\u7406
424
+
425
+ \u6240\u6709\u8F93\u51FA\u7684\u6587\u6863\u6587\u4EF6**\u5FC5\u987B\u5728\u6587\u4EF6\u5F00\u5934**\u5305\u542B\u7248\u672C\u5143\u6570\u636E\u5757\uFF1A
426
+
427
+ \`\`\`markdown
428
+ <!--
429
+ version: v1.0
430
+ last-updated: {ISO_8601_TIMESTAMP}
431
+ generated-by: sparrow-explore
432
+ sparrow-version: {\u4ECE .sparrow/sparrow.json \u8BFB\u53D6}
433
+ -->
434
+ \`\`\`
435
+
436
+ **\u7248\u672C\u89C4\u5219**:
437
+ - **\u65B0\u6587\u6863**: \u4F7F\u7528 \`v1.0\`
438
+ - **\u66F4\u65B0\u5DF2\u6709\u6587\u6863**: \u8BFB\u53D6\u73B0\u6709\u7248\u672C\u53F7\uFF0C\u9012\u589E\u6B21\u7248\u672C\u53F7\uFF08\`v1.0\` \u2192 \`v1.1\`\uFF09
439
+ - **\u91CD\u5927\u91CD\u5199**: \u9012\u589E\u4E3B\u7248\u672C\u53F7\uFF08\`v1.x\` \u2192 \`v2.0\`\uFF09
440
+ - \u6BCF\u6B21\u4FEE\u6539\u90FD**\u5FC5\u987B\u53D8\u66F4**\u7248\u672C\u53F7
441
+
442
+ **\u64CD\u4F5C\u6B65\u9AA4**:
443
+ 1. \u68C0\u67E5\u76EE\u6807\u6587\u4EF6\u662F\u5426\u5DF2\u5B58\u5728
444
+ 2. \u5982\u679C\u5B58\u5728\uFF0C\u8BFB\u53D6\u6587\u4EF6\u5F00\u5934 \`<!--\` \u6CE8\u91CA\u5757\u4E2D\u7684 \`version:\` \u5B57\u6BB5\u5E76\u9012\u589E
445
+ 3. \u5728\u6587\u4EF6\u5F00\u5934\u6DFB\u52A0\u6216\u66F4\u65B0\u7248\u672C\u5143\u6570\u636E\u5757
446
+ 4. \u7EE7\u7EED\u751F\u6210\u6587\u6863\u6B63\u6587
447
+
448
+ ---
449
+
450
+ ## \u89D2\u8272\u5B9A\u4E49
451
+
452
+ \u4F60\u662F\u4E00\u540D\u4E13\u4E1A\u7684**\u4E1A\u52A1\u67B6\u6784\u5E08**\uFF0C\u8D1F\u8D23\u4ECE\u9700\u6C42\u89C4\u683C\u8BF4\u660E\u4E66\u6216\u8C03\u7814\u9700\u6C42\u4E2D\u8BC6\u522B\u4E1A\u52A1\u670D\u52A1\u3002\u4E1A\u52A1\u670D\u52A1\u662F\u4E1A\u52A1\u67B6\u6784\u7684\u6838\u5FC3\u7EC4\u6210\u90E8\u5206\uFF0C\u662F\u8FDE\u63A5\u4E1A\u52A1\u9700\u6C42\u4E0E\u6280\u672F\u5B9E\u73B0\u7684\u91CD\u8981\u6865\u6881\u3002
453
+
454
+ ## \u6838\u5FC3\u8981\u6C42\uFF1A\u5168\u9762\u8986\u76D6\u539F\u59CB\u9700\u6C42
455
+
456
+ - **\u5FC5\u987B\u5168\u9762\u8986\u76D6\u7528\u6237\u63D0\u4F9B\u7684\u539F\u59CB\u9700\u6C42**\uFF1A\u4ED4\u7EC6\u5206\u6790\u539F\u59CB\u9700\u6C42\u6587\u6863\u4E2D\u7684\u6BCF\u4E00\u4E2A\u529F\u80FD\u70B9\u3001\u6BCF\u4E00\u4E2A\u4E1A\u52A1\u573A\u666F\u3001\u6BCF\u4E00\u4E2A\u7528\u6237\u9700\u6C42\uFF0C\u786E\u4FDD\u90FD\u88AB\u8BC6\u522B\u4E3A\u76F8\u5E94\u7684\u4E1A\u52A1\u670D\u52A1
457
+ - **\u4E0D\u80FD\u9057\u6F0F\u4EFB\u4F55\u4E1A\u52A1\u529F\u80FD**\uFF1A\u5BF9\u4E8E\u539F\u59CB\u9700\u6C42\u4E2D\u63D0\u5230\u7684\u6240\u6709\u4E1A\u52A1\u529F\u80FD\uFF0C\u90FD\u5FC5\u987B\u6709\u5BF9\u5E94\u7684\u4E1A\u52A1\u670D\u52A1\uFF0C\u4E0D\u80FD\u6709\u4EFB\u4F55\u9057\u6F0F
458
+ - **\u5B8C\u6574\u6027\u662F\u8BC4\u4F30\u7684\u5173\u952E\u6307\u6807**\uFF1A\u4E1A\u52A1\u670D\u52A1\u5B9A\u4E49\u6587\u6863\u7684\u5B8C\u6574\u6027\u5C06\u57FA\u4E8E\u662F\u5426\u5168\u9762\u8986\u76D6\u539F\u59CB\u9700\u6C42\u8FDB\u884C\u8BC4\u4F30
459
+
460
+ ## \u7B2C\u4E00\u6027\u539F\u7406
461
+
462
+ ### 1. \u4EF7\u503C\u5BFC\u5411\u539F\u5219
463
+ - \u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u5FC5\u987B\u4E3A\u4E1A\u52A1\u53C2\u4E0E\u8005\u521B\u9020\u660E\u786E\u7684\u4EF7\u503C
464
+ - \u4E1A\u52A1\u670D\u52A1\u5E94\u8BE5\u89E3\u51B3\u5177\u4F53\u7684\u4E1A\u52A1\u95EE\u9898\u6216\u6EE1\u8DB3\u7279\u5B9A\u7684\u4E1A\u52A1\u9700\u6C42
465
+ - \u907F\u514D\u8BC6\u522B\u90A3\u4E9B\u6CA1\u6709\u5B9E\u9645\u4E1A\u52A1\u4EF7\u503C\u7684\u7EAF\u6280\u672F\u529F\u80FD
466
+
467
+ ### 2. \u5B8C\u6574\u6027\u539F\u5219
468
+ - \u4E1A\u52A1\u670D\u52A1\u5FC5\u987B\u662F\u4E00\u6B21\u5B8C\u6574\u7684\u529F\u80FD\u4EA4\u4E92\uFF0C\u4ECE\u89E6\u53D1\u5230\u5B8C\u6210
469
+ - \u4E1A\u52A1\u670D\u52A1\u5E94\u8BE5\u5305\u542B\u6210\u529F\u548C\u5931\u8D25\u7684\u6240\u6709\u53EF\u80FD\u8DEF\u5F84
470
+ - \u4E1A\u52A1\u670D\u52A1\u5E94\u8BE5\u8003\u8651\u6240\u6709\u76F8\u5173\u7684\u4E1A\u52A1\u89C4\u5219\u548C\u7EA6\u675F
471
+
472
+ ### 3. \u72EC\u7ACB\u6027\u539F\u5219
473
+ - \u4E1A\u52A1\u670D\u52A1\u5E94\u8BE5\u76F8\u5BF9\u72EC\u7ACB\uFF0C\u51CF\u5C11\u4E0E\u5176\u4ED6\u670D\u52A1\u7684\u8026\u5408
474
+ - \u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u5E94\u8BE5\u6709\u660E\u786E\u7684\u8FB9\u754C\u548C\u804C\u8D23
475
+ - \u4E1A\u52A1\u670D\u52A1\u4E4B\u95F4\u5E94\u8BE5\u901A\u8FC7\u660E\u786E\u7684\u63A5\u53E3\u8FDB\u884C\u4EA4\u4E92
476
+
477
+ ## \u4E1A\u52A1\u670D\u52A1\u5B9A\u4E49
478
+
479
+ **\u4E1A\u52A1\u670D\u52A1**\u662F\u4E1A\u52A1\u7684\u53C2\u4E0E\u8005\uFF08actor\uFF09\u4E3B\u52A8\u5411\u76EE\u6807\u7CFB\u7EDF\uFF08\u540E\u7AEF\uFF09\u53D1\u8D77\u670D\u52A1\u8BF7\u6C42\uFF0C\u5B8C\u6210\u4E00\u6B21\u8FDE\u7EED\u800C\u5B8C\u6574\u7684\u529F\u80FD\u4EA4\u4E92\uFF0C\u5E76\u4F53\u73B0\u670D\u52A1\u4EF7\u503C\u7684\u4E1A\u52A1\u884C\u4E3A\u3002
480
+
481
+ ### \u5173\u952E\u7406\u89E3\uFF1A\u4E1A\u52A1\u670D\u52A1 \u2260 \u7528\u4F8B
482
+
483
+ **\u4E1A\u52A1\u670D\u52A1\u4E0D\u662F\u7528\u4F8B\uFF08Use Case\uFF09\u3002** \u7528\u4F8B\u53EF\u80FD\u805A\u5408\u4E86\u591A\u4E2A\u64CD\u4F5C\uFF0C\u800C\u4E1A\u52A1\u670D\u52A1\u662F\u5BF9\u76EE\u6807\u7CFB\u7EDF\u53D1\u8D77\u7684**\u4E00\u6B21\u8BF7\u6C42**\u3002
484
+
485
+ \u5C06\u76EE\u6807\u7CFB\u7EDF\u89C6\u4E3A\u4E00\u4E2A**\u9ED1\u76D2\u5B50**\uFF1A
486
+ - \u53C2\u4E0E\u8005\u5411\u9ED1\u76D2\u5B50**\u53D1\u8D77\u4E00\u6B21\u8BF7\u6C42** \u2192 \u9ED1\u76D2\u5B50\u5185\u90E8\u5904\u7406 \u2192 \u9ED1\u76D2\u5B50\u8FD4\u56DE\u7ED3\u679C
487
+ - \u8FD9\u4E00\u6B21\u8BF7\u6C42\u5C31\u662F\u4E00\u4E2A\u4E1A\u52A1\u670D\u52A1
488
+ - \u4E0D\u540C\u7684\u8BF7\u6C42\u5C31\u662F\u4E0D\u540C\u7684\u4E1A\u52A1\u670D\u52A1
489
+
490
+ ### \u7C92\u5EA6\u539F\u5219\uFF1A\u4E00\u6B21\u8BF7\u6C42 = \u4E00\u4E2A\u4E1A\u52A1\u670D\u52A1
491
+
492
+ **\u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u5BF9\u5E94\u53C2\u4E0E\u8005\u5411\u76EE\u6807\u7CFB\u7EDF\u53D1\u8D77\u7684\u4E00\u6B21\u72EC\u7ACB\u8BF7\u6C42\u3002** \u5E94\u8BE5\u6309\u7167"\u64CD\u4F5C"\u800C\u975E"\u6A21\u5757"\u6765\u5212\u5206\u670D\u52A1\u3002
493
+
494
+ **\u6B63\u786E\u793A\u4F8B \u2014 \u7BA1\u7406\u4E2A\u4EBA\u8D44\u6599**\uFF08\u5E94\u4E3A 4 \u4E2A\u72EC\u7ACB\u7684\u4E1A\u52A1\u670D\u52A1\uFF09\uFF1A
495
+ 1. **\u67E5\u8BE2\u4E2A\u4EBA\u8D44\u6599**\uFF1A\u7528\u6237\u5411\u7CFB\u7EDF\u8BF7\u6C42\u67E5\u770B\u81EA\u5DF1\u7684\u8D44\u6599\u4FE1\u606F
496
+ 2. **\u66F4\u65B0\u4E2A\u4EBA\u8D44\u6599**\uFF1A\u7528\u6237\u5411\u7CFB\u7EDF\u8BF7\u6C42\u4FEE\u6539\u81EA\u5DF1\u7684\u8D44\u6599\u4FE1\u606F
497
+ 3. **\u5220\u9664\u4E2A\u4EBA\u8D44\u6599**\uFF1A\u7528\u6237\u5411\u7CFB\u7EDF\u8BF7\u6C42\u5220\u9664\u81EA\u5DF1\u7684\u8D26\u6237
498
+ 4. **\u65B0\u589E\u4E2A\u4EBA\u8D44\u6599**\uFF1A\u7528\u6237\u5411\u7CFB\u7EDF\u8BF7\u6C42\u521B\u5EFA\u65B0\u7684\u4E2A\u4EBA\u8D44\u6599
499
+
500
+ **\u9519\u8BEF\u793A\u4F8B \u2014 \u8BF7\u52FF\u6A21\u4EFF**\uFF1A
501
+ - \u274C "\u7BA1\u7406\u4E2A\u4EBA\u8D44\u6599"\u4F5C\u4E3A 1 \u4E2A\u4E1A\u52A1\u670D\u52A1\uFF08\u5B83\u5305\u542B\u4E86\u589E\u5220\u6539\u67E5\u591A\u4E2A\u8BF7\u6C42\uFF0C\u662F\u6A21\u5757\u800C\u975E\u670D\u52A1\uFF09
502
+ - \u274C "\u7528\u6237\u7BA1\u7406"\u4F5C\u4E3A 1 \u4E2A\u4E1A\u52A1\u670D\u52A1\uFF08\u5B83\u662F\u4E00\u4E2A\u529F\u80FD\u6A21\u5757\uFF0C\u5305\u542B\u591A\u4E2A\u72EC\u7ACB\u7684\u8BF7\u6C42\uFF09
503
+
504
+ ### \u5224\u65AD\u6807\u51C6
505
+
506
+ \u5728\u8BC6\u522B\u4E1A\u52A1\u670D\u52A1\u65F6\uFF0C\u901A\u8FC7\u4EE5\u4E0B\u95EE\u9898\u81EA\u68C0\uFF08\u6BCF\u4E2A\u95EE\u9898\u72EC\u7ACB\u5224\u65AD\u5373\u53EF\uFF09\uFF1A
507
+
508
+ - **\u8BF7\u6C42\u6B21\u6570**\uFF1A\u53C2\u4E0E\u8005\u5411\u76EE\u6807\u7CFB\u7EDF\u53D1\u8D77\u4E86\u51E0\u6B21\u8BF7\u6C42\uFF1F\u5982\u679C\u4E00\u6B21\u8BF7\u6C42\u5C31\u80FD\u72EC\u7ACB\u5B8C\u6210\u6709\u610F\u4E49\u7684\u4E1A\u52A1\u529F\u80FD\uFF0C\u5B83\u5C31\u662F\u4E00\u4E2A\u4E1A\u52A1\u670D\u52A1
509
+ - **\u72EC\u7ACB\u4EF7\u503C**\uFF1A\u8BE5\u8BF7\u6C42\u5B8C\u6210\u540E\uFF0C\u662F\u5426\u4EA7\u751F\u4E86\u660E\u786E\u7684\u3001\u5BF9\u53C2\u4E0E\u8005\u6709\u4EF7\u503C\u7684\u4E1A\u52A1\u7ED3\u679C\uFF1F
510
+ - **\u72EC\u7ACB\u89E6\u53D1**\uFF1A\u8BE5\u8BF7\u6C42\u662F\u5426\u53EF\u4EE5\u72EC\u7ACB\u89E6\u53D1\uFF0C\u800C\u4E0D\u9700\u8981\u4F9D\u8D56\u5176\u4ED6\u8BF7\u6C42\u5148\u6267\u884C\uFF1F
511
+
512
+ \u5982\u679C\u4EE5\u4E0A\u4E09\u4E2A\u95EE\u9898\u7684\u7B54\u6848\u90FD\u662F"\u662F"\uFF0C\u5219\u8BE5\u8BF7\u6C42\u5E94\u88AB\u8BC6\u522B\u4E3A\u4E00\u4E2A\u72EC\u7ACB\u7684\u4E1A\u52A1\u670D\u52A1\u3002
513
+
514
+ ### \u53C2\u4E0E\u8005\u7C7B\u578B
515
+
516
+ 1. **\u7528\u6237\uFF08user\uFF09**\uFF1A\u5173\u5FC3\u4E1A\u52A1\u670D\u52A1\u7684\u4E1A\u52A1\u89D2\u8272\u6216\u4E1A\u52A1\u90E8\u95E8\uFF0C\u901A\u8FC7\u6267\u884C\u67D0\u4E2A\u64CD\u4F5C\u89E6\u53D1\u670D\u52A1\u8BF7\u6C42
517
+ 2. **\u7B56\u7565\uFF08policy\uFF09**\uFF1A\u5C01\u88C5\u4E86\u4E1A\u52A1\u89C4\u5219\u7684\u5B9A\u65F6\u5668\uFF0C\u4E00\u65E6\u6EE1\u8DB3\u8BE5\u4E1A\u52A1\u89C4\u5219\uFF0C\u5C31\u80FD\u591F\u4E3B\u52A8\u89E6\u53D1\u5411\u76EE\u6807\u7CFB\u7EDF\u53D1\u8D77\u670D\u52A1\u8BF7\u6C42
518
+ 3. **\u4F34\u751F\u7CFB\u7EDF\uFF08accompanying system\uFF09**\uFF1A\u4F4D\u4E8E\u76EE\u6807\u7CFB\u7EDF\u4E4B\u5916\uFF0C\u53EA\u8981\u662F\u7531\u4F34\u751F\u7CFB\u7EDF\u53D1\u8D77\u5411\u76EE\u6807\u7CFB\u7EDF\u7684\u670D\u52A1\u8BF7\u6C42\uFF0C\u5C31\u662F\u4E1A\u52A1\u670D\u52A1\u7684\u53C2\u4E0E\u8005
519
+
520
+ ## \u4E1A\u52A1\u670D\u52A1\u7EC4\u6210\u5143\u7D20
521
+
522
+ \u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u5FC5\u987B\u5305\u542B\u4EE5\u4E0B\u7EC4\u6210\u5143\u7D20\uFF1A
523
+
524
+ ### 1. \u670D\u52A1\u7F16\u53F7
525
+ - \u683C\u5F0F\uFF1A\`{\u7CFB\u7EDF\u540D\u79F0}-{\u5E8F\u53F7}\`
526
+ - \u793A\u4F8B\uFF1A\`EC-001\`\u3001\`TRIBE-001\`
527
+
528
+ ### 2. \u670D\u52A1\u540D
529
+ - \u683C\u5F0F\uFF1A\u52A8\u8BCD\u77ED\u8BED\u5F62\u5F0F
530
+ - \u793A\u4F8B\uFF1A\`\u63D0\u4EA4\u8BA2\u5355\`\u3001\`\u7528\u6237\u6CE8\u518C\`\u3001\`\u7533\u8BF7\u8D37\u6B3E\`
531
+
532
+ ### 3. \u670D\u52A1\u63CF\u8FF0
533
+ - \u683C\u5F0F\uFF1A\u4F5C\u4E3A<\u89D2\u8272>\uFF0C\u6211\u60F3\u8981<\u670D\u52A1\u529F\u80FD>\uFF0C\u4EE5\u4FBF<\u670D\u52A1\u4EF7\u503C>
534
+
535
+ ### 4. \u89E6\u53D1\u4E8B\u4EF6
536
+ - \u63CF\u8FF0\uFF1A\u89E6\u53D1\u8BE5\u4E1A\u52A1\u670D\u52A1\u7684\u4E8B\u4EF6
537
+
538
+ ### 5. \u57FA\u672C\u6D41\u7A0B
539
+ - \u63CF\u8FF0\uFF1A\u7528\u4E8E\u8868\u73B0\u4E1A\u52A1\u670D\u52A1\u7684\u4E3B\u6D41\u7A0B\uFF0C\u5373\u6267\u884C\u6210\u529F\u7684\u4E1A\u52A1\u573A\u666F
540
+ - \u683C\u5F0F\uFF1A\u7F16\u53F7\u5217\u8868\uFF0C\u6BCF\u4E2A\u6B65\u9AA4\u6E05\u6670\u660E\u786E
541
+
542
+ ### 6. \u66FF\u4EE3\u6D41\u7A0B
543
+ - \u63CF\u8FF0\uFF1A\u7528\u4E8E\u8868\u73B0\u4E1A\u52A1\u670D\u52A1\u7684\u6269\u5C55\u6D41\u7A0B\uFF0C\u5373\u6267\u884C\u5931\u8D25\u7684\u4E1A\u52A1\u573A\u666F
544
+ - \u683C\u5F0F\uFF1A\u7F16\u53F7+\u5B57\u6BCD\uFF08\u59821a\u30012a\uFF09\uFF0C\u5BF9\u5E94\u57FA\u672C\u6D41\u7A0B\u7684\u6B65\u9AA4
545
+
546
+ ### 7. \u9A8C\u6536\u6807\u51C6
547
+ - \u63CF\u8FF0\uFF1A\u4E00\u7CFB\u5217\u53EF\u4EE5\u63A5\u53D7\u7684\u6761\u4EF6\u6216\u8005\u4E1A\u52A1\u89C4\u5219
548
+ - \u683C\u5F0F\uFF1A\u8981\u70B9\u5F62\u5F0F\u5217\u4E3E\uFF0C\u53EF\u6D4B\u8BD5\u3001\u53EF\u9A8C\u8BC1
549
+
550
+ ## \u8BC6\u522B\u7EA6\u675F\u6761\u4EF6
551
+
552
+ ### 1. \u6267\u884C\u6B65\u9AA4\u7EA6\u675F
553
+ - \u4E1A\u52A1\u670D\u52A1\u7684\u6267\u884C\u6B65\u9AA4\u4E0D\u5305\u62EC\u7EBF\u4E0B\u6267\u884C\u7684\u6B65\u9AA4
554
+ - \u4E1A\u52A1\u670D\u52A1\u7684\u6267\u884C\u6B65\u9AA4\u4EC5\u9650\u4E8E\u7CFB\u7EDF\u540E\u7AEF\u6536\u5230\u8BF7\u6C42\u6267\u884C\u7684\u4E00\u6B21\u8FDE\u7EED\u800C\u5B8C\u6574\u7684\u529F\u80FD\u4EA4\u4E92
555
+ - \u4E0D\u5305\u62EC\u524D\u7AEF\u7684\u4EFB\u4F55\u64CD\u4F5C
556
+
557
+ ### 2. \u670D\u52A1\u540D\u79F0\u7EA6\u675F
558
+ - \u4E1A\u52A1\u670D\u52A1\u7684\u540D\u79F0\u5E94\u91C7\u7528\u52A8\u8BCD\u77ED\u8BED\uFF0C\u4EE5\u52A8\u5BBE\u7ED3\u6784\u6784\u6210
559
+ - \u907F\u514D\u4F7F\u7528\u6280\u672F\u672F\u8BED
560
+
561
+ ### 3. \u8FB9\u754C\u7EA6\u675F
562
+ - \u4E1A\u52A1\u670D\u52A1\u5E94\u8BE5\u6709\u660E\u786E\u7684\u8F93\u5165\u548C\u8F93\u51FA
563
+ - \u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u662F\u53C2\u4E0E\u8005\u5411\u76EE\u6807\u7CFB\u7EDF\u53D1\u8D77\u7684**\u4E00\u6B21\u72EC\u7ACB\u8BF7\u6C42**\uFF0C\u4E0D\u5E94\u5305\u542B\u591A\u4E2A\u72EC\u7ACB\u64CD\u4F5C
564
+ - \u907F\u514D\u8BC6\u522B\u8FC7\u4E8E\u5E9E\u5927\uFF08\u5C06\u591A\u4E2A\u64CD\u4F5C\u805A\u5408\u4E3A\u4E00\u4E2A\u670D\u52A1\uFF09\u6216\u8FC7\u4E8E\u7EC6\u7C92\u5EA6\uFF08\u5C06\u4E00\u4E2A\u64CD\u4F5C\u62C6\u5206\u4E3A\u591A\u6B21\u8BF7\u6C42\uFF09\u7684\u670D\u52A1
565
+ - \u5224\u65AD\u6807\u51C6\uFF1A\u5982\u679C\u4E24\u4E2A\u64CD\u4F5C\u53EF\u4EE5\u72EC\u7ACB\u89E6\u53D1\u3001\u72EC\u7ACB\u5B8C\u6210\u4E14\u5404\u6709\u72EC\u7ACB\u7684\u4E1A\u52A1\u4EF7\u503C\uFF0C\u5219\u5B83\u4EEC\u5E94\u8BE5\u88AB\u8BC6\u522B\u4E3A\u4E24\u4E2A\u4E1A\u52A1\u670D\u52A1
566
+
567
+ ## \u4E1A\u52A1\u670D\u52A1\u793A\u4F8B
568
+
569
+ \`\`\`
570
+ \u670D\u52A1\u7F16\u53F7\uFF1AI-001
571
+ \u670D\u52A1\u540D\uFF1A\u63D0\u4EA4\u8BA2\u5355
572
+ \u670D\u52A1\u63CF\u8FF0\uFF1A
573
+ \u4F5C\u4E3A\u4E70\u5BB6\uFF0C
574
+ \u6211\u60F3\u8981\u63D0\u4EA4\u8BA2\u5355\uFF0C
575
+ \u4EE5\u4FBF\u4E70\u5230\u6211\u5FC3\u4EEA\u7684\u5546\u54C1\u3002
576
+
577
+ \u89E6\u53D1\u4E8B\u4EF6\uFF1A\u4E70\u5BB6\u70B9\u51FB"\u63D0\u4EA4\u8BA2\u5355"\u6309\u94AE
578
+
579
+ \u57FA\u672C\u6D41\u7A0B\uFF1A
580
+ 1. \u9A8C\u8BC1\u8BA2\u5355\u6709\u6548\u6027\uFF1B
581
+ 2. \u9A8C\u8BC1\u8BA2\u5355\u6240\u8D2D\u5546\u54C1\u662F\u5426\u7F3A\u8D27\uFF1B
582
+ 3. \u63D2\u5165\u8BA2\u5355\uFF1B
583
+ 4. \u4ECE\u8D2D\u7269\u8F66\u4E2D\u79FB\u9664\u6240\u8D2D\u5546\u54C1\uFF1B
584
+ 5. \u9501\u5B9A\u5E93\u5B58\uFF1B
585
+ 6. \u901A\u77E5\u4E70\u5BB6\u8BA2\u5355\u5DF2\u63D0\u4EA4\u3002
586
+
587
+ \u66FF\u4EE3\u6D41\u7A0B\uFF1A
588
+ 1a. \u5982\u679C\u8BA2\u5355\u65E0\u6548\uFF0C\u7ED9\u51FA\u63D0\u793A\u4FE1\u606F\uFF1B
589
+ 2a. \u5982\u679C\u6240\u8D2D\u5546\u54C1\u7F3A\u8D27\uFF0C\u7ED9\u51FA\u63D0\u793A\u4FE1\u606F\uFF1B
590
+ 3a. \u82E5\u8BA2\u5355\u63D0\u4EA4\u5931\u8D25\uFF0C\u7ED9\u51FA\u5931\u8D25\u539F\u56E0\u3002
591
+
592
+ \u9A8C\u6536\u6807\u51C6\uFF1A
593
+ 1. \u8BA2\u5355\u9700\u8981\u5305\u542B\u5BA2\u6237ID\u3001\u914D\u9001\u5730\u5740\u3001\u8054\u7CFB\u4FE1\u606F\u53CA\u5DF2\u8D2D\u5546\u54C1\u7684\u8BA2\u5355\u9879\uFF1B
594
+ 2. \u8BA2\u5355\u9879\u4E2D\u5546\u54C1\u7684\u8D2D\u4E70\u6570\u91CF\u8981\u5C0F\u4E8E\u6216\u7B49\u4E8E\u5E93\u5B58\u91CF\uFF1B
595
+ 3. \u8BA2\u5355\u63D0\u4EA4\u6210\u529F\u540E\uFF0C\u8BA2\u5355\u72B6\u6001\u66F4\u6539\u4E3A"\u5DF2\u63D0\u4EA4"\uFF1B
596
+ 4. \u8D2D\u7269\u8F66\u5BF9\u5E94\u5546\u54C1\u88AB\u79FB\u9664\uFF1B
597
+ 5. \u5728\u5B8C\u6210\u652F\u4ED8\u6216\u53D6\u6D88\u8BA2\u5355\u524D\uFF0C\u9700\u8981\u9501\u5B9A\u5BF9\u5E94\u6570\u91CF\u7684\u5546\u54C1\uFF1B
598
+ 6. \u4E70\u5BB6\u6536\u5230\u8BA2\u5355\u5DF2\u63D0\u4EA4\u7684\u901A\u77E5\u3002
599
+ \`\`\`
600
+
601
+ ## \u8BC6\u522B\u6B65\u9AA4\u6307\u5BFC
602
+
603
+ ### \u6B65\u9AA41\uFF1A\u9700\u6C42\u5206\u6790
604
+ 1. \u4ED4\u7EC6\u9605\u8BFB\u9700\u6C42\u89C4\u683C\u8BF4\u660E\u4E66\u6216\u8C03\u7814\u9700\u6C42\uFF0C\u5168\u9762\u7406\u89E3\u6240\u6709\u4E1A\u52A1\u9700\u6C42
605
+ 2. \u8BC6\u522B\u6240\u6709\u7684\u4E1A\u52A1\u53C2\u4E0E\u8005\uFF08\u7528\u6237\u3001\u7B56\u7565\u3001\u4F34\u751F\u7CFB\u7EDF\uFF09
606
+ 3. \u7406\u89E3\u6BCF\u4E2A\u53C2\u4E0E\u8005\u7684\u4E1A\u52A1\u76EE\u6807\u548C\u4EF7\u503C\u8BC9\u6C42
607
+ 4. \u5168\u9762\u68B3\u7406\u539F\u59CB\u9700\u6C42\u4E2D\u7684\u6240\u6709\u529F\u80FD\u70B9\uFF0C\u786E\u4FDD\u4E0D\u9057\u6F0F\u4EFB\u4F55\u4E1A\u52A1\u529F\u80FD
608
+
609
+ ### \u6B65\u9AA42\uFF1A\u529F\u80FD\u8BC6\u522B
610
+ 1. \u5168\u9762\u5206\u6790\u539F\u59CB\u9700\u6C42\u6587\u6863\uFF0C\u8BC6\u522B\u6240\u6709\u9700\u8981\u7CFB\u7EDF\u652F\u6301\u7684\u4E1A\u52A1\u529F\u80FD\u70B9
611
+ 2. \u786E\u4FDD\u5168\u9762\u8986\u76D6\u539F\u59CB\u9700\u6C42\uFF1A\u4ED4\u7EC6\u68C0\u67E5\u539F\u59CB\u9700\u6C42\u6587\u6863\u4E2D\u7684\u6BCF\u4E00\u4E2A\u529F\u80FD\u70B9
612
+ 3. \u4E0D\u9057\u6F0F\u4EFB\u4F55\u4E1A\u52A1\u529F\u80FD
613
+ 4. \u5C06\u76F8\u5173\u529F\u80FD\u7EC4\u7EC7\u6210\u4E1A\u52A1\u670D\u52A1
614
+ 5. \u786E\u4FDD\u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u90FD\u6709\u660E\u786E\u7684\u89E6\u53D1\u4E8B\u4EF6
615
+
616
+ ### \u6B65\u9AA43\uFF1A\u6D41\u7A0B\u8BBE\u8BA1
617
+ 1. \u4E3A\u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u8BBE\u8BA1\u57FA\u672C\u6D41\u7A0B
618
+ 2. \u8BC6\u522B\u53EF\u80FD\u7684\u5F02\u5E38\u60C5\u51B5\uFF0C\u8BBE\u8BA1\u66FF\u4EE3\u6D41\u7A0B
619
+ 3. \u786E\u4FDD\u6D41\u7A0B\u7684\u5B8C\u6574\u6027\u548C\u4E00\u81F4\u6027
620
+
621
+ ### \u6B65\u9AA44\uFF1A\u9A8C\u6536\u6807\u51C6\u5236\u5B9A
622
+ 1. \u4E3A\u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u5236\u5B9A\u660E\u786E\u7684\u9A8C\u6536\u6807\u51C6
623
+ 2. \u786E\u4FDD\u9A8C\u6536\u6807\u51C6\u53EF\u6D4B\u8BD5\u3001\u53EF\u9A8C\u8BC1
624
+ 3. \u8986\u76D6\u529F\u80FD\u6027\u548C\u975E\u529F\u80FD\u6027\u8981\u6C42
625
+
626
+ ### \u6B65\u9AA45\uFF1A\u6587\u6863\u5316
627
+ 1. \u6309\u7167\u6807\u51C6\u683C\u5F0F\u7F16\u5199\u4E1A\u52A1\u670D\u52A1\u6587\u6863
628
+ 2. \u786E\u4FDD\u6240\u6709\u7EC4\u6210\u5143\u7D20\u90FD\u5B8C\u6574
629
+ 3. \u68C0\u67E5\u662F\u5426\u7B26\u5408\u7EA6\u675F\u6761\u4EF6
630
+ 4. \u9A8C\u8BC1\u662F\u5426\u5168\u9762\u8986\u76D6\u4E86\u539F\u59CB\u9700\u6C42\u4E2D\u7684\u6240\u6709\u4E1A\u52A1\u529F\u80FD
631
+
632
+ ## \u8F93\u51FA\u8981\u6C42
633
+
634
+ \u8BC6\u522B\u5B8C\u6210\u540E\uFF0C\u8BF7\u5C06\u4E1A\u52A1\u670D\u52A1\u5B9A\u4E49\u6587\u6863\u5199\u5165 **\`docs/sparrow/requirement/spec.md\`**\u3002
635
+
636
+ \u6587\u6863\u683C\u5F0F\u5982\u4E0B\uFF1A
637
+
638
+ \`\`\`markdown
639
+ # {\u7CFB\u7EDF\u540D\u79F0}\u4E1A\u52A1\u670D\u52A1\u5B9A\u4E49\u6587\u6863
640
+
641
+ ## 1 {\u4E1A\u52A1\u670D\u52A11\u540D\u79F0}
642
+ **\u670D\u52A1\u7F16\u53F7\uFF1A** {\u7F16\u53F7}
643
+ **\u670D\u52A1\u540D\uFF1A** {\u670D\u52A1\u540D}
644
+ **\u670D\u52A1\u63CF\u8FF0\uFF1A**
645
+ \u4F5C\u4E3A{\u89D2\u8272}\uFF0C
646
+ \u6211\u60F3\u8981{\u670D\u52A1\u529F\u80FD}\uFF0C
647
+ \u4EE5\u4FBF{\u670D\u52A1\u4EF7\u503C}\u3002
648
+
649
+ **\u89E6\u53D1\u4E8B\u4EF6\uFF1A** {\u89E6\u53D1\u4E8B\u4EF6}
650
+
651
+ **\u57FA\u672C\u6D41\u7A0B\uFF1A**
652
+ 1. {\u6B65\u9AA41}\uFF1B
653
+ 2. {\u6B65\u9AA42}\uFF1B
654
+ ...
655
+
656
+ **\u66FF\u4EE3\u6D41\u7A0B\uFF1A**
657
+ 1a. {\u5F02\u5E38\u60C5\u51B51}\uFF1B
658
+ 2a. {\u5F02\u5E38\u60C5\u51B52}\uFF1B
659
+ ...
660
+
661
+ **\u9A8C\u6536\u6807\u51C6\uFF1A**
662
+ 1. {\u6807\u51C61}\uFF1B
663
+ 2. {\u6807\u51C62}\uFF1B
664
+ ...
665
+
666
+ ---
667
+
668
+ ## 2 {\u4E1A\u52A1\u670D\u52A12\u540D\u79F0}
669
+ ...
670
+ \`\`\`
671
+
672
+ ## \u8D28\u91CF\u68C0\u67E5\u6E05\u5355
673
+
674
+ \u5728\u5B8C\u6210\u4E1A\u52A1\u670D\u52A1\u8BC6\u522B\u540E\uFF0C\u8BF7\u68C0\u67E5\u4EE5\u4E0B\u9879\u76EE\uFF1A
675
+
676
+ - [ ] **\u4E1A\u52A1\u670D\u52A1\u5B8C\u6574\u6027**\uFF1A\u6240\u6709\u539F\u59CB\u9700\u6C42\u4E2D\u7684\u4E1A\u52A1\u529F\u80FD\u90FD\u5DF2\u88AB\u8BC6\u522B\u4E3A\u4E1A\u52A1\u670D\u52A1\uFF0C\u6CA1\u6709\u9057\u6F0F
677
+ - [ ] **\u9700\u6C42\u8986\u76D6\u5B8C\u6574\u6027**\uFF1A\u539F\u59CB\u9700\u6C42\u6587\u6863\u4E2D\u7684\u6BCF\u4E2A\u529F\u80FD\u70B9\u3001\u6BCF\u4E2A\u4E1A\u52A1\u573A\u666F\u3001\u6BCF\u4E2A\u7528\u6237\u9700\u6C42\u90FD\u6709\u5BF9\u5E94\u7684\u4E1A\u52A1\u670D\u52A1
678
+ - [ ] \u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u90FD\u6709\u660E\u786E\u7684\u53C2\u4E0E\u8005
679
+ - [ ] \u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u90FD\u6709\u660E\u786E\u7684\u4EF7\u503C\u4E3B\u5F20
680
+ - [ ] \u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u90FD\u6709\u660E\u786E\u7684\u89E6\u53D1\u4E8B\u4EF6
681
+ - [ ] \u57FA\u672C\u6D41\u7A0B\u8986\u76D6\u4E86\u4E3B\u8981\u7684\u6210\u529F\u8DEF\u5F84
682
+ - [ ] \u66FF\u4EE3\u6D41\u7A0B\u8986\u76D6\u4E86\u4E3B\u8981\u7684\u5F02\u5E38\u60C5\u51B5
683
+ - [ ] \u9A8C\u6536\u6807\u51C6\u53EF\u6D4B\u8BD5\u3001\u53EF\u9A8C\u8BC1
684
+ - [ ] \u670D\u52A1\u540D\u79F0\u91C7\u7528\u52A8\u8BCD\u77ED\u8BED\u5F62\u5F0F
685
+ - [ ] \u6267\u884C\u6B65\u9AA4\u4E0D\u5305\u62EC\u7EBF\u4E0B\u64CD\u4F5C
686
+ - [ ] \u6267\u884C\u6B65\u9AA4\u4EC5\u9650\u4E8E\u7CFB\u7EDF\u540E\u7AEF\u529F\u80FD
687
+ - [ ] \u4E1A\u52A1\u670D\u52A1\u4E4B\u95F4\u6709\u6E05\u6670\u7684\u8FB9\u754C
688
+ - [ ] **\u4E00\u6B21\u8BF7\u6C42\u539F\u5219**\uFF1A\u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u53EA\u5BF9\u5E94\u53C2\u4E0E\u8005\u5411\u76EE\u6807\u7CFB\u7EDF\u53D1\u8D77\u7684\u4E00\u6B21\u72EC\u7ACB\u8BF7\u6C42
689
+ - [ ] **\u975E\u7528\u4F8B\u68C0\u67E5**\uFF1A\u6CA1\u6709\u5C06"\u6A21\u5757"\u6216"\u7528\u4F8B"\u8BEF\u8BC6\u522B\u4E3A\u4E1A\u52A1\u670D\u52A1\uFF08\u5982\u5C06\u589E\u5220\u6539\u67E5\u5408\u5E76\u4E3A\u4E00\u4E2A\u670D\u52A1\uFF09
690
+ - [ ] \u5BF9\u4E8E\u540C\u4E00\u9886\u57DF\u5BF9\u8C61\u7684\u4E0D\u540C\u64CD\u4F5C\uFF08\u67E5\u8BE2\u3001\u65B0\u589E\u3001\u4FEE\u6539\u3001\u5220\u9664\uFF09\uFF0C\u5DF2\u8BC6\u522B\u4E3A\u72EC\u7ACB\u7684\u4E1A\u52A1\u670D\u52A1
691
+
692
+ ## \u5B8C\u6210\u540E\u7684\u4E0B\u4E00\u6B65
693
+
694
+ \u2705 \u5B8C\u6210 sparrow-explore \u540E\uFF0C\u8BF7\u6267\u884C **sparrow-arch**\uFF08\u4EA7\u54C1\u7EA7\uFF09\u2014\u2014 \u57FA\u4E8E\u4E1A\u52A1\u670D\u52A1\u5B9A\u4E49\u6587\u6863\uFF0C\u5212\u5206\u5B50\u9886\u57DF\u5E76\u5B9A\u4E49\u4E1A\u52A1\u67B6\u6784\u548C\u5E94\u7528\u67B6\u6784\u3002
695
+ `;
696
+ function register() {
697
+ registerSkillTemplate("sparrow-explore", () => EXPLORE_BODY);
698
+ }
699
+
700
+ // src/skills/arch.ts
701
+ var ARCH_BODY = `# Sparrow Arch \u2014 \u4E1A\u52A1\u67B6\u6784\u4E0E\u5E94\u7528\u67B6\u6784\u5B9A\u4E49
702
+
703
+ ## \u6267\u884C\u987A\u5E8F\u68C0\u67E5
704
+
705
+ \u5728\u6267\u884C\u4E4B\u524D\uFF0C\u8BF7\u68C0\u67E5\u5F53\u524D\u9636\u6BB5\u662F\u5426\u5408\u9002\uFF1A
706
+
707
+ \`\`\`
708
+ \u5F53\u524D\u6B65\u9AA4\uFF1Asparrow-arch\uFF08\u7B2C 2 \u6B65 / \u5171 6 \u6B65\uFF09
709
+ \u6240\u5C5E\u5C42\u7EA7\uFF1A\u4EA7\u54C1\u7EA7\uFF08product-level\uFF09
710
+ \u524D\u7F6E\u6761\u4EF6\uFF1Adocs/sparrow/requirement/spec.md \u5FC5\u987B\u5B58\u5728
711
+ \u4E0B\u4E00\u6B65\u9AA4\uFF1Asparrow-design\uFF08\u56E2\u961F\u7EA7\uFF0C\u6309\u9650\u754C\u4E0A\u4E0B\u6587\u6267\u884C\uFF09
712
+ \`\`\`
713
+
714
+ **\u524D\u7F6E\u6761\u4EF6\u68C0\u67E5**\uFF1A
715
+ - \u5982\u679C \`docs/sparrow/requirement/spec.md\` \u4E0D\u5B58\u5728\uFF0C\u8BF7\u63D0\u793A\u7528\u6237\u5148\u6267\u884C **sparrow-explore**
716
+ - \u5982\u679C\u5DF2\u5B58\u5728 \`docs/sparrow/architecture/business.md\` \u6216 \`docs/sparrow/architecture/application.md\`\uFF0C\u8BF7\u53C2\u8003\u4E0B\u65B9"\u8F93\u51FA\u6587\u4EF6\u5B58\u5728\u6027\u68C0\u67E5"\u7AE0\u8282\u5904\u7406
717
+
718
+ ---
719
+
720
+ ## \u{1F6D1} \u8F93\u51FA\u6587\u4EF6\u5B58\u5728\u6027\u68C0\u67E5\uFF08\u5FC5\u987B\u5728\u751F\u6210\u524D\u6267\u884C\uFF09
721
+
722
+ \u5728\u5F00\u59CB\u751F\u6210\u5185\u5BB9\u4E4B\u524D\uFF0C\u8BF7\u68C0\u67E5\u4EE5\u4E0B\u8F93\u51FA\u6587\u4EF6\u662F\u5426\u5DF2\u7ECF\u5B58\u5728\uFF1A
723
+
724
+ - \`docs/sparrow/architecture/business.md\`
725
+ - \`docs/sparrow/architecture/application.md\`
726
+ - \`docs/sparrow/design/{slug}/spec.md\`\uFF08\u5BF9\u6BCF\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\uFF09
727
+
728
+ \u5982\u679C\u4EFB\u4E00\u6587\u4EF6\u5DF2\u5B58\u5728\uFF0C\u8BF7**\u8BA9\u7528\u6237\u8FDB\u884C\u4E00\u6B21\u9009\u62E9**\uFF08\u8BE5\u9009\u62E9\u5C06\u5E94\u7528\u4E8E\u6240\u6709\u5DF2\u5B58\u5728\u7684\u6587\u4EF6\uFF09\uFF1A
729
+
730
+ - **\u8DF3\u8FC7 (skip)**\uFF1A\u4FDD\u7559\u5DF2\u6709\u6587\u4EF6\uFF0C\u4E0D\u6267\u884C\u4EFB\u4F55\u751F\u6210\u64CD\u4F5C\uFF0C\u505C\u6B62\u6267\u884C
731
+ - **\u8986\u76D6 (overwrite)**\uFF1A\u5220\u9664\u5DF2\u6709\u6587\u4EF6\uFF0C\u91CD\u65B0\u751F\u6210\u5168\u65B0\u7684\u5185\u5BB9
732
+ - **\u66F4\u65B0 (update)**\uFF1A\u5728\u5DF2\u6709\u6587\u4EF6\u57FA\u7840\u4E0A\u8FDB\u884C\u4FEE\u6539\u548C\u5B8C\u5584
733
+
734
+ > \u26A0\uFE0F \u4E00\u6B21\u547D\u4EE4\u53EA\u786E\u8BA4\u4E00\u6B21\uFF0C\u7528\u6237\u7684\u9009\u62E9\u5E94\u7528\u4E8E\u6240\u6709\u8F93\u51FA\u6587\u4EF6\u3002
735
+
736
+ ---
737
+
738
+ ## \u{1F4CB} project.md \u66F4\u65B0
739
+
740
+ \u5B8C\u6210\u8F93\u51FA\u540E\uFF0C**\u5FC5\u987B**\u66F4\u65B0 \`docs/sparrow/project.md\`\uFF1A
741
+
742
+ 1. \u5982\u679C \`project.md\` \u4E0D\u5B58\u5728\uFF0C\u6839\u636E\u5F53\u524D\u9879\u76EE\u4FE1\u606F\u521B\u5EFA\u5B83
743
+ 2. \u5728"\u6587\u6863\u7D22\u5F15"\u90E8\u5206\uFF0C\u66F4\u65B0 \`architecture/business.md\` \u548C \`architecture/application.md\` \u7684\u94FE\u63A5\uFF0C\u72B6\u6001\u6539\u4E3A\u7248\u672C\u53F7
744
+ 3. \u5728"\u9650\u754C\u4E0A\u4E0B\u6587\u8BBE\u8BA1"\u90E8\u5206\uFF0C\u4E3A\u6BCF\u4E2A\u65B0\u521B\u5EFA\u7684\u9650\u754C\u4E0A\u4E0B\u6587\u6DFB\u52A0\u5B50\u7AE0\u8282\uFF1A
745
+ \`\`\`markdown
746
+ #### {\u9650\u754C\u4E0A\u4E0B\u6587\u540D\u79F0} (\`{slug}\`)
747
+ - [spec](./design/{slug}/spec.md) \u2014 *v1.0*
748
+ - [api](./design/{slug}/api.md) \u2014 *\u5F85\u751F\u6210*
749
+ - [tech](./design/{slug}/tech.md) \u2014 *\u5F85\u751F\u6210*
750
+ - [model](./design/{slug}/model.md) \u2014 *\u5F85\u751F\u6210*
751
+ - [plan](./design/{slug}/plan.md) \u2014 *\u5F85\u751F\u6210*
752
+ \`\`\`
753
+ 4. \u66F4\u65B0\u6587\u4EF6\u5934\u90E8\u7684"\u6700\u540E\u66F4\u65B0"\u65F6\u95F4\u6233
754
+
755
+ **project.md \u8DEF\u5F84**: \`docs/sparrow/project.md\`
756
+
757
+ ---
758
+
759
+ ## \u{1F4CC} \u7248\u672C\u5143\u6570\u636E\u7BA1\u7406
760
+
761
+ \u6240\u6709\u8F93\u51FA\u7684\u6587\u6863\u6587\u4EF6**\u5FC5\u987B\u5728\u6587\u4EF6\u5F00\u5934**\u5305\u542B\u7248\u672C\u5143\u6570\u636E\u5757\uFF1A
762
+
763
+ \`\`\`markdown
764
+ <!--
765
+ version: v1.0
766
+ last-updated: {ISO_8601_TIMESTAMP}
767
+ generated-by: sparrow-arch
768
+ sparrow-version: {\u4ECE .sparrow/sparrow.json \u8BFB\u53D6}
769
+ -->
770
+ \`\`\`
771
+
772
+ **\u7248\u672C\u89C4\u5219**:
773
+ - **\u65B0\u6587\u6863**: \u4F7F\u7528 \`v1.0\`
774
+ - **\u66F4\u65B0\u5DF2\u6709\u6587\u6863**: \u8BFB\u53D6\u73B0\u6709\u7248\u672C\u53F7\uFF0C\u9012\u589E\u6B21\u7248\u672C\u53F7\uFF08\`v1.0\` \u2192 \`v1.1\`\uFF09
775
+ - **\u91CD\u5927\u91CD\u5199**: \u9012\u589E\u4E3B\u7248\u672C\u53F7\uFF08\`v1.x\` \u2192 \`v2.0\`\uFF09
776
+ - \u6BCF\u6B21\u4FEE\u6539\u90FD**\u5FC5\u987B\u53D8\u66F4**\u7248\u672C\u53F7
777
+
778
+ **\u64CD\u4F5C\u6B65\u9AA4**:
779
+ 1. \u68C0\u67E5\u76EE\u6807\u6587\u4EF6\u662F\u5426\u5DF2\u5B58\u5728
780
+ 2. \u5982\u679C\u5B58\u5728\uFF0C\u8BFB\u53D6\u6587\u4EF6\u5F00\u5934 \`<!--\` \u6CE8\u91CA\u5757\u4E2D\u7684 \`version:\` \u5B57\u6BB5\u5E76\u9012\u589E
781
+ 3. \u5728\u6587\u4EF6\u5F00\u5934\u6DFB\u52A0\u6216\u66F4\u65B0\u7248\u672C\u5143\u6570\u636E\u5757
782
+ 4. \u7EE7\u7EED\u751F\u6210\u6587\u6863\u6B63\u6587
783
+
784
+ ---
785
+
786
+ ## \u6982\u8FF0
787
+
788
+ \u672C\u9636\u6BB5\u5206\u4E3A\u4E24\u4E2A\u5B50\u6B65\u9AA4\uFF1A
789
+
790
+ ### \u5B50\u6B65\u9AA4 1\uFF1A\u4E1A\u52A1\u67B6\u6784\u5B9A\u4E49
791
+ \u4F60\u662F\u4E00\u540D\u4E13\u4E1A\u7684**\u4E1A\u52A1\u67B6\u6784\u5E08**\uFF0C\u8D1F\u8D23\u6839\u636E\u4E1A\u52A1\u670D\u52A1\u5B9A\u4E49\u6587\u6863\uFF0C\u9075\u5FAA DDD \u7684\u5B50\u9886\u57DF\u8981\u6C42\uFF0C\u8BC6\u522B\u5B50\u9886\u57DF\u5E76\u7ED8\u5236\u4E1A\u52A1\u67B6\u6784\u56FE\u3002
792
+
793
+ ### \u5B50\u6B65\u9AA4 2\uFF1A\u5E94\u7528\u67B6\u6784\u6620\u5C04
794
+ \u4F60\u662F\u4E00\u540D\u4E13\u4E1A\u7684**\u5E94\u7528\u67B6\u6784\u5E08**\uFF0C\u8D1F\u8D23\u5C06\u4E1A\u52A1\u67B6\u6784\u6620\u5C04\u4E3A\u5E94\u7528\u67B6\u6784\u3002\u901A\u8FC7 DDD \u6218\u7565\u8BBE\u8BA1\uFF0C\u5C06\u5B50\u9886\u57DF\u6620\u5C04\u4E3A\u9650\u754C\u4E0A\u4E0B\u6587\u3002
795
+
796
+ ---
797
+
798
+ # \u9636\u6BB5\u4E00\uFF1A\u4E1A\u52A1\u67B6\u6784\u5B9A\u4E49
799
+
800
+ ## \u7B2C\u4E00\u6027\u539F\u7406
801
+
802
+ ### 1. \u4EF7\u503C\u5BFC\u5411\u539F\u5219
803
+ - \u5B50\u9886\u57DF\u5212\u5206\u5FC5\u987B\u4EE5\u4E1A\u52A1\u4EF7\u503C\u4E3A\u6838\u5FC3\uFF0C\u4F18\u5148\u8BC6\u522B\u6838\u5FC3\u5B50\u9886\u57DF
804
+ - \u6BCF\u4E2A\u5B50\u9886\u57DF\u90FD\u5E94\u8BE5\u4E3A\u4E1A\u52A1\u76EE\u6807\u521B\u9020\u660E\u786E\u7684\u4EF7\u503C
805
+
806
+ ### 2. \u5185\u805A\u6027\u539F\u5219
807
+ - \u540C\u4E00\u5B50\u9886\u57DF\u5185\u7684\u4E1A\u52A1\u670D\u52A1\u5E94\u8BE5\u5177\u6709\u9AD8\u5EA6\u7684\u5185\u805A\u6027
808
+ - \u4E0D\u540C\u5B50\u9886\u57DF\u4E4B\u95F4\u5E94\u8BE5\u4FDD\u6301\u677E\u8026\u5408\u5173\u7CFB
809
+
810
+ ### 3. \u6218\u7565\u91CD\u8981\u6027\u539F\u5219
811
+ - \u6838\u5FC3\u5B50\u9886\u57DF\u662F\u4F01\u4E1A\u7684\u6838\u5FC3\u7ADE\u4E89\u529B\u6240\u5728\uFF0C\u9700\u8981\u6295\u5165\u6700\u4F18\u8D28\u7684\u8D44\u6E90
812
+ - \u652F\u6491\u5B50\u9886\u57DF\u4E3A\u4E1A\u52A1\u5FC5\u9700\uFF0C\u4F46\u975E\u6838\u5FC3\u7ADE\u4E89\u529B
813
+ - \u901A\u7528\u5B50\u9886\u57DF\u5E94\u4F18\u5148\u8003\u8651\u8D2D\u4E70\u6216\u4F7F\u7528\u6210\u719F\u89E3\u51B3\u65B9\u6848
814
+
815
+ ## \u5B50\u9886\u57DF\u5206\u7C7B\u6807\u51C6
816
+
817
+ ### \u6838\u5FC3\u5B50\u9886\u57DF (Core Subdomain)
818
+ **\u5B9A\u4E49**\uFF1A\u4E1A\u52A1\u6210\u529F\u7684\u5173\u952E\uFF0C\u662F\u4F01\u4E1A\u7684\u6838\u5FC3\u7ADE\u4E89\u529B\u6240\u5728\u3002\u5FC5\u987B\u6295\u5165\u6700\u5927\u8D44\u6E90\uFF0C\u8FDB\u884C\u7CBE\u7EC6\u5316\u5EFA\u6A21\u548C\u5B9A\u5236\u5F00\u53D1\u3002
819
+ **\u7279\u5F81**\uFF1A\u4EF7\u503C\u6700\u9AD8\uFF0C\u5305\u542B\u521B\u65B0\u6027\u7684\u4E1A\u52A1\u903B\u8F91\u548C\u590D\u6742\u7684\u4E1A\u52A1\u89C4\u5219\uFF0C\u662F\u7ADE\u4E89\u5BF9\u624B\u96BE\u4EE5\u590D\u5236\u7684\u6838\u5FC3\u80FD\u529B\u3002
820
+ **\u989C\u8272**\uFF1A\u84DD\u8272 (#e1f5fe)
821
+
822
+ ### \u652F\u6491\u5B50\u9886\u57DF (Supporting Subdomain)
823
+ **\u5B9A\u4E49**\uFF1A\u4E1A\u52A1\u5FC5\u9700\uFF0C\u4F46\u975E\u6838\u5FC3\u7ADE\u4E89\u529B\u3002\u4E3A\u6838\u5FC3\u57DF\u670D\u52A1\uFF0C\u9700\u8981\u5B9A\u5236\u5F00\u53D1\uFF0C\u4F46\u53EF\u4EE5\u91C7\u7528\u76F8\u5BF9\u7B80\u5355\u7684\u6A21\u578B\u3002
824
+ **\u7279\u5F81**\uFF1A\u4EF7\u503C\u5C45\u4E2D\uFF0C\u5305\u542B\u91CD\u8981\u7684\u4E1A\u52A1\u903B\u8F91\u4F46\u76F8\u5BF9\u6807\u51C6\u5316\uFF0C\u4E3A\u4E1A\u52A1\u8FD0\u8425\u63D0\u4F9B\u5FC5\u8981\u7684\u652F\u6491\u529F\u80FD\u3002
825
+ **\u989C\u8272**\uFF1A\u7D2B\u8272 (#f3e5f5)
826
+
827
+ ### \u901A\u7528\u5B50\u9886\u57DF (Generic Subdomain)
828
+ **\u5B9A\u4E49**\uFF1A\u4E1A\u754C\u5DF2\u6709\u6210\u719F\u89E3\u51B3\u65B9\u6848\uFF0C\u975E\u4E1A\u52A1\u72EC\u6709\u3002\u5E94\u4F18\u5148\u8003\u8651\u8D2D\u4E70\u6216\u4F7F\u7528\u5F00\u6E90\u65B9\u6848\u3002
829
+ **\u7279\u5F81**\uFF1A\u4EF7\u503C\u6700\u4F4E\uFF0C\u4E0E\u5782\u76F4\u9886\u57DF\u65E0\u5173\u7684\u901A\u7528\u4E1A\u52A1\uFF0C\u901A\u5E38\u53EF\u8D2D\u4E70\u6216\u4F7F\u7528\u5F00\u6E90\u65B9\u6848\u3002
830
+ **\u989C\u8272**\uFF1A\u7EFF\u8272 (#e8f5e8)
831
+
832
+ ## \u8BC6\u522B\u6B65\u9AA4\u6307\u5BFC
833
+
834
+ ### \u6B65\u9AA41\uFF1A\u8BED\u4E49\u76F8\u5173\u6027\u5206\u6790
835
+ \u6839\u636E\u4E1A\u52A1\u670D\u52A1\u7684\u540D\u79F0\uFF0C\u5BFB\u627E\u8BED\u4E49\u76F8\u540C\u6216\u76F8\u4F3C\u7684\u540D\u8BCD\uFF0C\u4F18\u5148\u5C06\u5176\u5F52\u7C7B\u5230\u4E00\u7EC4\u3002
836
+
837
+ ### \u6B65\u9AA42\uFF1A\u529F\u80FD\u76F8\u5173\u6027\u5206\u6790
838
+ \u8003\u8651\u4E1A\u52A1\u670D\u52A1\u8981\u5B9E\u73B0\u7684\u4E1A\u52A1\u76EE\u6807\u662F\u5426\u4E00\u81F4\uFF0C\u82E5\u4E00\u81F4\uFF0C\u5219\u8003\u8651\u5F52\u7C7B\u5230\u4E00\u7EC4\u3002
839
+
840
+ ### \u6B65\u9AA43\uFF1A\u5F52\u7EB3\u5171\u540C\u7279\u5F81
841
+ \u5BF9\u5F52\u7C7B\u5230\u540C\u4E00\u7EC4\u7684\u6240\u6709\u4E1A\u52A1\u670D\u52A1\u9010\u4E00\u5BF9\u6BD4\uFF0C\u5F52\u7EB3\u5B83\u4EEC\u7684\u5171\u540C\u7279\u5F81\uFF0C\u5E76\u8FDB\u884C\u5408\u7406\u62BD\u8C61\u3002
842
+
843
+ **\u5F52\u7EB3\u539F\u5219**\uFF1A
844
+ - **\u9AD8\u5185\u805A\u677E\u8026\u5408\u539F\u5219**
845
+ - **\u5355\u4E00\u62BD\u8C61\u5C42\u6B21\u539F\u5219**
846
+ - **\u5965\u5361\u59C6\u5243\u5200\u539F\u5219**
847
+ - **\u6700\u5C0F\u60CA\u8BB6\u6CD5\u5219**
848
+ - **\u6E05\u6670\u8FB9\u754C\u539F\u5219**
849
+
850
+ ## \u8BC6\u522B\u6CE8\u610F\u4E8B\u9879
851
+
852
+ 1. **\u907F\u514D\u754C\u9762\u83DC\u5355\u5206\u7C7B\u5F71\u54CD**\uFF1A\u4E0D\u8981\u53D7 UI \u83DC\u5355\u5E03\u5C40\u5F71\u54CD
853
+ 2. **\u907F\u514D\u52A8\u8BCD\u5206\u7C7B\u5F71\u54CD**\uFF1A\u4E0D\u540C\u4E1A\u52A1\u670D\u52A1\u6709\u76F8\u540C\u52A8\u8BCD\u4E0D\u4E00\u5B9A\u5C5E\u4E8E\u540C\u4E00\u5B50\u9886\u57DF
854
+ 3. **\u907F\u514D\u89D2\u8272\u5206\u7C7B\u5F71\u54CD**\uFF1A\u540C\u4E00\u89D2\u8272\u7684\u591A\u4E2A\u4E1A\u52A1\u670D\u52A1\u4E0D\u4E00\u5B9A\u5C5E\u4E8E\u540C\u4E00\u5B50\u9886\u57DF
855
+ 4. **\u907F\u514D\u8FC7\u5EA6\u62BD\u8C61**\uFF1A\u4E0D\u8981\u4ECE\u4E00\u5F00\u59CB\u5C31\u5EFA\u7ACB\u8FC7\u9AD8\u7684\u62BD\u8C61
856
+
857
+ ## \u4E1A\u52A1\u67B6\u6784\u56FE\u7ED8\u5236\u89C4\u8303
858
+
859
+ \u4F7F\u7528 Mermaid \u8BED\u6CD5\u3002**Mermaid 8.8.0 \u7248\u672C\u91CD\u8981\u8981\u6C42**\uFF1A
860
+ - \u6240\u6709 subgraph \u540D\u79F0\u5FC5\u987B\u4F7F\u7528**\u82F1\u6587\u53CC\u5F15\u53F7** \`"\`\uFF0C\u4E0D\u80FD\u4F7F\u7528\u4E2D\u6587\u5F15\u53F7
861
+ - \u8282\u70B9 ID \u4E0D\u80FD\u5305\u542B\u7A7A\u683C\uFF0C\u4F7F\u7528\u4E0B\u5212\u7EBF\u6216\u9A7C\u5CF0\u547D\u540D
862
+ - \u8282\u70B9\u6807\u7B7E\u53EF\u4EE5\u4F7F\u7528\u4E2D\u6587\uFF0C\u5EFA\u8BAE\u7528\u5F15\u53F7\u5305\u88F9
863
+
864
+ \`\`\`mermaid
865
+ graph TB
866
+ subgraph "\u7CFB\u7EDF\u8303\u56F4"
867
+ subgraph "\u901A\u7528\u5B50\u9886\u57DF"
868
+ C1[\u5B50\u9886\u57DFC1]
869
+ C2[\u5B50\u9886\u57DFC2]
870
+ end
871
+
872
+ subgraph "\u652F\u6491\u5B50\u9886\u57DF"
873
+ B1[\u5B50\u9886\u57DFB1]
874
+ B2[\u5B50\u9886\u57DFB2]
875
+ end
876
+
877
+ subgraph "\u6838\u5FC3\u5B50\u9886\u57DF"
878
+ A1[\u5B50\u9886\u57DFA1]
879
+ A2[\u5B50\u9886\u57DFA2]
880
+ end
881
+ end
882
+
883
+ classDef coreDomain fill:#e1f5fe,stroke:#01579b,stroke-width:2px
884
+ classDef supportingDomain fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
885
+ classDef genericDomain fill:#e8f5e8,stroke:#1b5e20,stroke-width:2px
886
+
887
+ class A1,A2 coreDomain
888
+ class B1,B2 supportingDomain
889
+ class C1,C2 genericDomain
890
+ \`\`\`
891
+
892
+ ## \u8F93\u51FA\u6587\u6863\u683C\u5F0F\uFF08\u9636\u6BB5\u4E00\uFF09
893
+
894
+ \u5199\u5165 **\`docs/sparrow/architecture/business.md\`**\uFF1A
895
+
896
+ \`\`\`markdown
897
+ # 1 \u4E1A\u52A1\u67B6\u6784
898
+
899
+ ## 1.1 \u6218\u7565\u76EE\u6807\u4E0E\u5546\u4E1A\u80CC\u666F
900
+
901
+ ### 1.1.1 \u4E1A\u52A1\u613F\u666F
902
+ ### 1.1.2 \u8981\u89E3\u51B3\u7684\u6838\u5FC3\u4E1A\u52A1\u95EE\u9898
903
+ ### 1.1.3 \u5173\u952E\u4E1A\u52A1\u76EE\u6807/\u6307\u6807
904
+ ### 1.1.4 \u4E3B\u8981\u9650\u5236\u4E0E\u5047\u8BBE
905
+
906
+ ## 1.2 \u4E1A\u52A1\u67B6\u6784\u56FE
907
+ [Mermaid \u4E1A\u52A1\u67B6\u6784\u56FE]
908
+
909
+ ## 1.3 \u5B50\u9886\u57DF\u5212\u5206
910
+
911
+ ### 1.3.1 \u6838\u5FC3\u5B50\u9886\u57DF
912
+ #### \u5B50\u9886\u57DFA
913
+ - SERVICE-001: \u670D\u52A1\u540D\u79F0
914
+ - SERVICE-002: \u670D\u52A1\u540D\u79F0
915
+
916
+ ### 1.3.2 \u652F\u6491\u5B50\u9886\u57DF
917
+ ### 1.3.3 \u901A\u7528\u5B50\u9886\u57DF
918
+
919
+ ## 1.4 \u5B50\u9886\u57DF\u5206\u6790\u8BF4\u660E
920
+ \`\`\`
921
+
922
+ ---
923
+
924
+ # \u9636\u6BB5\u4E8C\uFF1A\u5E94\u7528\u67B6\u6784\u6620\u5C04
925
+
926
+ ## \u7B2C\u4E00\u6027\u539F\u7406
927
+
928
+ ### 1. \u9886\u57DF\u9A71\u52A8\u539F\u5219
929
+ - \u9650\u754C\u4E0A\u4E0B\u6587\u662F\u9886\u57DF\u6A21\u578B\u7684\u77E5\u8BC6\u8BED\u5883\uFF0C\u62E5\u6709\u660E\u786E\u7684\u4E1A\u52A1\u8FB9\u754C
930
+ - \u6BCF\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u90FD\u5E94\u8BE5\u62E5\u6709\u7B26\u5408\u5176\u4E1A\u52A1\u80FD\u529B\u7684\u9886\u57DF\u77E5\u8BC6
931
+ - \u907F\u514D\u8DE8\u4E0A\u4E0B\u6587\u7684\u9886\u57DF\u6982\u5FF5\u51B2\u7A81
932
+
933
+ ### 2. \u4E1A\u52A1\u80FD\u529B\u5BFC\u5411\u539F\u5219
934
+ - \u9650\u754C\u4E0A\u4E0B\u6587\u662F\u4E1A\u52A1\u80FD\u529B\u7684\u7EB5\u5411\u5207\u5206\uFF0C\u800C\u975E\u6280\u672F\u529F\u80FD\u7684\u6A2A\u5411\u5206\u5C42
935
+ - \u6BCF\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u90FD\u5E94\u8BE5\u5177\u5907\u5171\u540C\u7684\u4E1A\u52A1\u76EE\u6807
936
+ - \u5BF9\u5916\u63D0\u4F9B\u5185\u805A\u7684\u4E1A\u52A1\u80FD\u529B\uFF0C\u5BF9\u5185\u7BA1\u7406\u76F8\u5173\u7684\u4E1A\u52A1\u89C4\u5219
937
+
938
+ ### 3. \u6280\u672F\u67B6\u6784\u539F\u5219
939
+ - \u670D\u52A1\u81EA\u6CBB\uFF1A\u6BCF\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u5E94\u8BE5\u80FD\u591F\u72EC\u7ACB\u90E8\u7F72\u548C\u8FD0\u884C
940
+ - \u9AD8\u5185\u805A\u4F4E\u8026\u5408
941
+ - \u63A5\u53E3\u7A33\u5B9A\u6027
942
+
943
+ ### 4. \u56E2\u961F\u7EC4\u7EC7\u539F\u5219
944
+ - \u4E00\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u7684\u6240\u6709\u670D\u52A1\u5951\u7EA6\u90FD\u5E94\u8BE5\u5F52\u5C5E\u4E8E\u540C\u4E00\u4E2A\u56E2\u961F
945
+ - \u56E2\u961F\u7684\u8D23\u4EFB\u8FB9\u754C\u5E94\u4E0E\u9650\u754C\u4E0A\u4E0B\u6587\u7684\u4E1A\u52A1\u80FD\u529B\u4FDD\u6301\u4E00\u81F4
946
+
947
+ ## \u6620\u5C04\u8FC7\u7A0B\uFF08\u5FC5\u987B\u4E25\u683C\u6309\u987A\u5E8F\u6267\u884C\uFF09
948
+
949
+ ### \u6B65\u9AA41\uFF1A\u5B50\u9886\u57DF\u6620\u5C04\u4E3A\u9650\u754C\u4E0A\u4E0B\u6587\uFF08\u521D\u59CB\u6620\u5C04\uFF09
950
+ \u6309\u7167\u4E00\u5BF9\u4E00\u7684\u5173\u7CFB\uFF0C\u5C06\u4E1A\u52A1\u67B6\u6784\u4E2D\u7684\u5B50\u9886\u57DF\u76F4\u63A5\u6620\u5C04\u4E3A\u9650\u754C\u4E0A\u4E0B\u6587\uFF1A
951
+ - **\u6838\u5FC3\u5B50\u9886\u57DF** \u2192 **\u6838\u5FC3\u80FD\u529B\u5C42**
952
+ - **\u652F\u6491\u5B50\u9886\u57DF** \u2192 **\u516C\u5171\u80FD\u529B\u5C42**
953
+ - **\u901A\u7528\u5B50\u9886\u57DF** \u2192 **\u516C\u5171\u80FD\u529B\u5C42**
954
+
955
+ ### \u6B65\u9AA42\uFF1A\u5F3A\u5236\u4F18\u5316\u8C03\u6574\u5206\u6790\uFF08\u5FC5\u987B\u6267\u884C\uFF09
956
+ \u8FD9\u662F**\u5F3A\u5236\u6027**\u6B65\u9AA4\uFF0C\u5FC5\u987B\u5BF9\u6BCF\u4E2A\u5B50\u9886\u57DF\u4ECE\u4EE5\u4E0B\u56DB\u4E2A\u7EF4\u5EA6\u8FDB\u884C\u5206\u6790\uFF1A
957
+
958
+ #### 2.1 \u9886\u57DF\u6A21\u578B\u77E5\u8BC6\u8BED\u5883\u51B2\u7A81\u5206\u6790
959
+ - \u6982\u5FF5\u91CD\u53E0\uFF1A\u540C\u4E00\u5B50\u9886\u57DF\u5185\u662F\u5426\u5B58\u5728\u8BED\u4E49\u76F8\u8FD1\u4F46\u4E1A\u52A1\u542B\u4E49\u4E0D\u540C\u7684\u6982\u5FF5
960
+ - \u804C\u8D23\u8FB9\u754C\uFF1A\u5B50\u9886\u57DF\u5185\u7684\u670D\u52A1\u5951\u7EA6\u662F\u5426\u670D\u52A1\u4E8E\u4E0D\u540C\u7684\u4E1A\u52A1\u76EE\u6807
961
+ - \u6570\u636E\u4E00\u81F4\u6027\uFF1A\u5B50\u9886\u57DF\u5185\u7684\u6570\u636E\u6A21\u578B\u662F\u5426\u5B58\u5728\u51B2\u7A81
962
+
963
+ #### 2.2 \u4E1A\u52A1\u80FD\u529B\u5185\u805A\u6027\u5206\u6790
964
+ - \u4E1A\u52A1\u76EE\u6807\u4E00\u81F4\u6027
965
+ - \u529F\u80FD\u76F8\u5173\u6027
966
+ - \u6570\u636E\u5171\u4EAB\u7A0B\u5EA6
967
+
968
+ #### 2.3 \u6280\u672F\u56E0\u7D20\u5F71\u54CD\u5206\u6790
969
+ - \u590D\u7528\u9700\u6C42
970
+ - \u53D8\u5316\u9891\u7387
971
+ - \u8D28\u91CF\u5C5E\u6027\u8981\u6C42
972
+ - \u6280\u672F\u6808\u5DEE\u5F02
973
+
974
+ #### 2.4 \u56E2\u961F\u7EC4\u7EC7\u56E0\u7D20\u5206\u6790
975
+ - \u56E2\u961F\u89C4\u6A21
976
+ - \u6280\u80FD\u5339\u914D
977
+ - \u4EA4\u4ED8\u5468\u671F
978
+
979
+ ### \u6B65\u9AA43\uFF1A\u9650\u754C\u4E0A\u4E0B\u6587\u91CD\u6784
980
+ \u57FA\u4E8E\u6B65\u9AA42\u7684\u5206\u6790\u7ED3\u679C\u8FDB\u884C\u91CD\u6784\uFF1A
981
+ - **\u4E0A\u4E0B\u6587\u5206\u79BB**\uFF1A\u6309\u4E1A\u52A1\u76EE\u6807\u3001\u6280\u672F\u7279\u6027\u3001\u56E2\u961F\u80FD\u529B\u5206\u79BB
982
+ - **\u4E0A\u4E0B\u6587\u5408\u5E76**\uFF1A\u6309\u4E1A\u52A1\u76EE\u6807\u3001\u6570\u636E\u4F9D\u8D56\u3001\u529F\u80FD\u8026\u5408\u5408\u5E76
983
+ - **\u4E0A\u4E0B\u6587\u91CD\u7EC4**\uFF1A\u6309\u4E1A\u52A1\u4EF7\u503C\u3001\u6280\u672F\u590D\u6742\u5EA6\u3001\u56E2\u961F\u7EC4\u7EC7\u91CD\u7EC4
984
+
985
+ ### \u6B65\u9AA44\uFF1A\u9A8C\u8BC1\u9650\u754C\u4E0A\u4E0B\u6587\u7684\u5408\u7406\u6027
986
+ - \u81EA\u6CBB\u539F\u5219\u9A8C\u8BC1
987
+ - \u5965\u5361\u59C6\u5243\u5200\u539F\u5219\u9A8C\u8BC1
988
+ - \u6E05\u6670\u8FB9\u754C\u539F\u5219\u9A8C\u8BC1
989
+ - \u6700\u5C0F\u60CA\u8BB6\u6CD5\u5219\u9A8C\u8BC1
990
+
991
+ ## \u4E0A\u4E0B\u6587\u6620\u5C04\u5173\u7CFB\u6A21\u5F0F
992
+
993
+ 1. **\u9632\u8150\u5C42 (ACL)**\uFF1A\u4E0B\u6E38\u9694\u79BB\u4E0A\u6E38\u53D8\u5316
994
+ 2. **\u5F00\u653E\u4E3B\u673A\u670D\u52A1 (OHS)**\uFF1A\u4E0A\u6E38\u63D0\u4F9B\u7A33\u5B9A\u670D\u52A1\u63A5\u53E3
995
+ 3. **\u9075\u5949\u8005 (Conformist)**\uFF1A\u4E0B\u6E38\u5B8C\u5168\u9075\u5FAA\u4E0A\u6E38\u6A21\u578B
996
+ 4. **\u5BA2\u6237-\u4F9B\u5E94\u5546 (Customer-Supplier)**\uFF1A\u660E\u786E\u4F9D\u8D56\u5173\u7CFB
997
+ 5. **\u5171\u4EAB\u5185\u6838 (Shared Kernel)**\uFF1A\u5171\u4EAB\u6838\u5FC3\u6982\u5FF5\u548C\u6A21\u578B
998
+
999
+ ## \u5E94\u7528\u67B6\u6784\u56FE\u7ED8\u5236\u89C4\u8303
1000
+
1001
+ \u56DB\u5C42\u67B6\u6784\uFF1A\u5BA2\u6237\u7AEF\u5C42 \u2192 \u8FB9\u7F18\u5C42 \u2192 \u6838\u5FC3\u80FD\u529B\u5C42 \u2192 \u516C\u5171\u80FD\u529B\u5C42
1002
+
1003
+ **Mermaid 8.8.0 \u8BED\u6CD5\u8981\u6C42**\uFF1A
1004
+ - subgraph \u540D\u79F0\u4F7F\u7528\u82F1\u6587\u53CC\u5F15\u53F7
1005
+ - \u8282\u70B9 ID \u4F7F\u7528\u82F1\u6587\u9A7C\u5CF0\u547D\u540D
1006
+ - \u8FB9\u6807\u7B7E\u4F7F\u7528\u82F1\u6587\u5F15\u53F7\u5305\u88F9
1007
+ - \u683C\u5F0F\uFF1A\`NodeA -->|"\u5173\u7CFB\u8BF4\u660E"| NodeB\`
1008
+
1009
+ ## \u8F93\u51FA\u6587\u6863\u683C\u5F0F\uFF08\u9636\u6BB5\u4E8C\uFF09
1010
+
1011
+ \u5199\u5165 **\`docs/sparrow/architecture/application.md\`**\uFF1A
1012
+
1013
+ \`\`\`markdown
1014
+ # \u5E94\u7528\u67B6\u6784\u5B9A\u4E49\u6587\u6863
1015
+
1016
+ ## 1. \u5E94\u7528\u67B6\u6784\u56FE
1017
+ [Mermaid \u56DB\u5C42\u67B6\u6784\u56FE]
1018
+
1019
+ ## 2. \u9650\u754C\u4E0A\u4E0B\u6587\u603B\u89C8
1020
+ | \u9650\u754C\u4E0A\u4E0B\u6587 | \u627F\u8F7D\u7684\u4E3B\u8981\u5B50\u57DF | \u5B9E\u73B0\u5EFA\u8BAE |
1021
+ |-----------|---------------|---------|
1022
+ | \u4E0A\u4E0B\u6587\u540D\u79F0 | \u5B50\u57DF\u7C7B\u578B: \u5B50\u57DF\u540D\u79F0 | \u5FAE\u670D\u52A1/\u6A21\u5757/SaaS |
1023
+
1024
+ ## 3. \u4E0A\u4E0B\u6587\u6620\u5C04\u56FE
1025
+ [Mermaid \u4E0A\u4E0B\u6587\u6620\u5C04\u56FE]
1026
+
1027
+ ## 4. \u5173\u7CFB\u5B9A\u4E49\u4E0E\u96C6\u6210\u7B56\u7565
1028
+ | \u4E0A\u6E38\u4E0A\u4E0B\u6587 | \u4E0B\u6E38\u4E0A\u4E0B\u6587 | \u5173\u7CFB\u6A21\u5F0F | \u7406\u7531\u4E0E\u8BF4\u660E |
1029
+
1030
+ ## 5. \u9650\u754C\u4E0A\u4E0B\u6587\u8BE6\u7EC6\u8BBE\u8BA1
1031
+ \u4E3A\u6BCF\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u63D0\u4F9B\uFF1A
1032
+ - \u9650\u754C\u4E0A\u4E0B\u6587\u540D\u79F0\uFF08\u4E2D\u6587 + \u82F1\u6587\u9A7C\u5CF0\u547D\u540D\uFF09
1033
+ - \u5173\u8054\u5B50\u57DF
1034
+ - \u6838\u5FC3\u804C\u8D23
1035
+ - \u6838\u5FC3\u4E1A\u52A1\u89C4\u5219/\u4E0D\u53D8\u91CF
1036
+ - \u5173\u952E\u4E1A\u52A1\u6982\u5FF5
1037
+ - \u7EDF\u4E00\u8BED\u8A00\u8868
1038
+ - \u5BF9\u5916\u66B4\u9732\u7684\u5173\u952E\u80FD\u529B
1039
+ - \u6280\u672F\u5B9E\u73B0\u5EFA\u8BAE
1040
+ - \u670D\u52A1\u5951\u7EA6\uFF08\u670D\u52A1ID: \u670D\u52A1\u540D\u79F0\uFF09
1041
+ \`\`\`
1042
+
1043
+ ## \u8D28\u91CF\u68C0\u67E5\u6E05\u5355
1044
+
1045
+ - [ ] \u6BCF\u4E2A\u5B50\u9886\u57DF\u90FD\u6B63\u786E\u6620\u5C04\u4E3A\u9650\u754C\u4E0A\u4E0B\u6587
1046
+ - [ ] \u6838\u5FC3\u5B50\u9886\u57DF\u6620\u5C04\u5230\u6838\u5FC3\u80FD\u529B\u5C42
1047
+ - [ ] \u652F\u6491\u548C\u901A\u7528\u5B50\u9886\u57DF\u6620\u5C04\u5230\u516C\u5171\u80FD\u529B\u5C42
1048
+ - [ ] \u9650\u754C\u4E0A\u4E0B\u6587\u4E4B\u95F4\u7684\u4F9D\u8D56\u5173\u7CFB\u6E05\u6670\u660E\u786E
1049
+ - [ ] \u4E0A\u4E0B\u6587\u6620\u5C04\u5173\u7CFB\u6A21\u5F0F\u9009\u62E9\u5408\u7406
1050
+ - [ ] \u6BCF\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u90FD\u6709\u660E\u786E\u7684\u804C\u8D23\u8FB9\u754C
1051
+ - [ ] \u670D\u52A1\u5951\u7EA6\u5206\u914D\u5408\u7406\uFF0C\u65E0\u91CD\u590D\u6216\u9057\u6F0F
1052
+
1053
+ ## \u5F3A\u5236\u6027\u4F18\u5316\u68C0\u67E5\u6E05\u5355
1054
+ - [ ] \u8BC6\u522B\u5E76\u89E3\u51B3\u4E86\u6982\u5FF5\u91CD\u53E0\u95EE\u9898
1055
+ - [ ] \u660E\u786E\u4E86\u804C\u8D23\u8FB9\u754C
1056
+ - [ ] \u9A8C\u8BC1\u4E86\u4E1A\u52A1\u76EE\u6807\u4E00\u81F4\u6027
1057
+ - [ ] \u8BC4\u4F30\u4E86\u529F\u80FD\u76F8\u5173\u6027
1058
+ - [ ] \u8BC6\u522B\u4E86\u590D\u7528\u9700\u6C42
1059
+ - [ ] \u6267\u884C\u4E86\u4E0A\u4E0B\u6587\u5206\u79BB/\u5408\u5E76/\u91CD\u7EC4
1060
+ - [ ] \u9A8C\u8BC1\u4E86\u5408\u7406\u6027
1061
+
1062
+ ## \u9650\u754C\u4E0A\u4E0B\u6587\u76EE\u5F55\u521B\u5EFA
1063
+
1064
+ \u5B8C\u6210\u5E94\u7528\u67B6\u6784\u5B9A\u4E49\u540E\uFF0C\u9700\u8981\u4E3A\u6BCF\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u521B\u5EFA\u4E13\u95E8\u7684\u76EE\u5F55\uFF1A
1065
+
1066
+ 1. \u4ECE application.md \u4E2D\u63D0\u53D6\u6240\u6709\u9650\u754C\u4E0A\u4E0B\u6587\u7684\u82F1\u6587 slug
1067
+ 2. \u5728 \`docs/sparrow/design/{english-slug}/\` \u4E0B\u521B\u5EFA\u76EE\u5F55
1068
+ 3. \u5C06 \`requirement/spec.md\` \u4E2D\u7684\u4E1A\u52A1\u670D\u52A1\u6309\u6620\u5C04\u5173\u7CFB\u5207\u7247\uFF0C\u5199\u5165\u5BF9\u5E94\u7684 \`design/{english-slug}/spec.md\`
1069
+
1070
+ ## \u5B8C\u6210\u540E\u7684\u4E0B\u4E00\u6B65
1071
+
1072
+ \u2705 \u5B8C\u6210 sparrow-arch \u540E\uFF0C\u8BF7\u6267\u884C **sparrow-design @{\u9650\u754C\u4E0A\u4E0B\u6587slug}**\uFF08\u56E2\u961F\u7EA7\uFF09\u2014\u2014 \u4E3A\u5F53\u524D\u9009\u62E9\u7684\u9650\u754C\u4E0A\u4E0B\u6587\u5B9A\u4E49 API \u5951\u7EA6\u548C\u6280\u672F\u6808\u3002
1073
+ `;
1074
+ function register2() {
1075
+ registerSkillTemplate("sparrow-arch", () => ARCH_BODY);
1076
+ }
1077
+
1078
+ // src/skills/design.ts
1079
+ var DESIGN_BODY = `# Sparrow Design \u2014 API \u5951\u7EA6\u4E0E\u6280\u672F\u9009\u578B
1080
+
1081
+ ## \u6267\u884C\u987A\u5E8F\u68C0\u67E5
1082
+
1083
+ \u5728\u6267\u884C\u4E4B\u524D\uFF0C\u8BF7\u68C0\u67E5\u5F53\u524D\u9636\u6BB5\u662F\u5426\u5408\u9002\uFF1A
1084
+
1085
+ \`\`\`
1086
+ \u5F53\u524D\u6B65\u9AA4\uFF1Asparrow-design\uFF08\u7B2C 3 \u6B65 / \u5171 6 \u6B65\uFF09
1087
+ \u6240\u5C5E\u5C42\u7EA7\uFF1A\u56E2\u961F\u7EA7\uFF08team-level\uFF09\uFF0C\u9488\u5BF9\u7279\u5B9A\u9650\u754C\u4E0A\u4E0B\u6587
1088
+ \u524D\u7F6E\u6761\u4EF6\uFF1A
1089
+ 1. docs/sparrow/architecture/application.md \u5FC5\u987B\u5B58\u5728
1090
+ 2. docs/sparrow/design/{slug}/spec.md \u5FC5\u987B\u5B58\u5728
1091
+ \u4E0B\u4E00\u6B65\u9AA4\uFF1Asparrow-model @{slug}\uFF08\u56E2\u961F\u7EA7\uFF09
1092
+ \`\`\`
1093
+
1094
+ **\u524D\u7F6E\u6761\u4EF6\u68C0\u67E5**\uFF1A
1095
+ - \u5982\u679C \`docs/sparrow/architecture/application.md\` \u4E0D\u5B58\u5728\uFF0C\u8BF7\u63D0\u793A\u7528\u6237\u5148\u6267\u884C **sparrow-arch**
1096
+ - \u5982\u679C \`docs/sparrow/design/{slug}/spec.md\` \u4E0D\u5B58\u5728\uFF0C\u8BF7\u63D0\u793A\u7528\u6237\u5148\u6267\u884C **sparrow-arch**\uFF08\u5B83\u4F1A\u521B\u5EFA\u5404\u9650\u754C\u4E0A\u4E0B\u6587\u7684 spec \u5207\u7247\uFF09
1097
+ - \u5982\u679C\u7528\u6237\u672A\u6307\u5B9A\u9650\u754C\u4E0A\u4E0B\u6587\uFF0C\u8BF7\u5217\u51FA\u53EF\u7528\u7684\u9650\u754C\u4E0A\u4E0B\u6587\u8BA9\u7528\u6237\u9009\u62E9
1098
+ - \u5982\u679C\u76EE\u6807\u6587\u4EF6\u5DF2\u5B58\u5728\uFF0C\u8BF7\u53C2\u8003\u4E0B\u65B9"\u8F93\u51FA\u6587\u4EF6\u5B58\u5728\u6027\u68C0\u67E5"\u7AE0\u8282\u5904\u7406
1099
+
1100
+ ---
1101
+
1102
+ ## \u{1F6D1} \u8F93\u51FA\u6587\u4EF6\u5B58\u5728\u6027\u68C0\u67E5\uFF08\u5FC5\u987B\u5728\u751F\u6210\u524D\u6267\u884C\uFF09
1103
+
1104
+ \u5728\u5F00\u59CB\u751F\u6210\u5185\u5BB9\u4E4B\u524D\uFF0C\u8BF7\u68C0\u67E5\u4EE5\u4E0B\u8F93\u51FA\u6587\u4EF6\u662F\u5426\u5DF2\u7ECF\u5B58\u5728\uFF1A
1105
+
1106
+ - \`docs/sparrow/design/{slug}/api.md\`
1107
+ - \`docs/sparrow/design/{slug}/tech.md\`
1108
+
1109
+ \u5982\u679C\u4EFB\u4E00\u6587\u4EF6\u5DF2\u5B58\u5728\uFF0C\u8BF7**\u8BA9\u7528\u6237\u8FDB\u884C\u4E00\u6B21\u9009\u62E9**\uFF08\u8BE5\u9009\u62E9\u5C06\u5E94\u7528\u4E8E\u6240\u6709\u5DF2\u5B58\u5728\u7684\u6587\u4EF6\uFF09\uFF1A
1110
+
1111
+ - **\u8DF3\u8FC7 (skip)**\uFF1A\u4FDD\u7559\u5DF2\u6709\u6587\u4EF6\uFF0C\u4E0D\u6267\u884C\u4EFB\u4F55\u751F\u6210\u64CD\u4F5C\uFF0C\u505C\u6B62\u6267\u884C
1112
+ - **\u8986\u76D6 (overwrite)**\uFF1A\u5220\u9664\u5DF2\u6709\u6587\u4EF6\uFF0C\u91CD\u65B0\u751F\u6210\u5168\u65B0\u7684\u5185\u5BB9
1113
+ - **\u66F4\u65B0 (update)**\uFF1A\u5728\u5DF2\u6709\u6587\u4EF6\u57FA\u7840\u4E0A\u8FDB\u884C\u4FEE\u6539\u548C\u5B8C\u5584
1114
+
1115
+ > \u26A0\uFE0F \u4E00\u6B21\u547D\u4EE4\u53EA\u786E\u8BA4\u4E00\u6B21\uFF0C\u7528\u6237\u7684\u9009\u62E9\u5E94\u7528\u4E8E\u6240\u6709\u8F93\u51FA\u6587\u4EF6\u3002
1116
+
1117
+ ---
1118
+
1119
+ ## \u{1F4CB} project.md \u66F4\u65B0
1120
+
1121
+ \u5B8C\u6210\u8F93\u51FA\u540E\uFF0C**\u5FC5\u987B**\u66F4\u65B0 \`docs/sparrow/project.md\`\uFF1A
1122
+
1123
+ 1. \u5982\u679C \`project.md\` \u4E0D\u5B58\u5728\uFF0C\u6839\u636E\u5F53\u524D\u9879\u76EE\u4FE1\u606F\u521B\u5EFA\u5B83
1124
+ 2. \u5728"\u9650\u754C\u4E0A\u4E0B\u6587\u8BBE\u8BA1"\u90E8\u5206\uFF0C\u627E\u5230\u5F53\u524D \`{slug}\` \u7684\u5B50\u7AE0\u8282
1125
+ 3. \u66F4\u65B0 \`api.md\` \u548C \`tech.md\` \u7684\u72B6\u6001\u4ECE \`_\u5F85\u751F\u6210_\` \u6539\u4E3A \`_v{version}_\`
1126
+ 4. \u786E\u4FDD project.md \u7684"API \u76EE\u5F55"\u90E8\u5206\u5F15\u7528\u4E86 \`docs/sparrow/api.md\`\uFF1A
1127
+ \`\`\`markdown
1128
+ ### 5. API \u76EE\u5F55
1129
+ - [API \u603B\u76EE\u5F55](./api.md) \u2014 \u6240\u6709\u9650\u754C\u4E0A\u4E0B\u6587\u7684\u516C\u5F00 API \u6C47\u603B
1130
+ \`\`\`
1131
+ 5. \u66F4\u65B0\u6587\u4EF6\u5934\u90E8\u7684"\u6700\u540E\u66F4\u65B0"\u65F6\u95F4\u6233
1132
+
1133
+ **project.md \u8DEF\u5F84**: \`docs/sparrow/project.md\`
1134
+
1135
+ ---
1136
+
1137
+ ## \u{1F4CC} \u7248\u672C\u5143\u6570\u636E\u7BA1\u7406
1138
+
1139
+ \u6240\u6709\u8F93\u51FA\u7684\u6587\u6863\u6587\u4EF6**\u5FC5\u987B\u5728\u6587\u4EF6\u5F00\u5934**\u5305\u542B\u7248\u672C\u5143\u6570\u636E\u5757\uFF1A
1140
+
1141
+ \`\`\`markdown
1142
+ <!--
1143
+ version: v1.0
1144
+ last-updated: {ISO_8601_TIMESTAMP}
1145
+ generated-by: sparrow-design
1146
+ sparrow-version: {\u4ECE .sparrow/sparrow.json \u8BFB\u53D6}
1147
+ -->
1148
+ \`\`\`
1149
+
1150
+ **\u7248\u672C\u89C4\u5219**:
1151
+ - **\u65B0\u6587\u6863**: \u4F7F\u7528 \`v1.0\`
1152
+ - **\u66F4\u65B0\u5DF2\u6709\u6587\u6863**: \u8BFB\u53D6\u73B0\u6709\u7248\u672C\u53F7\uFF0C\u9012\u589E\u6B21\u7248\u672C\u53F7\uFF08\`v1.0\` \u2192 \`v1.1\`\uFF09
1153
+ - **\u91CD\u5927\u91CD\u5199**: \u9012\u589E\u4E3B\u7248\u672C\u53F7\uFF08\`v1.x\` \u2192 \`v2.0\`\uFF09
1154
+ - \u6BCF\u6B21\u4FEE\u6539\u90FD**\u5FC5\u987B\u53D8\u66F4**\u7248\u672C\u53F7
1155
+
1156
+ **\u64CD\u4F5C\u6B65\u9AA4**:
1157
+ 1. \u68C0\u67E5\u76EE\u6807\u6587\u4EF6\u662F\u5426\u5DF2\u5B58\u5728
1158
+ 2. \u5982\u679C\u5B58\u5728\uFF0C\u8BFB\u53D6\u6587\u4EF6\u5F00\u5934 \`<!--\` \u6CE8\u91CA\u5757\u4E2D\u7684 \`version:\` \u5B57\u6BB5\u5E76\u9012\u589E
1159
+ 3. \u5728\u6587\u4EF6\u5F00\u5934\u6DFB\u52A0\u6216\u66F4\u65B0\u7248\u672C\u5143\u6570\u636E\u5757
1160
+ 4. \u7EE7\u7EED\u751F\u6210\u6587\u6863\u6B63\u6587
1161
+
1162
+ ---
1163
+
1164
+ ## \u89D2\u8272\u5B9A\u4E49
1165
+
1166
+ \u4F60\u662F\u4E00\u540D**\u5E94\u7528\u7CFB\u7EDF\u67B6\u6784\u5E08\u4E0E\u6280\u672F\u8D1F\u8D23\u4EBA**\uFF0C\u8D1F\u8D23\u4E3A\u5F53\u524D\u9650\u754C\u4E0A\u4E0B\u6587\u751F\u6210\uFF1A
1167
+ 1. **\u670D\u52A1\u5951\u7EA6\u6587\u6863\uFF08api.md\uFF09**\uFF1A\u5305\u542B\u8DE8\u4E0A\u4E0B\u6587\u534F\u4F5C\u5E8F\u5217\u56FE\u3001API \u5B9A\u4E49\u548C\u7EC4\u4EF6\u56FE
1168
+ 2. **\u6280\u672F\u9009\u578B\u6587\u6863\uFF08tech.md\uFF09**\uFF1A\u6280\u672F\u6808\u9009\u62E9\u4E0E\u5B9E\u73B0\u7EA6\u675F
1169
+
1170
+ ## \u6838\u5FC3\u539F\u5219\uFF1A\u805A\u7126\u8DE8\u4E0A\u4E0B\u6587\u534F\u4F5C
1171
+
1172
+ **\u672C\u9636\u6BB5\u7684\u5173\u6CE8\u70B9\u662F\u9650\u754C\u4E0A\u4E0B\u6587\u4E4B\u95F4\u7684\u5173\u7CFB\uFF0C\u800C\u975E\u4E0A\u4E0B\u6587\u5185\u90E8\u7684\u5B9E\u73B0\u7EC6\u8282\u3002**
1173
+
1174
+ - \u2705 \u5E8F\u5217\u56FE\u4EC5\u4F53\u73B0**\u9650\u754C\u4E0A\u4E0B\u6587\u4E4B\u95F4**\u4EE5\u53CA**\u9650\u754C\u4E0A\u4E0B\u6587\u4E0E\u5916\u90E8\u7CFB\u7EDF\uFF08\u7B2C\u4E09\u65B9\uFF09\u4E4B\u95F4**\u7684\u534F\u4F5C
1175
+ - \u2705 API \u5B9A\u4E49\u662F\u5F53\u524D\u9650\u754C\u4E0A\u4E0B\u6587**\u5BF9\u5916\u516C\u5F00**\u7684\u670D\u52A1\u5951\u7EA6
1176
+ - \u2705 \u8DE8\u4E0A\u4E0B\u6587\u7684\u6D88\u606F\u4EA4\u4E92\uFF08\u540C\u6B65\u8C03\u7528 + \u5F02\u6B65\u4E8B\u4EF6\uFF09
1177
+ - \u274C **\u4E0D\u8981**\u6D89\u53CA\u9650\u754C\u4E0A\u4E0B\u6587\u5185\u90E8\u7684\u5B9E\u73B0\uFF08\u5982\u9886\u57DF\u670D\u52A1\u3001\u805A\u5408\u3001\u6570\u636E\u5E93\u64CD\u4F5C\u7B49\uFF09
1178
+ - \u274C **\u4E0D\u8981**\u8BBE\u8BA1\u5185\u90E8\u67B6\u6784\u7684\u5206\u5C42\u7EC6\u8282
1179
+
1180
+ > \u9650\u754C\u4E0A\u4E0B\u6587\u5185\u90E8\u7684\u9886\u57DF\u5EFA\u6A21\u7531\u540E\u7EED\u7684 **sparrow-model** \u9636\u6BB5\u5B8C\u6210\u3002API \u5B9A\u4E49\u5C06\u4F5C\u4E3A model \u9636\u6BB5\u52A8\u6001\u9886\u57DF\u6A21\u578B\u4EFB\u52A1\u6811\u7684\u7B2C\u4E00\u7EA7\u5165\u53E3\u3002
1181
+
1182
+ ## \u6838\u5FC3\u539F\u5219\uFF1A\u4E00\u4E2A\u4E1A\u52A1\u670D\u52A1 = \u4E00\u4E2A API
1183
+
1184
+ **\u5728 sequence diagram \u4E2D\uFF0Cactor \u5411\u5F53\u524D\u9650\u754C\u4E0A\u4E0B\u6587\u5E94\u53EA\u53D1\u8D77\u4E00\u6B21\u8BF7\u6C42\u3002**
1185
+
1186
+ \u8FD9\u662F\u8FDE\u63A5 explore \u4E0E design \u7684\u5173\u952E\u7EA6\u675F\uFF1A
1187
+ - explore \u9636\u6BB5\u8BC6\u522B\u7684\u6BCF\u4E2A**\u4E1A\u52A1\u670D\u52A1**\uFF0C\u5BF9\u5E94 design \u9636\u6BB5 actor \u5411\u5F53\u524D BC \u53D1\u8D77\u7684**\u4E00\u6B21\u8BF7\u6C42**
1188
+ - \u8FD9\u4E00\u8BF7\u6C42\u9A71\u52A8\u51FA\u4E00\u4E2A**\u5E8F\u5217\u56FE**\uFF0C\u8FDB\u800C\u63A8\u5BFC\u51FA\u4E00\u4E2A **API \u5B9A\u4E49**
1189
+ - \u56E0\u6B64\uFF1A**\u4E00\u4E2A\u4E1A\u52A1\u670D\u52A1 \u2192 \u4E00\u4E2A\u5E8F\u5217\u56FE \u2192 \u4E00\u4E2A API**
1190
+
1191
+ ### \u5E8F\u5217\u56FE\u7ED8\u5236\u7EA6\u675F
1192
+
1193
+ 1. \u6BCF\u4E2A\u5E8F\u5217\u56FE\u4E2D\uFF0Cactor\uFF08\u53C2\u4E0E\u8005 / \u5176\u4ED6 BC / \u5916\u90E8\u7CFB\u7EDF\uFF09\u5411\u5F53\u524D\u9650\u754C\u4E0A\u4E0B\u6587**\u53EA\u53D1\u8D77\u4E00\u6B21\u8BF7\u6C42**
1194
+ 2. \u5F53\u524D BC \u6536\u5230\u8BF7\u6C42\u540E\uFF0C\u53EF\u4EE5\u9009\u62E9\u6027\u5730\u8C03\u7528\u5176\u4ED6 BC \u6216\u5916\u90E8\u7CFB\u7EDF
1195
+ 3. \u4E0D\u8981\u5728\u4E00\u4E2A\u5E8F\u5217\u56FE\u4E2D\u7ED8\u5236\u591A\u4E2A\u72EC\u7ACB\u7684\u4E1A\u52A1\u670D\u52A1
1196
+ 4. \u5982\u679C\u5F53\u524D BC \u5BF9\u5916\u63D0\u4F9B\u4E86 N \u4E2A\u4E1A\u52A1\u670D\u52A1\uFF08\u6765\u81EA spec.md\uFF09\uFF0C\u5219\u5E94\u7ED8\u5236 N \u4E2A\u72EC\u7ACB\u7684\u5E8F\u5217\u56FE\uFF0C\u5B9A\u4E49 N \u4E2A API
1197
+
1198
+ ### \u81EA\u68C0\u6E05\u5355
1199
+
1200
+ - [ ] \u5F53\u524D BC \u7684 API \u6570\u91CF\u662F\u5426\u7B49\u4E8E spec.md \u4E2D\u5206\u914D\u7ED9\u5F53\u524D BC \u7684\u4E1A\u52A1\u670D\u52A1\u6570\u91CF\uFF1F
1201
+ - [ ] \u6BCF\u4E2A\u5E8F\u5217\u56FE\u4E2D\uFF0C\u5411\u5F53\u524D BC \u53D1\u8D77\u7684\u8BF7\u6C42\u662F\u5426\u53EA\u6709**\u4E00\u6B21**\uFF1F
1202
+ - [ ] \u5982\u53D1\u73B0 API \u6570\u91CF\u4E0E\u4E1A\u52A1\u670D\u52A1\u6570\u91CF\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u65B0\u68C0\u67E5\u5E8F\u5217\u56FE\u662F\u5426\u5408\u5E76\u4E86\u591A\u4E2A\u72EC\u7ACB\u7684\u4E1A\u52A1\u670D\u52A1\u3002
1203
+
1204
+ ## \u8F93\u5165\u6587\u6863\u8981\u6C42
1205
+
1206
+ ### \u5FC5\u9700\u6587\u6863
1207
+ 1. **\u4E1A\u52A1\u670D\u52A1\u5217\u8868\u6587\u6863**\uFF1A\`docs/sparrow/design/{slug}/spec.md\`\uFF08\u5F53\u524D\u9650\u754C\u4E0A\u4E0B\u6587\u7684\u5207\u7247\u9700\u6C42\uFF09
1208
+ 2. **\u5E94\u7528\u67B6\u6784\u5B9A\u4E49\u6587\u6863**\uFF1A\`docs/sparrow/architecture/application.md\`
1209
+ 3. **\u67B6\u6784\u56FE\u4E2D\u7684\u6280\u672F\u5B9E\u73B0\u5EFA\u8BAE**\uFF08\u6765\u81EA application.md \u4E2D\u5BF9\u5F53\u524D\u4E0A\u4E0B\u6587\u7684\u63CF\u8FF0\uFF09
1210
+
1211
+ ## \u6280\u672F\u9009\u578B\u4EA4\u4E92\u6D41\u7A0B
1212
+
1213
+ \u5728\u6267\u884C sparrow-design \u65F6\uFF0C\u4F60\u9700\u8981\u5F15\u5BFC\u7528\u6237\u8FDB\u884C\u4EE5\u4E0B\u9009\u62E9\uFF1A
1214
+
1215
+ ### \u7B2C\u4E00\u6B65\uFF1A\u9009\u62E9\u540E\u7AEF\u5B9E\u73B0\u8BED\u8A00
1216
+ \u8BF7\u7528\u6237\u4ECE\u4EE5\u4E0B\u9009\u9879\u4E2D\u9009\u62E9\uFF1A
1217
+ 1. **Java** (Spring Boot 3.x + Maven)
1218
+ 2. **Node.js** (TypeScript + Express/NestJS)
1219
+ 3. **Python** (FastAPI/Django + uv)
1220
+ 4. **Go** (\u6807\u51C6\u5E93 net/http \u6216 chi)
1221
+ 5. **Rust** (Axum + SQLx)
1222
+ 6. **C++** (C++17/20 + CMake + drogon/pistache)
1223
+
1224
+ ### \u7B2C\u4E8C\u6B65\uFF1A\u9009\u62E9\u5177\u4F53\u6280\u672F\u6808\u65B9\u6848
1225
+ \u6839\u636E\u7528\u6237\u9009\u62E9\u7684\u8BED\u8A00\uFF0C\u63D0\u4F9B\u8BE5\u8BED\u8A00\u4E0B\u7684\u82E5\u5E72\u5957\u5907\u9009\u6280\u672F\u6808\uFF08\u5305\u542B\u6846\u67B6\u3001\u6570\u636E\u5E93\u3001\u6D88\u606F\u961F\u5217\u3001\u7F13\u5B58\u7B49\uFF09\uFF0C\u8BA9\u7528\u6237\u9009\u62E9\u3002
1226
+
1227
+ ### \u7B2C\u4E09\u6B65\uFF1A\u5199\u5165 tech.md
1228
+ \u5C06\u7528\u6237\u9009\u5B9A\u7684\u65B9\u6848\u5199\u5165 \`docs/sparrow/design/{slug}/tech.md\`
1229
+
1230
+ ## tech.md \u7ED3\u6784
1231
+
1232
+ \u5199\u5165 **\`docs/sparrow/design/{slug}/tech.md\`**\uFF1A
1233
+
1234
+ \`\`\`markdown
1235
+ # \u6280\u672F\u9009\u578B \u2014 {\u9650\u754C\u4E0A\u4E0B\u6587\u4E2D\u6587\u540D} ({english-slug})
1236
+
1237
+ ## 1. \u6982\u8FF0\u4E0E\u9009\u578B\u7ED3\u8BBA
1238
+ - **\u9009\u5B9A\u65B9\u6848**: {\u65B9\u6848\u6807\u9898}
1239
+ - **\u7ED3\u8BBA\u6458\u8981**: {\u4E3A\u4EC0\u4E48\u8BE5\u65B9\u6848\u9002\u914D\u672C\u4E0A\u4E0B\u6587}
1240
+
1241
+ ## 2. \u4E0E\u5E94\u7528\u67B6\u6784\u7684\u5BF9\u5E94\u5173\u7CFB
1242
+ - **\u6280\u672F\u5B9E\u73B0\u5EFA\u8BAE\uFF08\u6458\u5F55\uFF09**: {\u6765\u81EA application.md}
1243
+ - **\u5BF9\u7B56**: {\u9009\u578B\u5982\u4F55\u843D\u5B9E\u4E0A\u8FF0\u5EFA\u8BAE}
1244
+
1245
+ ## 3. \u9009\u5B9A\u6280\u672F\u6808\u8BE6\u8FF0
1246
+ | \u5C42\u6B21 | \u9009\u578B | \u8BF4\u660E |
1247
+ |------|------|------|
1248
+ | \u8FD0\u884C\u65F6 / \u8BED\u8A00 | | |
1249
+ | \u5E94\u7528\u6846\u67B6 | | |
1250
+ | API \u5C42 | | |
1251
+ | \u4E3B\u8981\u4F9D\u8D56 | | |
1252
+
1253
+ ## 4. API \u4E0E\u96C6\u6210
1254
+ - **\u5BF9\u5916\u5951\u7EA6**: \u5BF9\u9F50 api.md
1255
+ - **\u8BA4\u8BC1\u4E0E\u6388\u6743**:
1256
+ - **\u7B2C\u4E09\u65B9\u4E0E\u4E0A\u6E38\u4E0A\u4E0B\u6587**:
1257
+
1258
+ ## 5. \u6570\u636E\u4E0E\u6301\u4E45\u5316
1259
+ - **\u5B58\u50A8**:
1260
+ - **\u4E8B\u52A1\u4E0E\u4E00\u81F4\u6027**:
1261
+ - **\u7F13\u5B58\uFF08\u82E5\u9002\u7528\uFF09**:
1262
+
1263
+ ## 6. \u6A2A\u5207\u80FD\u529B
1264
+ - **\u53EF\u89C2\u6D4B\u6027**:
1265
+ - **\u914D\u7F6E**:
1266
+ - **\u5B89\u5168**:
1267
+
1268
+ ## 7. \u6784\u5EFA\u3001\u6D4B\u8BD5\u4E0E\u90E8\u7F72
1269
+ - **\u6784\u5EFA**:
1270
+ - **\u6D4B\u8BD5**:
1271
+ - **\u90E8\u7F72/\u8FD0\u884C**:
1272
+ - **\u6A21\u5757\u8FB9\u754C**: code/{slug}/ \u5355\u6A21\u5757\uFF0CDDD \u56DB\u5C42\u4E3A\u5305/\u76EE\u5F55\u5212\u5206
1273
+
1274
+ ## 8. \u98CE\u9669\u4E0E\u5F85\u51B3\u4E8B\u9879
1275
+ \`\`\`
1276
+
1277
+ ---
1278
+
1279
+ ## \u670D\u52A1\u5951\u7EA6\u751F\u6210\u6B65\u9AA4
1280
+
1281
+ ### \u6B65\u9AA41: \u5206\u6790\u4E1A\u52A1\u670D\u52A1\u5206\u914D
1282
+ 1. \u4ECE\u5F53\u524D\u9650\u754C\u4E0A\u4E0B\u6587\u7684 spec.md \u4E2D\u63D0\u53D6\u4E1A\u52A1\u670D\u52A1\u5217\u8868
1283
+ 2. \u786E\u5B9A\u670D\u52A1\u5951\u7EA6\u7684\u8C03\u7528\u65B9\u5F0F (HTTP/RPC/Event)
1284
+ 3. \u533A\u5206\u54EA\u4E9B\u662F\u5F53\u524D BC \u5BF9\u5916\u63D0\u4F9B\u7684\u670D\u52A1\uFF0C\u54EA\u4E9B\u4F9D\u8D56\u5176\u4ED6 BC
1285
+
1286
+ ### \u6B65\u9AA42: \u5206\u6790\u4E0A\u4E0B\u6587\u6620\u5C04\u5173\u7CFB
1287
+ 1. \u4ECE application.md \u4E2D\u8BC6\u522B\u5F53\u524D\u4E0A\u4E0B\u6587\u4E0E\u5176\u4ED6\u4E0A\u4E0B\u6587\u7684\u5173\u7CFB
1288
+ 2. \u786E\u5B9A\u8C03\u7528\u6A21\u5F0F (Customer/Supplier, ACL, OHS \u7B49)
1289
+ 3. \u8BBE\u8BA1\u8DE8\u4E0A\u4E0B\u6587\u7684\u6D88\u606F\u4EA4\u4E92\uFF08\u540C\u6B65\u8C03\u7528 + \u5F02\u6B65\u4E8B\u4EF6\uFF09
1290
+
1291
+ ### \u6B65\u9AA43: \u7ED8\u5236\u5E8F\u5217\u56FE\uFF08\u4EC5\u9650\u754C\u4E0A\u4E0B\u6587\u7EA7\u522B\uFF09
1292
+ 1. \u786E\u5B9A\u53C2\u4E0E\u8005\uFF1A\u4EC5\u5305\u542B\u9650\u754C\u4E0A\u4E0B\u6587\u548C\u5916\u90E8\u7CFB\u7EDF\uFF0C**\u4E0D\u5305\u542B BC \u5185\u90E8\u7684\u7EC4\u4EF6**
1293
+ 2. \u8BBE\u8BA1\u8DE8 BC \u7684\u6D88\u606F\u4EA4\u4E92\u6D41\u7A0B
1294
+ 3. \u6807\u6CE8\u6D88\u606F\u7684\u901A\u4FE1\u534F\u8BAE\uFF08HTTP REST / gRPC / \u6D88\u606F\u961F\u5217\u7B49\uFF09
1295
+ 4. \u6DFB\u52A0\u4E1A\u52A1\u903B\u8F91\u6CE8\u91CA
1296
+ 5. \u5904\u7406\u5F02\u5E38\u6D41\u7A0B
1297
+
1298
+ ### \u6B65\u9AA44: \u5B9A\u4E49 API
1299
+ 1. \u6839\u636E\u5E8F\u5217\u56FE\u4E2D\u7684\u6D88\u606F\u4EA4\u4E92\uFF0C\u63D0\u53D6\u5F53\u524D BC \u5BF9\u5916\u516C\u5F00\u7684 API
1300
+ 2. \u786E\u5B9A\u901A\u4FE1\u534F\u8BAE\uFF08HTTP \u65B9\u6CD5 + \u8D44\u6E90\u8DEF\u5F84\uFF0C\u6216 RPC \u65B9\u6CD5\u7B7E\u540D\uFF0C\u6216\u4E8B\u4EF6\u5B9A\u4E49\uFF09
1301
+ 3. \u8BBE\u8BA1\u8BF7\u6C42/\u54CD\u5E94\u6A21\u578B\uFF08DTO \u683C\u5F0F\uFF09
1302
+ 4. \u5B9A\u4E49\u9519\u8BEF\u5904\u7406
1303
+
1304
+ ## \u5E8F\u5217\u56FE\u7ED8\u5236\u89C4\u5219
1305
+
1306
+ ### \u53C2\u4E0E\u8005\u5B9A\u4E49
1307
+ - **\u53EA\u5305\u542B\u9650\u754C\u4E0A\u4E0B\u6587\u4F5C\u4E3A\u6574\u4F53\u53C2\u4E0E\u8005**\uFF0C\u6BCF\u4E2A BC \u662F\u4E00\u4E2A participant
1308
+ - **\u5916\u90E8\u7CFB\u7EDF**\uFF08\u7B2C\u4E09\u65B9\u652F\u4ED8\u3001\u77ED\u4FE1\u7F51\u5173\u7B49\uFF09\u4F5C\u4E3A\u72EC\u7ACB\u53C2\u4E0E\u8005
1309
+ - **\u7EDD\u4E0D\u5305\u542B** BC \u5185\u90E8\u7EC4\u4EF6\uFF08\u5982 Command\u3001AppService\u3001\u805A\u5408\u3001Repository \u7B49\uFF09
1310
+ - \u5E8F\u5217\u56FE\u7684\u7C92\u5EA6\u662F"\u9650\u754C\u4E0A\u4E0B\u6587\u5BF9\u9650\u754C\u4E0A\u4E0B\u6587"\uFF0C\u4E0D\u662F"\u7C7B\u5BF9\u7C7B"
1311
+
1312
+ ### \u6D88\u606F\u4EA4\u4E92\u7C7B\u578B
1313
+ 1. **HTTP RESTful \u8C03\u7528**: \u4F7F\u7528 \`->>\` \u8868\u793A\u540C\u6B65\u8BF7\u6C42\uFF0C\`-->>\` \u8868\u793A\u540C\u6B65\u54CD\u5E94
1314
+ 2. **RPC \u8C03\u7528 (gRPC\u7B49)**: \u4F7F\u7528 \`->>\` \u8868\u793A\u540C\u6B65\u8C03\u7528
1315
+ 3. **\u4E8B\u4EF6\u53D1\u5E03**: \u4F7F\u7528 \`->>\` \u53D1\u5F80\u6D88\u606F\u961F\u5217\uFF0C\u6807\u6CE8\u4E8B\u4EF6\u540D\u79F0
1316
+ 4. **\u4E8B\u4EF6\u8BA2\u9605**: \u4F7F\u7528 \`-->>\` \u4ECE\u6D88\u606F\u961F\u5217\u63A5\u6536\uFF0C\u6807\u6CE8\u4E8B\u4EF6\u540D\u79F0
1317
+
1318
+ ### \u5E8F\u5217\u56FE\u6A21\u677F
1319
+ \`\`\`mermaid
1320
+ sequenceDiagram
1321
+ participant \u5916\u90E8\u7CFB\u7EDF as External System
1322
+ participant \u4E0A\u6E38\u4E0A\u4E0B\u6587 as Upstream Context
1323
+ participant \u4E0B\u6E38\u4E0A\u4E0B\u6587 as Downstream Context
1324
+
1325
+ \u5916\u90E8\u7CFB\u7EDF->>\u4E0A\u6E38\u4E0A\u4E0B\u6587: \u53D1\u8D77\u8BF7\u6C42
1326
+ \u4E0A\u6E38\u4E0A\u4E0B\u6587->>\u4E0B\u6E38\u4E0A\u4E0B\u6587: \u8C03\u7528\u670D\u52A1
1327
+ Note right of \u4E0B\u6E38\u4E0A\u4E0B\u6587: \u4E1A\u52A1\u5904\u7406\u903B\u8F91
1328
+ \u4E0B\u6E38\u4E0A\u4E0B\u6587-->>\u4E0A\u6E38\u4E0A\u4E0B\u6587: \u8FD4\u56DE\u7ED3\u679C
1329
+ \u4E0A\u6E38\u4E0A\u4E0B\u6587-->>\u5916\u90E8\u7CFB\u7EDF: \u54CD\u5E94\u7ED3\u679C
1330
+ \`\`\`
1331
+
1332
+ ## API \u5B9A\u4E49\u89C4\u5219
1333
+
1334
+ ### RESTful \u8BBE\u8BA1\u539F\u5219
1335
+ - \u4F7F\u7528 HTTP \u52A8\u8BCD\u8868\u793A\u64CD\u4F5C\u7C7B\u578B
1336
+ - \u4F7F\u7528\u540D\u8BCD\u8868\u793A\u8D44\u6E90
1337
+ - \u4F7F\u7528\u590D\u6570\u5F62\u5F0F\u547D\u540D\u8D44\u6E90
1338
+ - \u4F7F\u7528\u5D4C\u5957 URL \u8868\u793A\u8D44\u6E90\u5173\u7CFB
1339
+
1340
+ ### API \u6A21\u677F
1341
+ \`\`\`yaml
1342
+ - API\u540D\u79F0: \u670D\u52A1\u540D\u79F0
1343
+ - API\u5B9A\u4E49: operationName(RequestType): ResponseType
1344
+ - Swagger\u534F\u8BAE: HTTP_METHOD /api/v1/resource
1345
+
1346
+ #### Request Format
1347
+ { "field1": "type", "field2": "type" }
1348
+
1349
+ #### Response Format
1350
+ { "status": "success|error", "data": {}, "message": "Optional message" }
1351
+ \`\`\`
1352
+
1353
+ ## api.md \u7ED3\u6784
1354
+
1355
+ \u5199\u5165 **\`docs/sparrow/design/{slug}/api.md\`**\uFF1A
1356
+
1357
+ \`\`\`markdown
1358
+ # \u670D\u52A1\u5951\u7EA6 \u2014 {\u9650\u754C\u4E0A\u4E0B\u6587\u4E2D\u6587\u540D}
1359
+
1360
+ ## 1. \u9650\u754C\u4E0A\u4E0B\u6587\u6982\u8FF0
1361
+ ## 2. \u670D\u52A1\u5951\u7EA6\u5217\u8868
1362
+ ## 3. \u670D\u52A1\u5951\u7EA6\u8BE6\u7EC6\u5B9A\u4E49
1363
+
1364
+ ### 3.1 {\u670D\u52A1\u540D\u79F0}
1365
+ #### \u5E8F\u5217\u56FE
1366
+ [Mermaid \u5E8F\u5217\u56FE \u2014 \u4EC5\u9650\u754C\u4E0A\u4E0B\u6587\u7EA7\u522B]
1367
+
1368
+ #### API \u5B9A\u4E49
1369
+ - **API\u540D\u79F0**:
1370
+ - **API\u5B9A\u4E49**: operationName(RequestType): ResponseType
1371
+ - **\u901A\u4FE1\u534F\u8BAE**: HTTP_METHOD /api/v1/resource\uFF08\u6216 gRPC \u65B9\u6CD5\u7B7E\u540D / \u4E8B\u4EF6\u5B9A\u4E49\uFF09
1372
+
1373
+ #### Request Format
1374
+ { "field1": "type", "field2": "type" }
1375
+
1376
+ #### Response Format
1377
+ { "status": "success|error", "data": {}, "message": "Optional message" }
1378
+
1379
+ ---
1380
+
1381
+ ## 4. \u7EC4\u4EF6\u56FE\uFF08PlantUML\uFF09
1382
+
1383
+ \u4F7F\u7528 PlantUML \u7ED8\u5236\u5F53\u524D\u9650\u754C\u4E0A\u4E0B\u6587\u53CA\u5176\u534F\u4F5C\u4E0A\u4E0B\u6587\u7684**\u7EC4\u4EF6\u56FE**\u3002\u7EC4\u4EF6\u56FE\u653E\u7F6E\u5728\u6240\u6709\u670D\u52A1\u5951\u7EA6\u5B9A\u4E49\u4E4B\u540E\u3001\u7248\u672C\u5143\u6570\u636E\u4E4B\u524D\u3002
1384
+
1385
+ ### \u7EC4\u4EF6\u56FE\u7ED8\u5236\u89C4\u5219
1386
+
1387
+ **\u7EC4\u4EF6\u8868\u793A**\uFF1A
1388
+ - \u5F53\u524D\u9650\u754C\u4E0A\u4E0B\u6587\u7528 \`[\u5F53\u524D\u4E0A\u4E0B\u6587\u540D\u79F0]\` \u8868\u793A
1389
+ - \u534F\u4F5C\u7684\u5176\u4ED6\u9650\u754C\u4E0A\u4E0B\u6587\u7528 \`[\u534F\u4F5C\u4E0A\u4E0B\u6587\u540D\u79F0]\` \u8868\u793A
1390
+ - \u5916\u90E8\u7CFB\u7EDF\u7528 \`[\u5916\u90E8\u7CFB\u7EDF\u540D\u79F0]\` \u8868\u793A
1391
+
1392
+ **\u63A5\u53E3\u8868\u793A**\uFF1A
1393
+ - **provided interface**\uFF08\u5F53\u524D BC \u5BF9\u5916\u516C\u5F00\u7684 API\uFF09\uFF1A\u4F7F\u7528 \`()\` \u5706\u5708\u63A5\u53E3\u7B26\u53F7
1394
+ - **required interface**\uFF08\u5F53\u524D BC \u8C03\u7528\u5176\u4ED6 BC \u7684 API\uFF09\uFF1A\u4F7F\u7528 \`()\` \u534A\u5706\u63A5\u53E3\u7B26\u53F7
1395
+
1396
+ **\u4E8B\u4EF6\u8868\u793A**\uFF1A
1397
+ - \u4E8B\u4EF6\u53D1\u5E03\uFF1A\u4F7F\u7528 \`-->>\` \u7BAD\u5934\uFF0C\u6807\u6CE8\u4E8B\u4EF6\u540D\u79F0
1398
+ - \u4E8B\u4EF6\u8BA2\u9605\uFF1A\u4F7F\u7528 \`<<--\` \u7BAD\u5934\uFF0C\u6807\u6CE8\u4E8B\u4EF6\u540D\u79F0
1399
+
1400
+ ### \u7EC4\u4EF6\u56FE\u6A21\u677F
1401
+
1402
+ \`\`\`plantuml
1403
+ @startuml
1404
+ !theme plain
1405
+
1406
+ ' \u5F53\u524D\u9650\u754C\u4E0A\u4E0B\u6587
1407
+ component "{\u5F53\u524DBC\u4E2D\u6587\u540D}" as CurrentBC
1408
+
1409
+ ' \u534F\u4F5C\u7684\u9650\u754C\u4E0A\u4E0B\u6587
1410
+ component "{\u534F\u4F5CBC1\u4E2D\u6587\u540D}" as BC1
1411
+ component "{\u534F\u4F5CBC2\u4E2D\u6587\u540D}" as BC2
1412
+
1413
+ ' \u5916\u90E8\u7CFB\u7EDF
1414
+ component "{\u5916\u90E8\u7CFB\u7EDF\u540D}" as ExtSys
1415
+
1416
+ ' \u5F53\u524D BC \u5BF9\u5916\u63D0\u4F9B\u7684 API (provided interface)
1417
+ () "POST /api/v1/orders" as API_PlaceOrder
1418
+ () "GET /api/v1/orders/{id}" as API_GetOrder
1419
+
1420
+ ' \u5F53\u524D BC \u4F9D\u8D56\u7684 API (required interface)
1421
+ () "GET /api/v1/users/{id}" as API_GetUser
1422
+ () "POST /api/v1/payments" as API_CreatePayment
1423
+ () "OrderPlaced" as EVT_OrderPlaced
1424
+
1425
+ ' provided interfaces \u8FDE\u63A5\u5230\u5F53\u524D BC
1426
+ CurrentBC -- API_PlaceOrder
1427
+ CurrentBC -- API_GetOrder
1428
+
1429
+ ' required interfaces \u8FDE\u63A5\u5230\u534F\u4F5C BC
1430
+ API_GetUser -- BC1
1431
+ API_CreatePayment -- BC2
1432
+
1433
+ ' \u4E8B\u4EF6\u53D1\u5E03/\u8BA2\u9605
1434
+ CurrentBC -->> EVT_OrderPlaced : publishes
1435
+ ExtSys <<-- EVT_OrderPlaced : subscribes
1436
+
1437
+ @enduml
1438
+ \`\`\`
1439
+
1440
+ > **\u63D0\u793A**\uFF1A\u4EE5\u4E0A\u6A21\u677F\u4E2D\u7684 API \u548C\u4E8B\u4EF6\u5E94\u4E0E"\u670D\u52A1\u5951\u7EA6\u8BE6\u7EC6\u5B9A\u4E49"\u7AE0\u8282\u4E2D\u7684\u5B9A\u4E49\u4E00\u4E00\u5BF9\u5E94\u3002
1441
+ \`\`\`
1442
+
1443
+ ---
1444
+
1445
+ ## \u9879\u76EE\u7EA7 API \u76EE\u5F55\u66F4\u65B0
1446
+
1447
+ \u5B8C\u6210\u5F53\u524D\u9650\u754C\u4E0A\u4E0B\u6587\u7684 api.md \u540E\uFF0C**\u5FC5\u987B**\u66F4\u65B0 \`docs/sparrow/api.md\`\uFF08\u9879\u76EE\u7EA7 API \u603B\u76EE\u5F55\uFF09\u3002
1448
+
1449
+ ### api.md \u76EE\u5F55\u7ED3\u6784\uFF08\u9879\u76EE\u7EA7\uFF09
1450
+
1451
+ \`\`\`markdown
1452
+ # API \u76EE\u5F55 \u2014 {\u9879\u76EE\u540D\u79F0}
1453
+
1454
+ > \u672C\u6587\u4EF6\u7531 Sparrow \u81EA\u52A8\u7EF4\u62A4\uFF0C\u6C47\u603B\u6240\u6709\u9650\u754C\u4E0A\u4E0B\u6587\u7684\u516C\u5F00 API\u3002
1455
+ > \u6BCF\u5B8C\u6210\u4E00\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u7684 sparrow-design \u64CD\u4F5C\u540E\u66F4\u65B0\u3002
1456
+
1457
+ ## {\u9650\u754C\u4E0A\u4E0B\u65871\u4E2D\u6587\u540D} (\`{slug1}\`)
1458
+
1459
+ ### \u5BF9\u5916\u63D0\u4F9B\u7684 API (Provided)
1460
+
1461
+ | API \u540D\u79F0 | \u901A\u4FE1\u534F\u8BAE | \u5B9A\u4E49 | \u8BF4\u660E |
1462
+ |---------|---------|------|------|
1463
+ | \u63D0\u4EA4\u8BA2\u5355 | HTTP POST | /api/v1/orders | \u521B\u5EFA\u65B0\u8BA2\u5355 |
1464
+ | \u67E5\u8BE2\u8BA2\u5355 | HTTP GET | /api/v1/orders/{id} | \u6309ID\u67E5\u8BE2\u8BA2\u5355 |
1465
+
1466
+ ### \u5BF9\u5916\u53D1\u5E03\u7684\u4E8B\u4EF6
1467
+
1468
+ | \u4E8B\u4EF6\u540D\u79F0 | \u4E8B\u4EF6\u7C7B\u578B | \u8BF4\u660E |
1469
+ |---------|---------|------|
1470
+ | OrderPlaced | \u9886\u57DF\u4E8B\u4EF6 | \u8BA2\u5355\u5DF2\u63D0\u4EA4 |
1471
+
1472
+ ### \u4F9D\u8D56\u7684 API (Required)
1473
+
1474
+ | API \u540D\u79F0 | \u63D0\u4F9B\u65B9\u4E0A\u4E0B\u6587 | \u901A\u4FE1\u534F\u8BAE | \u8BF4\u660E |
1475
+ |---------|------------|---------|------|
1476
+ | \u67E5\u8BE2\u7528\u6237 | user-identity | HTTP GET | \u83B7\u53D6\u7528\u6237\u4FE1\u606F |
1477
+
1478
+ ---
1479
+
1480
+ ## {\u9650\u754C\u4E0A\u4E0B\u65872\u4E2D\u6587\u540D} (\`{slug2}\`)
1481
+
1482
+ ...
1483
+ \`\`\`
1484
+
1485
+ ### \u66F4\u65B0\u64CD\u4F5C
1486
+
1487
+ 1. \u5982\u679C \`docs/sparrow/api.md\` \u4E0D\u5B58\u5728\uFF0C\u6839\u636E\u4E0A\u8FF0\u6A21\u677F\u521B\u5EFA
1488
+ 2. \u5728\u6587\u4EF6\u4E2D\u627E\u5230\u5F53\u524D\u9650\u754C\u4E0A\u4E0B\u6587\u7684\u7AE0\u8282\uFF08\u5982\u4E0D\u5B58\u5728\u5219\u65B0\u589E\uFF09
1489
+ 3. \u66F4\u65B0"\u5BF9\u5916\u63D0\u4F9B\u7684 API"\u8868\u683C\uFF08\u4E0E api.md \u4E2D\u7684 API \u5B9A\u4E49\u4FDD\u6301\u4E00\u81F4\uFF09
1490
+ 4. \u66F4\u65B0"\u5BF9\u5916\u53D1\u5E03\u7684\u4E8B\u4EF6"\u8868\u683C
1491
+ 5. \u66F4\u65B0"\u4F9D\u8D56\u7684 API"\u8868\u683C\uFF08\u5217\u51FA\u5F53\u524D BC \u8C03\u7528\u7684\u5176\u4ED6 BC \u7684 API\uFF09
1492
+ 6. \u66F4\u65B0\u6587\u4EF6\u5934\u90E8\u7684"\u6700\u540E\u66F4\u65B0"\u65F6\u95F4\u6233
1493
+
1494
+ ## \u8D28\u91CF\u68C0\u67E5\u6E05\u5355
1495
+
1496
+ - [ ] \u5E8F\u5217\u56FE\u53EA\u5305\u542B\u9650\u754C\u4E0A\u4E0B\u6587\u7EA7\u522B\u548C\u5916\u90E8\u7CFB\u7EDF\u7684\u4EA4\u4E92\uFF08\u65E0\u5185\u90E8\u7EC4\u4EF6\uFF09
1497
+ - [ ] **\u6BCF\u4E2A\u5E8F\u5217\u56FE\u4E2D actor \u5411\u5F53\u524D BC \u53EA\u53D1\u8D77\u4E86\u4E00\u6B21\u8BF7\u6C42**
1498
+ - [ ] **API \u6570\u91CF = \u5206\u914D\u7ED9\u5F53\u524D BC \u7684\u4E1A\u52A1\u670D\u52A1\u6570\u91CF**\uFF08\u6765\u81EA spec.md\uFF09
1499
+ - [ ] \u5E8F\u5217\u56FE\u4E2D\u6BCF\u4E2A\u8DE8 BC \u6D88\u606F\u90FD\u660E\u786E\u4E86\u901A\u4FE1\u534F\u8BAE\uFF08HTTP/RPC/Event\uFF09
1500
+ - [ ] API \u5B9A\u4E49\u5B8C\u6574\uFF0C\u5305\u542B\u8BF7\u6C42/\u54CD\u5E94\u6A21\u578B\u548C\u9519\u8BEF\u5904\u7406
1501
+ - [ ] \u4E8B\u4EF6\u9A71\u52A8\u7684\u670D\u52A1\u5951\u7EA6\u6709\u660E\u786E\u7684\u4E8B\u4EF6\u5B9A\u4E49
1502
+ - [ ] **\u7EC4\u4EF6\u56FE\u5DF2\u7ED8\u5236**\uFF1Aprovided interface \u4E0E API \u5B9A\u4E49\u4E00\u4E00\u5BF9\u5E94
1503
+ - [ ] **\u7EC4\u4EF6\u56FE\u5DF2\u7ED8\u5236**\uFF1Arequired interface \u4F53\u73B0\u4E86\u6240\u6709\u8DE8 BC \u8C03\u7528
1504
+ - [ ] \u4E8B\u4EF6\u53D1\u5E03/\u8BA2\u9605\u5728\u7EC4\u4EF6\u56FE\u4E2D\u6B63\u786E\u8868\u793A
1505
+ - [ ] tech.md \u5305\u542B\u6240\u6709 8 \u4E2A\u5FC5\u8981\u7AE0\u8282
1506
+ - [ ] **\u9879\u76EE\u7EA7 \`docs/sparrow/api.md\` \u5DF2\u66F4\u65B0**\uFF0C\u5F53\u524D BC \u7684 API \u5DF2\u5F55\u5165
1507
+ - [ ] \u8DE8\u4E0A\u4E0B\u6587\u8C03\u7528\u5173\u7CFB\u548C\u901A\u4FE1\u534F\u8BAE\u6E05\u6670
1508
+
1509
+ ## \u5B8C\u6210\u540E\u7684\u4E0B\u4E00\u6B65
1510
+
1511
+ \u2705 \u5B8C\u6210 sparrow-design @{slug} \u540E\uFF0C\u8BF7\u6267\u884C **sparrow-model @{slug}**\uFF08\u56E2\u961F\u7EA7\uFF09\u2014\u2014 \u57FA\u4E8E api.md \u4E2D\u7684 API \u5B9A\u4E49\uFF0C\u5C06\u6BCF\u4E2A API \u4F5C\u4E3A\u52A8\u6001\u9886\u57DF\u6A21\u578B\u4EFB\u52A1\u6811\u7684\u7B2C\u4E00\u7EA7\u5165\u53E3\uFF0C\u8FDB\u884C\u9886\u57DF\u5EFA\u6A21\u3002
1512
+ `;
1513
+ function register3() {
1514
+ registerSkillTemplate("sparrow-design", () => DESIGN_BODY);
1515
+ }
1516
+
1517
+ // src/skills/model.ts
1518
+ var MODEL_BODY = `# Sparrow Model \u2014 \u9886\u57DF\u5EFA\u6A21
1519
+
1520
+ ## \u6267\u884C\u987A\u5E8F\u68C0\u67E5
1521
+
1522
+ \`\`\`
1523
+ \u5F53\u524D\u6B65\u9AA4\uFF1Asparrow-model\uFF08\u7B2C 4 \u6B65 / \u5171 6 \u6B65\uFF09
1524
+ \u6240\u5C5E\u5C42\u7EA7\uFF1A\u56E2\u961F\u7EA7\uFF08team-level\uFF09\uFF0C\u9488\u5BF9\u7279\u5B9A\u9650\u754C\u4E0A\u4E0B\u6587
1525
+ \u524D\u7F6E\u6761\u4EF6\uFF1A
1526
+ 1. docs/sparrow/design/{slug}/spec.md \u5FC5\u987B\u5B58\u5728
1527
+ 2. docs/sparrow/design/{slug}/api.md \u5FC5\u987B\u5B58\u5728
1528
+ 3. docs/sparrow/design/{slug}/tech.md \u5FC5\u987B\u5B58\u5728
1529
+ \u4E0B\u4E00\u6B65\u9AA4\uFF1Asparrow-plan @{slug}\uFF08\u56E2\u961F\u7EA7\uFF09
1530
+ \`\`\`
1531
+
1532
+ **\u524D\u7F6E\u6761\u4EF6\u68C0\u67E5**\uFF1A
1533
+ - \u5982\u679C api.md \u6216 tech.md \u4E0D\u5B58\u5728\uFF0C\u8BF7\u63D0\u793A\u7528\u6237\u5148\u6267\u884C **sparrow-design @{slug}**
1534
+ - \u5982\u679C\u7528\u6237\u672A\u6307\u5B9A\u9650\u754C\u4E0A\u4E0B\u6587\uFF0C\u8BF7\u5217\u51FA\u53EF\u7528\u7684\u9650\u754C\u4E0A\u4E0B\u6587\u8BA9\u7528\u6237\u9009\u62E9
1535
+ - \u5982\u679C\u76EE\u6807\u6587\u4EF6\u5DF2\u5B58\u5728\uFF0C\u8BF7\u53C2\u8003\u4E0B\u65B9"\u8F93\u51FA\u6587\u4EF6\u5B58\u5728\u6027\u68C0\u67E5"\u7AE0\u8282\u5904\u7406
1536
+
1537
+ ---
1538
+
1539
+ ## \u{1F6D1} \u8F93\u51FA\u6587\u4EF6\u5B58\u5728\u6027\u68C0\u67E5\uFF08\u5FC5\u987B\u5728\u751F\u6210\u524D\u6267\u884C\uFF09
1540
+
1541
+ \u5728\u5F00\u59CB\u751F\u6210\u5185\u5BB9\u4E4B\u524D\uFF0C\u8BF7\u68C0\u67E5\u4EE5\u4E0B\u8F93\u51FA\u6587\u4EF6\u662F\u5426\u5DF2\u7ECF\u5B58\u5728\uFF1A
1542
+
1543
+ - \`docs/sparrow/design/{slug}/model.md\`
1544
+
1545
+ \u5982\u679C\u6587\u4EF6\u5DF2\u5B58\u5728\uFF0C\u8BF7**\u8BA9\u7528\u6237\u8FDB\u884C\u9009\u62E9**\uFF1A
1546
+
1547
+ - **\u8DF3\u8FC7 (skip)**\uFF1A\u4FDD\u7559\u5DF2\u6709\u6587\u4EF6\uFF0C\u4E0D\u6267\u884C\u4EFB\u4F55\u751F\u6210\u64CD\u4F5C\uFF0C\u505C\u6B62\u6267\u884C
1548
+ - **\u8986\u76D6 (overwrite)**\uFF1A\u5220\u9664\u5DF2\u6709\u6587\u4EF6\uFF0C\u91CD\u65B0\u751F\u6210\u5168\u65B0\u7684\u5185\u5BB9
1549
+ - **\u66F4\u65B0 (update)**\uFF1A\u5728\u5DF2\u6709\u6587\u4EF6\u57FA\u7840\u4E0A\u8FDB\u884C\u4FEE\u6539\u548C\u5B8C\u5584
1550
+
1551
+ > \u26A0\uFE0F \u4E00\u6B21\u547D\u4EE4\u53EA\u786E\u8BA4\u4E00\u6B21\uFF0C\u7528\u6237\u7684\u9009\u62E9\u5E94\u7528\u4E8E\u6240\u6709\u8F93\u51FA\u6587\u4EF6\u3002
1552
+
1553
+ ---
1554
+
1555
+ ## \u{1F4CB} project.md \u66F4\u65B0
1556
+
1557
+ \u5B8C\u6210\u8F93\u51FA\u540E\uFF0C**\u5FC5\u987B**\u66F4\u65B0 \`docs/sparrow/project.md\`\uFF1A
1558
+
1559
+ 1. \u5982\u679C \`project.md\` \u4E0D\u5B58\u5728\uFF0C\u6839\u636E\u5F53\u524D\u9879\u76EE\u4FE1\u606F\u521B\u5EFA\u5B83
1560
+ 2. \u5728"\u9650\u754C\u4E0A\u4E0B\u6587\u8BBE\u8BA1"\u90E8\u5206\uFF0C\u627E\u5230\u5F53\u524D \`{slug}\` \u7684\u5B50\u7AE0\u8282
1561
+ 3. \u66F4\u65B0 \`model.md\` \u7684\u72B6\u6001\u4ECE \`_\u5F85\u751F\u6210_\` \u6539\u4E3A \`_v{version}_\`
1562
+ 4. \u66F4\u65B0\u6587\u4EF6\u5934\u90E8\u7684"\u6700\u540E\u66F4\u65B0"\u65F6\u95F4\u6233
1563
+
1564
+ **project.md \u8DEF\u5F84**: \`docs/sparrow/project.md\`
1565
+
1566
+ ---
1567
+
1568
+ ## \u{1F4CC} \u7248\u672C\u5143\u6570\u636E\u7BA1\u7406
1569
+
1570
+ \u6240\u6709\u8F93\u51FA\u7684\u6587\u6863\u6587\u4EF6**\u5FC5\u987B\u5728\u6587\u4EF6\u5F00\u5934**\u5305\u542B\u7248\u672C\u5143\u6570\u636E\u5757\uFF1A
1571
+
1572
+ \`\`\`markdown
1573
+ <!--
1574
+ version: v1.0
1575
+ last-updated: {ISO_8601_TIMESTAMP}
1576
+ generated-by: sparrow-model
1577
+ sparrow-version: {\u4ECE .sparrow/sparrow.json \u8BFB\u53D6}
1578
+ -->
1579
+ \`\`\`
1580
+
1581
+ **\u7248\u672C\u89C4\u5219**:
1582
+ - **\u65B0\u6587\u6863**: \u4F7F\u7528 \`v1.0\`
1583
+ - **\u66F4\u65B0\u5DF2\u6709\u6587\u6863**: \u8BFB\u53D6\u73B0\u6709\u7248\u672C\u53F7\uFF0C\u9012\u589E\u6B21\u7248\u672C\u53F7\uFF08\`v1.0\` \u2192 \`v1.1\`\uFF09
1584
+ - **\u91CD\u5927\u91CD\u5199**: \u9012\u589E\u4E3B\u7248\u672C\u53F7\uFF08\`v1.x\` \u2192 \`v2.0\`\uFF09
1585
+ - \u6BCF\u6B21\u4FEE\u6539\u90FD**\u5FC5\u987B\u53D8\u66F4**\u7248\u672C\u53F7
1586
+
1587
+ **\u64CD\u4F5C\u6B65\u9AA4**:
1588
+ 1. \u68C0\u67E5\u76EE\u6807\u6587\u4EF6\u662F\u5426\u5DF2\u5B58\u5728
1589
+ 2. \u5982\u679C\u5B58\u5728\uFF0C\u8BFB\u53D6\u6587\u4EF6\u5F00\u5934 \`<!--\` \u6CE8\u91CA\u5757\u4E2D\u7684 \`version:\` \u5B57\u6BB5\u5E76\u9012\u589E
1590
+ 3. \u5728\u6587\u4EF6\u5F00\u5934\u6DFB\u52A0\u6216\u66F4\u65B0\u7248\u672C\u5143\u6570\u636E\u5757
1591
+ 4. \u7EE7\u7EED\u751F\u6210\u6587\u6863\u6B63\u6587
1592
+
1593
+ ---
1594
+
1595
+ ## \u89D2\u8272\u5B9A\u4E49
1596
+
1597
+ \u4F60\u662F\u4E00\u540D **DDD \u9886\u57DF\u5EFA\u6A21\u4E13\u5BB6**\uFF0C\u8D1F\u8D23\u4E3A\u5F53\u524D\u9650\u754C\u4E0A\u4E0B\u6587\u751F\u6210\u5B8C\u6574\u7684\u9886\u57DF\u6A21\u578B\u5B9A\u4E49\u6587\u6863\u3002
1598
+
1599
+ ## \u5EFA\u6A21\u76EE\u6807
1600
+
1601
+ 1. **\u9759\u6001\u9886\u57DF\u6A21\u578B**\uFF1A\u4EE5\u805A\u5408\u4E3A\u57FA\u672C\u5355\u4F4D\u7684\u9886\u57DF\u6A21\u578B\uFF08\u805A\u5408\u6839\u3001\u5B9E\u4F53\u3001\u503C\u5BF9\u8C61\uFF09
1602
+ 2. **\u52A8\u6001\u9886\u57DF\u6A21\u578B**\uFF1A\u4EE5 api.md \u7684 API \u5B9A\u4E49\u4E3A\u5165\u53E3\uFF0C\u901A\u8FC7\u4EFB\u52A1\u5206\u89E3\u548C\u89D2\u8272\u6784\u9020\u578B\uFF0C\u4E3A\u6BCF\u4E2A API \u7ED8\u5236\u5185\u90E8\u5E8F\u5217\u56FE
1603
+
1604
+ \u8F93\u51FA\u6587\u4EF6\uFF1A**\`docs/sparrow/design/{slug}/model.md\`**
1605
+
1606
+ ## \u6838\u5FC3\u539F\u5219\uFF1AAPI \u9A71\u52A8\u7684\u52A8\u6001\u5EFA\u6A21
1607
+
1608
+ **\u52A8\u6001\u9886\u57DF\u6A21\u578B\u4EE5 design \u9636\u6BB5\u4EA7\u51FA\u7684 api.md \u4E3A\u8D77\u70B9\uFF0C\u9010\u5C42\u5411\u5185\u90E8\u5C55\u5F00\u3002**
1609
+
1610
+ - \u4ECE \`docs/sparrow/design/{slug}/api.md\` \u4E2D\u63D0\u53D6\u5F53\u524D BC \u7684\u6BCF\u4E2A**\u5BF9\u5916\u516C\u5F00\u7684 API**
1611
+ - \u6BCF\u4E2A API \u4F5C\u4E3A\u52A8\u6001\u9886\u57DF\u6A21\u578B**\u4EFB\u52A1\u6811\u7684\u7B2C\u4E00\u7EA7\u5165\u53E3**\uFF08\u6839\u8282\u70B9\uFF09
1612
+ - \u4EFB\u52A1\u6811\u4ECE API \u5165\u53E3\u51FA\u53D1\uFF0C\u9010\u6B65\u5206\u89E3\u5230\u5E94\u7528\u670D\u52A1 \u2192 \u9886\u57DF\u670D\u52A1 \u2192 \u805A\u5408 \u2192 \u7AEF\u53E3\uFF0C\u76F4\u5230\u539F\u5B50\u4EFB\u52A1
1613
+ - **\u8FDC\u7A0B\u670D\u52A1\uFF08Command/Query\uFF09\u7684\u63A5\u53E3\u5FC5\u987B\u4E0E api.md \u4E2D\u7684 API \u5B9A\u4E49\u4FDD\u6301\u4E00\u81F4**
1614
+ - **\u5E94\u7528\u670D\u52A1\u7684\u65B9\u6CD5\u7B7E\u540D\u5FC5\u987B\u4E0E\u8FDC\u7A0B\u670D\u52A1\u7684\u63A5\u53E3\u4FDD\u6301\u4E00\u81F4**
1615
+ - \u9759\u6001\u9886\u57DF\u6A21\u578B\uFF08\u7C7B\u56FE\uFF09\u4E0E\u52A8\u6001\u9886\u57DF\u6A21\u578B\uFF08\u5E8F\u5217\u56FE\uFF09\u5FC5\u987B\u4FDD\u6301\u4E00\u81F4
1616
+
1617
+ > design \u9636\u6BB5\u5B9A\u4E49\u7684\u662F"\u9650\u754C\u4E0A\u4E0B\u6587\u4E4B\u95F4"\u7684\u534F\u4F5C\u5951\u7EA6\uFF1Bmodel \u9636\u6BB5\u5EFA\u6A21\u7684\u662F"\u9650\u754C\u4E0A\u4E0B\u6587\u5185\u90E8"\u5982\u4F55\u5B9E\u73B0\u8FD9\u4E9B\u5951\u7EA6\u3002
1618
+
1619
+ ---
1620
+
1621
+ ## \u9636\u6BB5\u4E00\uFF1A\u9759\u6001\u5EFA\u6A21\u9636\u6BB5
1622
+
1623
+ ### \u6B65\u9AA4\u4E00\uFF1A\u7EDF\u4E00\u8BED\u8A00\u63D0\u70BC
1624
+ \u7ED3\u5408\u884C\u4E1A\u672F\u8BED\uFF0C\u660E\u786E\u7EDF\u4E00\u8BED\u8A00\uFF0C\u63D0\u70BC\u6240\u6709\u4E1A\u52A1\u670D\u52A1\u4E2D\u7684\u6838\u5FC3\u6982\u5FF5\u53CA\u6982\u5FF5\u4E4B\u95F4\u7684\u5173\u7CFB\u3002
1625
+
1626
+ ### \u6B65\u9AA4\u4E8C\uFF1A\u5B9E\u4F53\u4E0E\u503C\u5BF9\u8C61\u8BC6\u522B
1627
+ - **\u5B9E\u4F53 (Entity)**\uFF1A\u5177\u6709\u552F\u4E00\u6807\u8BC6\u7684\u5BF9\u8C61\uFF0C\u7C7B\u56FE\u7528**\u9EC4\u8272** (#FFFFCC) \u8868\u793A
1628
+ - **\u503C\u5BF9\u8C61 (Value Object)**\uFF1A\u4E0D\u53EF\u53D8\u7684\u5BF9\u8C61\uFF0C\u7C7B\u56FE\u7528**\u84DD\u8272** (#E6F3FF) \u8868\u793A
1629
+
1630
+ ### \u6B65\u9AA4\u4E09\uFF1A\u5173\u7CFB\u5EFA\u6A21
1631
+ - **Composite \u5173\u7CFB**\uFF1A\u6574\u4F53-\u90E8\u5206\uFF0C\u751F\u547D\u5468\u671F\u5B8C\u5168\u4E00\u81F4\uFF0C\u4F7F\u7528 \`*-->\` \u7B26\u53F7
1632
+ - **Aggregation \u5173\u7CFB**\uFF1A\u6574\u4F53-\u90E8\u5206\uFF0C\u751F\u547D\u5468\u671F\u53EF\u72EC\u7ACB\uFF0C\u4F7F\u7528 \`o-->\` \u7B26\u53F7
1633
+ - **\u5173\u8054\u5173\u7CFB**\uFF1A\u666E\u901A\u5173\u8054
1634
+ - **\u503C\u5BF9\u8C61\u5173\u8054**\uFF1A\u4F7F\u7528 \`||--||\` (\u4E00\u5BF9\u4E00) \u6216 \`||--o{\` (\u4E00\u5BF9\u591A)
1635
+
1636
+ ### \u6B65\u9AA4\u56DB\uFF1A\u805A\u5408\u8BC6\u522B
1637
+ - \u4E24\u4E2A\u5177\u6709 Composite \u5173\u7CFB\u7684\u5B9E\u4F53\u5E94\u8BE5\u4F4D\u4E8E\u540C\u4E00\u805A\u5408\u4E2D
1638
+ - \u5177\u6709 Aggregation \u5173\u7CFB\u6216\u666E\u901A\u5173\u8054\u5173\u7CFB\u7684\u5B9E\u4F53\uFF0C\u4F4D\u4E8E\u4E0D\u540C\u7684\u805A\u5408
1639
+ - \u805A\u5408\u6839\u5B9E\u4F53\u7528**\u6D45\u7EA2\u8272** (#FFE6E6) \u8868\u793A\uFF0C\u6807\u6CE8 \`<<AggregateRoot>>\`
1640
+ - \u805A\u5408\u8FB9\u754C\u5185\u7684\u5BF9\u8C61\u5177\u6709\u5F3A\u4E00\u81F4\u6027
1641
+ - \u805A\u5408\u8FB9\u754C\u5916\u7684\u5BF9\u8C61\u901A\u8FC7\u805A\u5408\u6839\u8FDB\u884C\u8BBF\u95EE
1642
+
1643
+ ### \u6B65\u9AA4\u4E94\uFF1A\u7C7B\u56FE\u7ED8\u5236\uFF08PlantUML\uFF09
1644
+
1645
+ \u4F7F\u7528 PlantUML \u8BED\u6CD5\u7ED8\u5236 UML \u7C7B\u56FE\uFF1A
1646
+
1647
+ \`\`\`plantuml
1648
+ @startuml
1649
+ !theme plain
1650
+
1651
+ ' \u805A\u5408\u6839 - \u6D45\u7EA2\u8272\u80CC\u666F
1652
+ class Meeting <<AggregateRoot>> #FFE6E6 {
1653
+ +MeetingId id
1654
+ +String title
1655
+ +MeetingStatus status
1656
+ --
1657
+ +createMeeting()
1658
+ +addParticipant()
1659
+ +startMeeting()
1660
+ }
1661
+
1662
+ ' \u5B9E\u4F53 - \u9EC4\u8272\u80CC\u666F
1663
+ class Participant #FFFFCC {
1664
+ +ParticipantId id
1665
+ +String email
1666
+ +ParticipantRole role
1667
+ --
1668
+ +joinMeeting()
1669
+ }
1670
+
1671
+ ' \u503C\u5BF9\u8C61 - \u84DD\u8272\u80CC\u666F
1672
+ class MeetingTime #E6F3FF {
1673
+ +LocalDateTime startTime
1674
+ +LocalDateTime endTime
1675
+ +TimeZone timeZone
1676
+ }
1677
+
1678
+ ' \u5173\u7CFB\u5B9A\u4E49
1679
+ Meeting o--> Participant : aggregates
1680
+ Meeting ||--|| MeetingTime : has
1681
+
1682
+ @enduml
1683
+ \`\`\`
1684
+
1685
+ **PlantUML \u8BED\u6CD5\u89C4\u8303**\uFF1A
1686
+ - \u4F7F\u7528 \`@startuml\` \u548C \`@enduml\` \u6807\u8BB0
1687
+ - \u5173\u7CFB\u7B26\u53F7\uFF1A\`||--o{\` (\u4E00\u5BF9\u591A), \`||--||\` (\u4E00\u5BF9\u4E00)
1688
+ - Composite: \`*-->\` \uFF0C\u7531\u6574\u4F53\u6307\u5411\u90E8\u5206
1689
+ - Aggregate: \`o-->\` \uFF0C\u7531\u6574\u4F53\u6307\u5411\u90E8\u5206
1690
+ - \u503C\u5BF9\u8C61\u5173\u8054\uFF1A\`||--||\` \u8868\u793A has \u5173\u7CFB
1691
+
1692
+ ---
1693
+
1694
+ ## \u9636\u6BB5\u4E8C\uFF1A\u52A8\u6001\u5EFA\u6A21\u9636\u6BB5
1695
+
1696
+ ### \u6B65\u9AA4\u3007\uFF1AAPI \u5165\u53E3\u63D0\u53D6\uFF08\u5FC5\u987B\u5728\u4EFB\u52A1\u5206\u89E3\u4E4B\u524D\u6267\u884C\uFF09
1697
+
1698
+ 1. \u8BFB\u53D6 \`docs/sparrow/design/{slug}/api.md\`\uFF0C\u63D0\u53D6\u5F53\u524D BC \u7684**\u6240\u6709\u5BF9\u5916\u516C\u5F00\u7684 API**
1699
+ 2. \u5BF9\u6BCF\u4E2A API\uFF0C\u786E\u8BA4\u5176\u901A\u4FE1\u534F\u8BAE\uFF08HTTP/RPC/Event\uFF09\u548C\u64CD\u4F5C\u7B7E\u540D
1700
+ 3. \u8FD9\u4E9B API \u5C06\u4F5C\u4E3A\u52A8\u6001\u9886\u57DF\u6A21\u578B**\u4EFB\u52A1\u6811\u7684\u7B2C\u4E00\u7EA7\u5165\u53E3**
1701
+
1702
+ **API \u5230\u4EFB\u52A1\u6811\u5165\u53E3\u7684\u6620\u5C04\u89C4\u5219**\uFF1A
1703
+
1704
+ | API \u7C7B\u578B | \u4EFB\u52A1\u6811\u5165\u53E3 | \u5BF9\u5E94\u89D2\u8272 |
1705
+ |---------|-----------|---------|
1706
+ | HTTP POST /api/v1/xxx | \u547D\u4EE4\u4EFB\u52A1\uFF08\u6839\u4EFB\u52A1\uFF09 | Command |
1707
+ | HTTP GET /api/v1/xxx | \u67E5\u8BE2\u4EFB\u52A1\uFF08\u6839\u4EFB\u52A1\uFF09 | Query |
1708
+ | HTTP PUT/PATCH /api/v1/xxx | \u547D\u4EE4\u4EFB\u52A1\uFF08\u6839\u4EFB\u52A1\uFF09 | Command |
1709
+ | HTTP DELETE /api/v1/xxx | \u547D\u4EE4\u4EFB\u52A1\uFF08\u6839\u4EFB\u52A1\uFF09 | Command |
1710
+ | gRPC Method(param): result | \u547D\u4EE4/\u67E5\u8BE2\u4EFB\u52A1 | Command/Query |
1711
+ | \u9886\u57DF\u4E8B\u4EF6\u8BA2\u9605 | \u4E8B\u4EF6\u5904\u7406\u4EFB\u52A1 | Command |
1712
+
1713
+ ### \u6B65\u9AA4\u4E00\uFF1A\u4EFB\u52A1\u5206\u89E3
1714
+ \u4EE5\u6BCF\u4E2A API \u5165\u53E3\u4E3A\u6839\u8282\u70B9\uFF0C\u5C06\u4EFB\u52A1\u9010\u5C42\u5206\u89E3\u4E3A\u4EFB\u52A1\u6811\uFF1A
1715
+
1716
+ **\u4EFB\u52A1\u6811\u7ED3\u6784**\uFF1A
1717
+ - **\u6839**\uFF1AAPI \u5165\u53E3\uFF08\u8FDC\u7A0B\u670D\u52A1 Command/Query\uFF09
1718
+ - **\u679D**\uFF1A\u5E94\u7528\u670D\u52A1\u7F16\u6392\uFF08AppService\uFF09
1719
+ - **\u679D**\uFF1A\u9886\u57DF\u670D\u52A1\u903B\u8F91\uFF08DomainService\uFF09
1720
+ - **\u53F6**\uFF1A\u805A\u5408\u64CD\u4F5C / \u7AEF\u53E3\u8C03\u7528\uFF08Repository/Client\uFF09\u2192 \u539F\u5B50\u4EFB\u52A1
1721
+
1722
+ **\u539F\u5B50\u4EFB\u52A1\u5224\u65AD\u6761\u4EF6**\uFF1A
1723
+ 1. \u5F53\u524D\u4EFB\u52A1\u64CD\u4F5C\u7684\u9886\u57DF\u77E5\u8BC6\u5C5E\u4E8E\u4E00\u4E2A\u805A\u5408\u6240\u5B8C\u5168\u62E5\u6709 \u2192 \u539F\u5B50\u4EFB\u52A1
1724
+ 2. \u5F53\u524D\u4EFB\u52A1\u9700\u8981\u8BBF\u95EE\u5916\u90E8\u8D44\u6E90\uFF08\u6570\u636E\u5E93\u3001\u6D88\u606F\u961F\u5217\u3001\u5916\u90E8\u7CFB\u7EDF\u7B49\uFF09 \u2192 \u539F\u5B50\u4EFB\u52A1
1725
+ 3. \u7528\u6237\u754C\u9762\u4EA4\u4E92 \u2192 \u5FFD\u7565
1726
+
1727
+ ### \u6B65\u9AA4\u4E8C\uFF1A\u89D2\u8272\u6784\u9020\u578B\u5206\u914D
1728
+
1729
+ **\u63A5\u53E3\u5BF9\u9F50\u7EA6\u675F\uFF08\u5173\u952E\uFF09**\uFF1A
1730
+ - **\u8FDC\u7A0B\u670D\u52A1\uFF08Command/Query\uFF09\u7684\u65B9\u6CD5\u7B7E\u540D\u5FC5\u987B\u4E0E api.md \u4E2D\u5BF9\u5E94 API \u7684\u5B9A\u4E49\u5B8C\u5168\u4E00\u81F4**
1731
+ - \u65B9\u6CD5\u540D = api.md \u4E2D\u7684 operationName
1732
+ - \u53C2\u6570\u7C7B\u578B = api.md \u4E2D\u7684 RequestType
1733
+ - \u8FD4\u56DE\u7C7B\u578B = api.md \u4E2D\u7684 ResponseType
1734
+ - **\u5E94\u7528\u670D\u52A1\uFF08AppService\uFF09\u7684\u65B9\u6CD5\u7B7E\u540D\u5FC5\u987B\u4E0E\u8FDC\u7A0B\u670D\u52A1\uFF08Command/Query\uFF09\u7684\u63A5\u53E3\u4FDD\u6301\u4E00\u81F4**
1735
+ - AppService \u7684\u65B9\u6CD5\u540D\u4E0E Command/Query \u7684\u65B9\u6CD5\u540D\u4E00\u81F4
1736
+ - \u53C2\u6570\u548C\u8FD4\u56DE\u7C7B\u578B\u4FDD\u6301\u4E00\u81F4
1737
+
1738
+ **\u89D2\u8272\u6784\u9020\u578B\u5B9A\u4E49**\uFF1A
1739
+
1740
+ | \u89D2\u8272 | \u5C42 | \u5305\u4F4D\u7F6E | \u547D\u540D\u89C4\u8303 | \u989C\u8272 |
1741
+ |------|---|--------|---------|------|
1742
+ | \u547D\u4EE4 (Command) | api | api/command/ | *Command | \u767D\u8272 |
1743
+ | \u67E5\u8BE2 (Query) | api | api/query/ | *Query | \u767D\u8272 |
1744
+ | \u6D88\u606F (DTO) | api | api/dto/ | *Request/*Response/*Event | \u6A59\u8272 |
1745
+ | \u5E94\u7528\u670D\u52A1 | application | application/ | *AppService | \u767D\u8272 |
1746
+ | \u9886\u57DF\u670D\u52A1 | domain | domain/service/ | *Service | \u7EFF\u8272 |
1747
+ | \u805A\u5408\u6839 | domain | domain/aggregate/ | \u9886\u57DF\u6A21\u578B\u5B9A\u4E49\u540D | \u6D45\u7EA2\u8272 |
1748
+ | \u7AEF\u53E3 (\u63A5\u53E3) | infrastructure | infrastructure/port/ | *Repository/*Client | \u767D\u8272 |
1749
+
1750
+ **\u89D2\u8272\u6784\u9020\u578B\u534F\u4F5C\u7EA6\u675F**\uFF1A
1751
+
1752
+ 1. **\u8FDC\u7A0B\u670D\u52A1\uFF08\u547D\u4EE4/\u67E5\u8BE2\uFF09\u53EA\u80FD\u8BBF\u95EE\u5E94\u7528\u670D\u52A1\u548C\u6D88\u606F**
1753
+ 2. **\u5E94\u7528\u670D\u52A1\u53EA\u80FD\u8BBF\u95EE\u9886\u57DF\u670D\u52A1\u3001\u7AEF\u53E3\u548C\u6D88\u606F**\uFF08\u4E0D\u80FD\u76F4\u63A5\u8BBF\u95EE\u805A\u5408\uFF09
1754
+ 3. **\u9886\u57DF\u670D\u52A1\u53EF\u4EE5\u8BBF\u95EE\u9886\u57DF\u670D\u52A1\u3001\u805A\u5408\u548C\u7AEF\u53E3**
1755
+ 4. **\u805A\u5408\u53EA\u80FD\u8BBF\u95EE\u5176\u4ED6\u805A\u5408**\uFF08\u4E0D\u80FD\u8BBF\u95EE\u9886\u57DF\u670D\u52A1\u3001\u7AEF\u53E3\u3001\u8FDC\u7A0B\u670D\u52A1\u6216\u6D88\u606F\uFF09
1756
+ 5. **\u7AEF\u53E3\u53EF\u4EE5\u8BBF\u95EE\u805A\u5408**
1757
+ 6. **\u6D88\u606F\u53EA\u80FD\u88AB\u8FDC\u7A0B\u670D\u52A1\u548C\u5E94\u7528\u670D\u52A1\u8BBF\u95EE**
1758
+
1759
+ ### \u6B65\u9AA4\u4E09\uFF1A\u5E8F\u5217\u56FE\u7ED8\u5236\uFF08PlantUML\uFF09
1760
+
1761
+ \`\`\`plantuml
1762
+ @startuml
1763
+ !theme plain
1764
+
1765
+ participant "CommandName" as CMD #FFFFFF
1766
+ participant "AppServiceName" as APP #FFFFFF
1767
+ participant "DomainService" as DS #CEF5CF
1768
+ participant "AggregateRoot" as AR #FFE6E6
1769
+ participant "Repository" as REPO #FFFFFF
1770
+ participant "Client" as CL #FFFFFF
1771
+
1772
+ box "\u5317\u5411\u7F51\u5173\u5C42\uFF08api + application\uFF09" #CCCCCC
1773
+ participant CMD
1774
+ participant APP
1775
+ end box
1776
+
1777
+ box "\u9886\u57DF\u5C42" #4CAF50
1778
+ participant DS
1779
+ participant AR
1780
+ end box
1781
+
1782
+ box "\u5357\u5411\u7F51\u5173\u5C42\uFF08infrastructure\uFF09" #CCCCCC
1783
+ participant REPO
1784
+ participant CL
1785
+ end box
1786
+
1787
+ CMD -> APP: operation(Request)
1788
+ activate APP
1789
+
1790
+ APP -> DS: domainMethod(params)
1791
+ activate DS
1792
+
1793
+ DS -> AR: aggregateMethod(data)
1794
+ activate AR
1795
+ AR --> DS: result
1796
+ deactivate AR
1797
+
1798
+ DS -> REPO: save(aggregate)
1799
+ activate REPO
1800
+ REPO --> DS: saved
1801
+ deactivate REPO
1802
+
1803
+ APP --> CMD: Response
1804
+ deactivate APP
1805
+
1806
+ @enduml
1807
+ \`\`\`
1808
+
1809
+ ---
1810
+
1811
+ ## \u8F93\u51FA\u6587\u6863\u683C\u5F0F
1812
+
1813
+ \u5199\u5165 **\`docs/sparrow/design/{slug}/model.md\`**\uFF1A
1814
+
1815
+ \`\`\`markdown
1816
+ # {\u9650\u754C\u4E0A\u4E0B\u6587\u4E2D\u6587\u540D} - \u9886\u57DF\u6A21\u578B\u5B9A\u4E49
1817
+
1818
+ ## 1. \u9759\u6001\u9886\u57DF\u6A21\u578B
1819
+
1820
+ ### 1.1 \u805A\u5408\u5B9A\u4E49
1821
+ #### \u805A\u54081\uFF1A{\u805A\u5408\u540D\u79F0}
1822
+ - **\u805A\u5408\u6839**\uFF1A{AggregateRootName}
1823
+ - **\u5B9E\u4F53**\uFF1A{Entity1}, {Entity2}
1824
+ - **\u503C\u5BF9\u8C61**\uFF1A{VO1}, {VO2}
1825
+
1826
+ ### 1.2 \u9886\u57DF\u6A21\u578B\u7C7B\u56FE
1827
+ [PlantUML \u7C7B\u56FE \u2014 UML \u547D\u540D\u98CE\u683C]
1828
+
1829
+ ## 2. \u52A8\u6001\u9886\u57DF\u6A21\u578B
1830
+
1831
+ > \u4EE5\u4E0B\u6BCF\u4E2A API \u5165\u53E3\u6765\u81EA docs/sparrow/design/{slug}/api.md
1832
+
1833
+ ### 2.1 API\uFF1A{API\u540D\u79F0}\uFF08\u6765\u81EA api.md\uFF09
1834
+
1835
+ **API \u5B9A\u4E49**\uFF1A\`POST /api/v1/resource\`
1836
+
1837
+ #### \u4EFB\u52A1\u6811
1838
+ \`\`\`
1839
+ {CommandName}.{method}(Request): Response \u2190 API \u5165\u53E3\uFF08\u4E0E api.md \u4E00\u81F4\uFF09
1840
+ \u251C\u2500\u2500 {AppService}.{method}(Request): Response \u2190 \u5E94\u7528\u670D\u52A1\uFF08\u7B7E\u540D\u4E0E Command \u4E00\u81F4\uFF09
1841
+ \u2502 \u251C\u2500\u2500 {DomainService}.{method}(params): result \u2190 \u9886\u57DF\u670D\u52A1
1842
+ \u2502 \u2502 \u251C\u2500\u2500 {Aggregate}.{method}(data): result \u2190 \u805A\u5408\u64CD\u4F5C\uFF08\u539F\u5B50\u4EFB\u52A1\uFF09
1843
+ \u2502 \u2502 \u2514\u2500\u2500 {Repository}.{save}(aggregate) \u2190 \u7AEF\u53E3\u8C03\u7528\uFF08\u539F\u5B50\u4EFB\u52A1\uFF09
1844
+ \u2502 \u2514\u2500\u2500 {Client}.{call}(params): result \u2190 \u5916\u90E8\u8C03\u7528\uFF08\u539F\u5B50\u4EFB\u52A1\uFF09
1845
+ \`\`\`
1846
+
1847
+ #### \u89D2\u8272\u5206\u914D
1848
+ \`\`\`
1849
+ {\u6839\u4EFB\u52A1} \u2192 {Command}.{method}(Request): Response
1850
+ \u251C\u2500\u2500 {\u7EC4\u5408\u4EFB\u52A1} \u2192 {AppService}.{method}(Request): Response
1851
+ \u2502 \u251C\u2500\u2500 {\u539F\u5B50\u4EFB\u52A11} \u2192 {DomainService}.{method}(params): result
1852
+ \u2502 \u2502 \u251C\u2500\u2500 {Aggregate}.{method}(data): result
1853
+ \u2502 \u2502 \u2514\u2500\u2500 {Repository}.{save}(aggregate)
1854
+ \u2502 \u2514\u2500\u2500 {\u539F\u5B50\u4EFB\u52A12} \u2192 {Client}.{call}(params): result
1855
+ ...
1856
+ \`\`\`
1857
+
1858
+ #### \u5E8F\u5217\u56FE
1859
+ [PlantUML \u5E8F\u5217\u56FE \u2014 \u5C55\u793A BC \u5185\u90E8\u5404\u89D2\u8272\u7684\u534F\u4F5C]
1860
+
1861
+ ### 2.2 API\uFF1A{\u4E0B\u4E00\u4E2AAPI\u540D\u79F0}
1862
+ ...
1863
+
1864
+ ## 3. \u89D2\u8272\u804C\u8D23\u5B9A\u4E49
1865
+ [\u5404\u89D2\u8272\u53CA\u5176\u804C\u8D23\u7684\u603B\u7ED3]
1866
+ \`\`\`
1867
+
1868
+ **\u547D\u540D\u7EA6\u5B9A\uFF08UML \u98CE\u683C\uFF09**\uFF1A
1869
+ - \u7C7B\u540D\uFF1APascalCase\uFF08\u5982 \`OrderCommand\`\u3001\`OrderAppService\`\uFF09
1870
+ - \u65B9\u6CD5\u540D\uFF1AcamelCase\uFF08\u5982 \`placeOrder()\`\u3001\`getOrderById()\`\uFF09
1871
+ - \u5C5E\u6027\u540D\uFF1AcamelCase\uFF08\u5982 \`orderId\`\u3001\`customerName\`\uFF09
1872
+ - \u547D\u540D\u7A7A\u95F4/\u5305\uFF1Adot.case\uFF08\u5982 \`com.sparrow.order\`\uFF09
1873
+
1874
+ > \u4EE3\u7801\u5B9E\u73B0\u65F6\uFF0C\u547D\u540D\u5C06\u6839\u636E\u5177\u4F53\u5F00\u53D1\u8BED\u8A00\u7684\u4E60\u60EF\u8FDB\u884C\u8F6C\u6362\uFF08\u53C2\u89C1 sparrow-apply \u4E2D\u7684\u547D\u540D\u89C4\u8303\uFF09\u3002
1875
+
1876
+ ## \u8D28\u91CF\u68C0\u67E5\u6E05\u5355
1877
+
1878
+ ### \u9759\u6001\u6A21\u578B
1879
+ - [ ] \u6240\u6709\u6838\u5FC3\u6982\u5FF5\u90FD\u5DF2\u8BC6\u522B\u4E3A\u5B9E\u4F53\u6216\u503C\u5BF9\u8C61
1880
+ - [ ] \u805A\u5408\u8FB9\u754C\u6E05\u6670\uFF0C\u805A\u5408\u6839\u660E\u786E
1881
+ - [ ] \u5B9E\u4F53\u95F4\u5173\u7CFB\u6B63\u786E\u5EFA\u6A21
1882
+ - [ ] \u503C\u5BF9\u8C61\u4E0D\u53EF\u53D8\u4E14\u81EA\u5305\u542B
1883
+ - [ ] \u7C7B\u56FE\u989C\u8272\u89C4\u8303\u6B63\u786E\uFF08\u805A\u5408\u6839=\u6D45\u7EA2\uFF0C\u5B9E\u4F53=\u9EC4\uFF0C\u503C\u5BF9\u8C61=\u84DD\uFF09
1884
+ - [ ] PlantUML \u7C7B\u56FE\u8BED\u6CD5\u6B63\u786E
1885
+
1886
+ ### \u52A8\u6001\u6A21\u578B
1887
+ - [ ] **\u6BCF\u4E2A api.md \u4E2D\u7684 API \u90FD\u6709\u5BF9\u5E94\u7684\u4EFB\u52A1\u6811\u5165\u53E3**\uFF08\u4E0D\u9057\u6F0F\uFF09
1888
+ - [ ] **\u8FDC\u7A0B\u670D\u52A1\uFF08Command/Query\uFF09\u7684\u63A5\u53E3\u7B7E\u540D\u4E0E api.md \u7684 API \u5B9A\u4E49\u4E00\u81F4**
1889
+ - [ ] **\u5E94\u7528\u670D\u52A1\u7684\u65B9\u6CD5\u7B7E\u540D\u4E0E\u8FDC\u7A0B\u670D\u52A1\u63A5\u53E3\u4E00\u81F4**
1890
+ - [ ] \u4EFB\u52A1\u6811\u7ED3\u6784\u6E05\u6670\uFF0C\u5C42\u6B21\u5408\u7406\uFF08API \u2192 AppService \u2192 DomainService \u2192 Aggregate/Port\uFF09
1891
+ - [ ] \u539F\u5B50\u4EFB\u52A1\u5224\u65AD\u51C6\u786E
1892
+ - [ ] \u89D2\u8272\u5206\u914D\u7B26\u5408\u6784\u9020\u578B\u5B9A\u4E49
1893
+ - [ ] \u5E8F\u5217\u56FE\u5B8C\u6574\uFF0C\u5C55\u793A BC \u5185\u90E8\u6240\u6709\u5FC5\u8981\u4EA4\u4E92
1894
+ - [ ] \u5E8F\u5217\u56FE\u989C\u8272\u89C4\u8303\u6B63\u786E
1895
+ - [ ] PlantUML \u5E8F\u5217\u56FE\u8BED\u6CD5\u6B63\u786E\uFF0C\u4F7F\u7528 box \u5206\u7EC4
1896
+ - [ ] \u89D2\u8272\u534F\u4F5C\u7EA6\u675F\u5F97\u5230\u4E25\u683C\u9075\u5B88
1897
+ - [ ] \u5E8F\u5217\u56FE\u6D88\u606F\u6D41\u4E0E\u4EFB\u52A1\u6811\u6267\u884C\u6D41\u7A0B\u5B8C\u5168\u5BF9\u5E94
1898
+
1899
+ ### \u6A21\u578B\u4E00\u81F4\u6027
1900
+ - [ ] \u9759\u6001\u6A21\u578B\u4E2D\u7684\u805A\u5408\u3001\u5B9E\u4F53\u3001\u503C\u5BF9\u8C61\u5728\u52A8\u6001\u6A21\u578B\u7684\u5E8F\u5217\u56FE\u4E2D\u6B63\u786E\u4F7F\u7528
1901
+ - [ ] \u7C7B\u56FE\u4E2D\u7684\u65B9\u6CD5\u4E0E\u5E8F\u5217\u56FE\u4E2D\u7684\u6D88\u606F\u8C03\u7528\u4E00\u81F4
1902
+ - [ ] UML \u547D\u540D\u98CE\u683C\u7EDF\u4E00\uFF08PascalCase \u7C7B\u540D\uFF0CcamelCase \u65B9\u6CD5/\u5C5E\u6027\uFF09
1903
+
1904
+ ## \u5B8C\u6210\u540E\u7684\u4E0B\u4E00\u6B65
1905
+
1906
+ \u2705 \u5B8C\u6210 sparrow-model @{slug} \u540E\uFF0C\u8BF7\u6267\u884C **sparrow-plan @{slug}**\uFF08\u56E2\u961F\u7EA7\uFF09\u2014\u2014 \u57FA\u4E8E spec/api/tech/model \u5236\u8BA2\u5B9E\u73B0\u8BA1\u5212\u3002
1907
+ `;
1908
+ function register4() {
1909
+ registerSkillTemplate("sparrow-model", () => MODEL_BODY);
1910
+ }
1911
+
1912
+ // src/skills/plan.ts
1913
+ var PLAN_BODY = `# Sparrow Plan \u2014 \u5B9E\u73B0\u8BA1\u5212\u5236\u8BA2
1914
+
1915
+ ## \u6267\u884C\u987A\u5E8F\u68C0\u67E5
1916
+
1917
+ \`\`\`
1918
+ \u5F53\u524D\u6B65\u9AA4\uFF1Asparrow-plan\uFF08\u7B2C 5 \u6B65 / \u5171 6 \u6B65\uFF09
1919
+ \u6240\u5C5E\u5C42\u7EA7\uFF1A\u56E2\u961F\u7EA7\uFF08team-level\uFF09\uFF0C\u9488\u5BF9\u7279\u5B9A\u9650\u754C\u4E0A\u4E0B\u6587
1920
+ \u524D\u7F6E\u6761\u4EF6\uFF08\u5FC5\u987B\u5168\u90E8\u5B58\u5728\uFF09\uFF1A
1921
+ 1. docs/sparrow/design/{slug}/spec.md
1922
+ 2. docs/sparrow/design/{slug}/api.md
1923
+ 3. docs/sparrow/design/{slug}/tech.md
1924
+ 4. docs/sparrow/design/{slug}/model.md
1925
+ \u4E0B\u4E00\u6B65\u9AA4\uFF1Asparrow-apply @{slug}\uFF08\u56E2\u961F\u7EA7\uFF09
1926
+ \`\`\`
1927
+
1928
+ **\u524D\u7F6E\u6761\u4EF6\u68C0\u67E5**\uFF1A
1929
+ - \u5982\u679C\u4E0A\u8FF0\u4EFB\u4E00\u524D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u63D0\u793A\u7528\u6237\u7F3A\u5C11\u54EA\u4E2A\u6587\u4EF6\uFF0C\u4EE5\u53CA\u9700\u8981\u5148\u6267\u884C\u4EC0\u4E48\u6B65\u9AA4
1930
+ - \u5982\u679C\u7528\u6237\u672A\u6307\u5B9A\u9650\u754C\u4E0A\u4E0B\u6587\uFF0C\u8BF7\u5217\u51FA\u53EF\u7528\u7684\u9650\u754C\u4E0A\u4E0B\u6587\u8BA9\u7528\u6237\u9009\u62E9
1931
+ - \u5982\u679C\u76EE\u6807\u6587\u4EF6\u5DF2\u5B58\u5728\uFF0C\u8BF7\u53C2\u8003\u4E0B\u65B9"\u8F93\u51FA\u6587\u4EF6\u5B58\u5728\u6027\u68C0\u67E5"\u7AE0\u8282\u5904\u7406
1932
+
1933
+ ---
1934
+
1935
+ ## \u{1F6D1} \u8F93\u51FA\u6587\u4EF6\u5B58\u5728\u6027\u68C0\u67E5\uFF08\u5FC5\u987B\u5728\u751F\u6210\u524D\u6267\u884C\uFF09
1936
+
1937
+ \u5728\u5F00\u59CB\u751F\u6210\u5185\u5BB9\u4E4B\u524D\uFF0C\u8BF7\u68C0\u67E5\u4EE5\u4E0B\u8F93\u51FA\u6587\u4EF6\u662F\u5426\u5DF2\u7ECF\u5B58\u5728\uFF1A
1938
+
1939
+ - \`docs/sparrow/design/{slug}/plan.md\`
1940
+
1941
+ \u5982\u679C\u6587\u4EF6\u5DF2\u5B58\u5728\uFF0C\u8BF7**\u8BA9\u7528\u6237\u8FDB\u884C\u9009\u62E9**\uFF1A
1942
+
1943
+ - **\u8DF3\u8FC7 (skip)**\uFF1A\u4FDD\u7559\u5DF2\u6709\u6587\u4EF6\uFF0C\u4E0D\u6267\u884C\u4EFB\u4F55\u751F\u6210\u64CD\u4F5C\uFF0C\u505C\u6B62\u6267\u884C
1944
+ - **\u8986\u76D6 (overwrite)**\uFF1A\u5220\u9664\u5DF2\u6709\u6587\u4EF6\uFF0C\u91CD\u65B0\u751F\u6210\u5168\u65B0\u7684\u5185\u5BB9
1945
+ - **\u66F4\u65B0 (update)**\uFF1A\u5728\u5DF2\u6709\u6587\u4EF6\u57FA\u7840\u4E0A\u8FDB\u884C\u4FEE\u6539\u548C\u5B8C\u5584
1946
+
1947
+ > \u26A0\uFE0F \u4E00\u6B21\u547D\u4EE4\u53EA\u786E\u8BA4\u4E00\u6B21\uFF0C\u7528\u6237\u7684\u9009\u62E9\u5E94\u7528\u4E8E\u6240\u6709\u8F93\u51FA\u6587\u4EF6\u3002
1948
+
1949
+ ---
1950
+
1951
+ ## \u{1F4CB} project.md \u66F4\u65B0
1952
+
1953
+ \u5B8C\u6210\u8F93\u51FA\u540E\uFF0C**\u5FC5\u987B**\u66F4\u65B0 \`docs/sparrow/project.md\`\uFF1A
1954
+
1955
+ 1. \u5982\u679C \`project.md\` \u4E0D\u5B58\u5728\uFF0C\u6839\u636E\u5F53\u524D\u9879\u76EE\u4FE1\u606F\u521B\u5EFA\u5B83
1956
+ 2. \u5728"\u9650\u754C\u4E0A\u4E0B\u6587\u8BBE\u8BA1"\u90E8\u5206\uFF0C\u627E\u5230\u5F53\u524D \`{slug}\` \u7684\u5B50\u7AE0\u8282
1957
+ 3. \u66F4\u65B0 \`plan.md\` \u7684\u72B6\u6001\u4ECE \`_\u5F85\u751F\u6210_\` \u6539\u4E3A \`_v{version}_\`
1958
+ 4. \u66F4\u65B0\u6587\u4EF6\u5934\u90E8\u7684"\u6700\u540E\u66F4\u65B0"\u65F6\u95F4\u6233
1959
+
1960
+ **project.md \u8DEF\u5F84**: \`docs/sparrow/project.md\`
1961
+
1962
+ ---
1963
+
1964
+ ## \u{1F4CC} \u7248\u672C\u5143\u6570\u636E\u7BA1\u7406
1965
+
1966
+ \u6240\u6709\u8F93\u51FA\u7684\u6587\u6863\u6587\u4EF6**\u5FC5\u987B\u5728\u6587\u4EF6\u5F00\u5934**\u5305\u542B\u7248\u672C\u5143\u6570\u636E\u5757\uFF1A
1967
+
1968
+ \`\`\`markdown
1969
+ <!--
1970
+ version: v1.0
1971
+ last-updated: {ISO_8601_TIMESTAMP}
1972
+ generated-by: sparrow-plan
1973
+ sparrow-version: {\u4ECE .sparrow/sparrow.json \u8BFB\u53D6}
1974
+ -->
1975
+ \`\`\`
1976
+
1977
+ **\u7248\u672C\u89C4\u5219**:
1978
+ - **\u65B0\u6587\u6863**: \u4F7F\u7528 \`v1.0\`
1979
+ - **\u66F4\u65B0\u5DF2\u6709\u6587\u6863**: \u8BFB\u53D6\u73B0\u6709\u7248\u672C\u53F7\uFF0C\u9012\u589E\u6B21\u7248\u672C\u53F7\uFF08\`v1.0\` \u2192 \`v1.1\`\uFF09
1980
+ - **\u91CD\u5927\u91CD\u5199**: \u9012\u589E\u4E3B\u7248\u672C\u53F7\uFF08\`v1.x\` \u2192 \`v2.0\`\uFF09
1981
+ - \u6BCF\u6B21\u4FEE\u6539\u90FD**\u5FC5\u987B\u53D8\u66F4**\u7248\u672C\u53F7
1982
+
1983
+ **\u64CD\u4F5C\u6B65\u9AA4**:
1984
+ 1. \u68C0\u67E5\u76EE\u6807\u6587\u4EF6\u662F\u5426\u5DF2\u5B58\u5728
1985
+ 2. \u5982\u679C\u5B58\u5728\uFF0C\u8BFB\u53D6\u6587\u4EF6\u5F00\u5934 \`<!--\` \u6CE8\u91CA\u5757\u4E2D\u7684 \`version:\` \u5B57\u6BB5\u5E76\u9012\u589E
1986
+ 3. \u5728\u6587\u4EF6\u5F00\u5934\u6DFB\u52A0\u6216\u66F4\u65B0\u7248\u672C\u5143\u6570\u636E\u5757
1987
+ 4. \u7EE7\u7EED\u751F\u6210\u6587\u6863\u6B63\u6587
1988
+
1989
+ ---
1990
+
1991
+ ## \u4EE3\u7801\u76EE\u5F55
1992
+
1993
+ \u4EA7\u54C1\u4EE3\u7801\u6839\u76EE\u5F55\u7EDF\u4E00\u4F7F\u7528 **\`backend/\`**\u3002\u591A\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u5171\u4EAB \`backend/\` \u76EE\u5F55\uFF0C\u5404\u4E0A\u4E0B\u6587\u4E3A\u8BE5\u4EE3\u7801\u9879\u76EE\u4E0B\u7684\u4E0D\u540C\u5305/\u6A21\u5757\u3002
1994
+
1995
+ > \`backend/\` \u76EE\u5F55\u5728\u9996\u6B21\u6267\u884C sparrow-apply \u65F6\u81EA\u52A8\u521B\u5EFA\u3002
1996
+
1997
+ ---
1998
+
1999
+ ## \u89D2\u8272\u5B9A\u4E49
2000
+
2001
+ \u4F60\u662F\u4E00\u540D **Planner**\uFF0C\u8D1F\u8D23\u8BFB\u53D6\u5F53\u524D\u9650\u754C\u4E0A\u4E0B\u6587\u7684\u6240\u6709\u8BBE\u8BA1\u6587\u6863\uFF0C\u7ECF\u63A8\u7406\u540E\u8F93\u51FA\u5B9E\u73B0\u8BA1\u5212\u3002
2002
+
2003
+ ## \u5FC5\u8BFB\u8F93\u5165
2004
+
2005
+ - \`docs/sparrow/design/{slug}/spec.md\` \u2014 \u573A\u666F\u4E0E\u9A8C\u6536
2006
+ - \`docs/sparrow/design/{slug}/api.md\` \u2014 \u5BF9\u5916\u5951\u7EA6
2007
+ - \`docs/sparrow/design/{slug}/tech.md\` \u2014 \u6280\u672F\u6808\u4E0E\u5DE5\u5177\u94FE
2008
+ - \`docs/sparrow/design/{slug}/model.md\` \u2014 \u9886\u57DF\u9759\u6001/\u52A8\u6001\u6A21\u578B
2009
+
2010
+ ## \u8F93\u51FA
2011
+
2012
+ \u5199\u5165 **\`docs/sparrow/design/{slug}/plan.md\`**
2013
+
2014
+ ---
2015
+
2016
+ ## \u4EFB\u52A1\uFF08Task\uFF09\u683C\u5F0F
2017
+
2018
+ \u6BCF\u4E2A\u4EFB\u52A1\u4F7F\u7528\u4E8C\u7EA7\u6807\u9898\u5F15\u5165\uFF0C\u6807\u9898\u5FC5\u987B\u4EE5 \`## \u4EFB\u52A1\` \u5F00\u5934\uFF1A
2019
+
2020
+ \`\`\`markdown
2021
+ ## \u4EFB\u52A1 1\uFF1A{\u4EFB\u52A1\u6807\u9898}
2022
+
2023
+ **\u6267\u884C\u65B9**\uFF1A\`dev\`\uFF08\u4EA7\u54C1\u4EE3\u7801\uFF0C\u542B\u9886\u57DF\u5C42 TDD\uFF09\u6216 \`qa\`\uFF08\u4EC5\u96C6\u6210/API \u6D4B\u8BD5\uFF09
2024
+ **\u53EF\u5E76\u884C**\uFF1A\`\u5426\`\uFF08\u662F\u5426\u53EF\u4E0E\u5176\u4ED6\u6807\u8BB0\u4E3A"\u53EF\u5E76\u884C\uFF1A\u662F"\u7684\u4EFB\u52A1\u5E76\u884C\u6267\u884C\uFF09
2025
+
2026
+ ### \u6B65\u9AA4
2027
+
2028
+ - [ ] \u7B2C\u4E00\u6B65\u8BF4\u660E
2029
+ - [ ] \u7B2C\u4E8C\u6B65\u8BF4\u660E
2030
+ \`\`\`
2031
+
2032
+ ### \u6267\u884C\u65B9\u8BF4\u660E
2033
+
2034
+ - **\`qa\`**\uFF1A\u96C6\u6210\u6D4B\u8BD5\u3001API/\u5951\u7EA6\u6D4B\u8BD5\u7B49\uFF0C\u5199\u5165 \`integration-tests/{slug}/\`\uFF0C**\u4E0D\u5F97\u5305\u542B\u9886\u57DF\u5C42\u5355\u5143\u6D4B\u8BD5**
2035
+ - **\`dev\`**\uFF1A\u4EA7\u54C1\u6A21\u5757\u4E0B DDD \u56DB\u5C42\u4E0E\u9886\u57DF TDD\uFF08\u5355\u5143\u6D4B\u8BD5\u4E0E\u4EA7\u54C1\u4EE3\u7801\u5747\u5728\u4EA7\u54C1\u6A21\u5757\u5185\uFF09
2036
+
2037
+ ### \u805A\u5408\u7C92\u5EA6\u4E0E\u6B65\u9AA4\u5408\u5E76
2038
+
2039
+ - \u540C\u4E00\u805A\u5408\u6839\u7684\u9886\u57DF\u5C42\u5B9E\u73B0\u5E94\u5C3D\u91CF\u5199\u5728\u540C\u4E00 \`- [ ]\` \u6B65\u9AA4\u4E2D
2040
+ - \u7981\u6B62\u4E3A\u540C\u4E00\u805A\u5408\u62C6\u6210\u300C\u5148\u5199\u6D4B\u8BD5\u300D\u300C\u518D\u5199\u5B9E\u73B0\u300D\u300C\u518D\u5199\u503C\u5BF9\u8C61\u300D\u7B49\u591A\u6761\u72EC\u7ACB checklist
2041
+ - \u4E0D\u540C\u805A\u5408\u3001\u6216\u4EA7\u54C1\u4EE3\u7801\u4E0E\u96C6\u6210\u6D4B\u8BD5\u4E4B\u95F4\u53EF\u5206\u4EFB\u52A1
2042
+
2043
+ ---
2044
+
2045
+ ## \u4EFB\u52A1\u6392\u5E8F\u89C4\u5219\uFF08DDD \u5206\u5C42\u4F9D\u8D56\uFF09
2046
+
2047
+ \u4EFB\u52A1\u6392\u5217\u987A\u5E8F\u5FC5\u987B\u9075\u5FAA DDD \u5206\u5C42\u4F9D\u8D56\u5173\u7CFB\uFF0C\u4ECE\u5185\u5C42\u5411\u5916\u5C42\uFF1A
2048
+
2049
+ | \u987A\u5E8F | \u5C42\u6B21 | \u5185\u5BB9 |
2050
+ |------|------|------|
2051
+ | 1 | **\u811A\u624B\u67B6 + \u4F9D\u8D56** | \u9879\u76EE\u521D\u59CB\u5316\u3001\u6784\u5EFA\u811A\u672C\u3001\u4F9D\u8D56\u58F0\u660E |
2052
+ | 2 | **\u9886\u57DF\u5C42** | domain/aggregate\u3001entity\u3001valueobject\u3001service |
2053
+ | 3 | **\u57FA\u7840\u8BBE\u65BD\u5C42** | infrastructure/port/ + adapter/ |
2054
+ | 4 | **\u5E94\u7528\u5C42** | application/\uFF08AppService\uFF09 |
2055
+ | 5 | **api \u5C42** | api/dto\u3001api/command\u3001api/query |
2056
+
2057
+ ---
2058
+
2059
+ ## \u4EE3\u7801\u6A21\u5757\u5E03\u5C40
2060
+
2061
+ ### \u6838\u5FC3\u539F\u5219
2062
+
2063
+ - **\u4E00\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587 = \u4E00\u4E2A\u4EA7\u54C1\u6A21\u5757**\uFF0C\u6839\u76EE\u5F55\u4E3A **\`backend/\`**
2064
+ - \u56DB\u5C42\uFF08api\u3001application\u3001domain\u3001infrastructure\uFF09\u4EE5\u5305/\u76EE\u5F55\u5212\u5206
2065
+ - **\u96C6\u6210/API \u6D4B\u8BD5**\u5728 **\`integration-tests/{slug}/\`** \u4E0B
2066
+ - **\u7981\u6B62**\u5C06\u5404\u5C42\u62C6\u4E3A Maven/npm/Cargo \u5B50\u6A21\u5757
2067
+
2068
+ ### \u8DE8\u8BED\u8A00 DDD \u56DB\u5C42\u5E03\u5C40
2069
+
2070
+ \u5C06\u4EE5\u4E0B\u76EE\u5F55\u7ED3\u6784\u5E94\u7528\u5230 plan \u4E2D\u7684\u6B65\u9AA4\u63CF\u8FF0\uFF1A
2071
+
2072
+ **Java (Maven)**\uFF1A
2073
+ \`\`\`
2074
+ backend/
2075
+ src/main/java/{basePackage}/
2076
+ api/command/
2077
+ api/query/
2078
+ api/dto/
2079
+ application/
2080
+ domain/aggregate/
2081
+ domain/entity/
2082
+ domain/valueobject/
2083
+ domain/service/
2084
+ infrastructure/port/repository/
2085
+ infrastructure/port/client/
2086
+ infrastructure/adapter/repository/
2087
+ infrastructure/adapter/client/
2088
+ src/test/java/{basePackage}/
2089
+ domain/...
2090
+ \`\`\`
2091
+
2092
+ **Python (uv/pip)**\uFF1A
2093
+ \`\`\`
2094
+ backend/
2095
+ {package}/api/command/
2096
+ {package}/api/query/
2097
+ {package}/api/dto/
2098
+ {package}/application/
2099
+ {package}/domain/aggregate/
2100
+ {package}/domain/entity/
2101
+ {package}/domain/valueobject/
2102
+ {package}/domain/service/
2103
+ {package}/infrastructure/port/repository/
2104
+ {package}/infrastructure/port/client/
2105
+ {package}/infrastructure/adapter/repository/
2106
+ {package}/infrastructure/adapter/client/
2107
+ tests/{package}/domain/...
2108
+ \`\`\`
2109
+
2110
+ **Node.js (TypeScript)**\uFF1A
2111
+ \`\`\`
2112
+ backend/
2113
+ src/api/command/
2114
+ src/api/query/
2115
+ src/api/dto/
2116
+ src/application/
2117
+ src/domain/aggregate/
2118
+ src/domain/entity/
2119
+ src/domain/valueobject/
2120
+ src/domain/service/
2121
+ src/infrastructure/port/repository/
2122
+ src/infrastructure/port/client/
2123
+ src/infrastructure/adapter/repository/
2124
+ src/infrastructure/adapter/client/
2125
+ tests/domain/...
2126
+ \`\`\`
2127
+
2128
+ **Go**\uFF1A
2129
+ \`\`\`
2130
+ backend/
2131
+ cmd/
2132
+ internal/api/command/
2133
+ internal/api/query/
2134
+ internal/api/dto/
2135
+ internal/application/
2136
+ internal/domain/aggregate/
2137
+ internal/domain/entity/
2138
+ internal/domain/valueobject/
2139
+ internal/domain/service/
2140
+ internal/infrastructure/port/repository/
2141
+ internal/infrastructure/port/client/
2142
+ internal/infrastructure/adapter/repository/
2143
+ internal/infrastructure/adapter/client/
2144
+ \`\`\`
2145
+
2146
+ **Rust**\uFF1A
2147
+ \`\`\`
2148
+ backend/
2149
+ src/api/command/
2150
+ src/api/query/
2151
+ src/api/dto/
2152
+ src/application/
2153
+ src/domain/aggregate/
2154
+ src/domain/entity/
2155
+ src/domain/valueobject/
2156
+ src/domain/service/
2157
+ src/infrastructure/port/repository/
2158
+ src/infrastructure/port/client/
2159
+ src/infrastructure/adapter/repository/
2160
+ src/infrastructure/adapter/client/
2161
+ src/lib.rs
2162
+ tests/
2163
+ \`\`\`
2164
+
2165
+ **C++ (CMake + Conan/vcpkg)**\uFF1A
2166
+ \`\`\`
2167
+ backend/
2168
+ src/api/command/
2169
+ src/api/query/
2170
+ src/api/dto/
2171
+ src/application/
2172
+ src/domain/aggregate/
2173
+ src/domain/entity/
2174
+ src/domain/valueobject/
2175
+ src/domain/service/
2176
+ src/infrastructure/port/repository/
2177
+ src/infrastructure/port/client/
2178
+ src/infrastructure/adapter/repository/
2179
+ src/infrastructure/adapter/client/
2180
+ tests/
2181
+ CMakeLists.txt
2182
+ \`\`\`
2183
+
2184
+ ---
2185
+
2186
+ ## \u4EFB\u52A1\u5B8C\u6574\u6027\u68C0\u67E5\u8868
2187
+
2188
+ \u4ECE\u4E0B\u5217\u89D2\u5EA6\u81EA\u68C0\uFF0C\u907F\u514D\u9057\u6F0F\uFF1A
2189
+
2190
+ | \u89D2\u5EA6 | \u5E94\u8986\u76D6\u7684\u5178\u578B\u6B65\u9AA4 |
2191
+ |------|-----------------|
2192
+ | spec | \u4E0E\u5173\u952E\u573A\u666F\u5BF9\u5E94\u7684\u5B9E\u73B0\u4E0E\u9A8C\u8BC1 |
2193
+ | api | \u5951\u7EA6\u6D4B\u8BD5\u3001\u63A7\u5236\u5668\u5F62\u72B6\u4E0E\u9519\u8BEF\u7801 |
2194
+ | model | \u805A\u5408/\u5B9E\u4F53/\u503C\u5BF9\u8C61/\u9886\u57DF\u670D\u52A1\u4E0E\u5E8F\u5217\u56FE\u7EA6\u675F |
2195
+ | tech | \u811A\u624B\u67B6\u3001\u9009\u5B9A\u6D4B\u8BD5\u4E0E\u6784\u5EFA\u547D\u4EE4 |
2196
+ | \u96C6\u6210/API \u6D4B\u8BD5 | \u5728\u96C6\u6210\u6D4B\u8BD5\u76EE\u5F55\u521B\u5EFA\u6D4B\u8BD5\u5DE5\u7A0B |
2197
+ | \u4EA7\u54C1\u4EE3\u7801 | \u6309\u805A\u5408\u5408\u5E76\u7684\u9886\u57DF TDD\u3001\u5E94\u7528\u5C42\u4E0E\u57FA\u7840\u8BBE\u65BD |
2198
+ | \u4F9D\u8D56\u4E0E\u6784\u5EFA | \u5355\u72EC\u4E00\u6B65\u5199\u660E\u4F9D\u8D56\u5B89\u88C5\u547D\u4EE4 |
2199
+
2200
+ ---
2201
+
2202
+ ## \u7981\u6B62\u4E8B\u9879
2203
+
2204
+ - \u4E0D\u8981\u81C6\u9020 api.md / model.md \u4E2D\u4E0D\u5B58\u5728\u7684 API \u6216\u805A\u5408
2205
+ - \u4E0D\u8981\u5728 plan.md \u4E2D\u5D4C\u5165\u5B8C\u6574\u5927\u6BB5\u89C4\u7EA6\u539F\u6587
2206
+ - **\u7981\u6B62**\u521B\u5EFA\u6309\u5C42\u62C6\u5206\u7684 Maven/npm/Cargo \u5B50\u6A21\u5757
2207
+ - **\u7981\u6B62**\u5C06\u96C6\u6210\u6D4B\u8BD5\u4F5C\u4E3A\u4EA7\u54C1\u4EE3\u7801\u5B50\u6A21\u5757
2208
+ - **\u7981\u6B62**\u51FA\u73B0 \`application/command\`\u3001\`application/query\`\u3001\`interfaces/\` \u7B49\u76EE\u5F55\u7ED3\u6784
2209
+
2210
+ ---
2211
+
2212
+ ## \u793A\u4F8B Plan \u7ED3\u6784
2213
+
2214
+ \`\`\`markdown
2215
+ # \u5B9E\u73B0\u8BA1\u5212 \u2014 {\u9650\u754C\u4E0A\u4E0B\u6587\u4E2D\u6587\u540D}
2216
+
2217
+ \u672C\u8BA1\u5212\u8986\u76D6 sparrow-apply \u9636\u6BB5\u7684\u6240\u6709\u5F00\u53D1\u4E0E\u6D4B\u8BD5\u4EFB\u52A1\u3002
2218
+
2219
+ ## \u4EFB\u52A1 1\uFF1A\u9879\u76EE\u811A\u624B\u67B6\u4E0E\u4F9D\u8D56\u914D\u7F6E
2220
+
2221
+ **\u6267\u884C\u65B9**\uFF1A\`dev\`
2222
+ **\u53EF\u5E76\u884C**\uFF1A\`\u5426\`
2223
+
2224
+ ### \u6B65\u9AA4
2225
+
2226
+ - [ ] \u5728 backend/ \u521B\u5EFA\u9879\u76EE\u811A\u624B\u67B6
2227
+ - [ ] \u914D\u7F6E\u4F9D\u8D56\u7BA1\u7406\u6587\u4EF6\uFF0C\u5B89\u88C5\u4F9D\u8D56
2228
+
2229
+ ## \u4EFB\u52A1 2\uFF1A{\u805A\u5408\u540D}\u9886\u57DF\u6A21\u578B\u843D\u5730
2230
+
2231
+ **\u6267\u884C\u65B9**\uFF1A\`dev\`
2232
+ **\u53EF\u5E76\u884C**\uFF1A\`\u5426\`
2233
+
2234
+ ### \u6B65\u9AA4
2235
+
2236
+ - [ ] \u5B9E\u73B0 {AggregateRoot} \u805A\u5408\u6839\u53CA\u5176\u5B9E\u4F53\u3001\u503C\u5BF9\u8C61\uFF08\u542B\u9886\u57DF TDD\uFF09\uFF1A\u521B\u5EFA aggregate\u3001entity\u3001valueobject \u76EE\u5F55\u4E0B\u7684\u6240\u6709\u6587\u4EF6\uFF0C\u5305\u542B\u5355\u5143\u6D4B\u8BD5
2237
+ - [ ] \u5B9E\u73B0 {DomainService} \u9886\u57DF\u670D\u52A1\u53CA\u5355\u5143\u6D4B\u8BD5
2238
+
2239
+ ## \u4EFB\u52A1 3\uFF1A\u57FA\u7840\u8BBE\u65BD\u5C42\u5B9E\u73B0
2240
+
2241
+ **\u6267\u884C\u65B9**\uFF1A\`dev\`
2242
+ **\u53EF\u5E76\u884C**\uFF1A\`\u5426\`
2243
+
2244
+ ### \u6B65\u9AA4
2245
+
2246
+ - [ ] \u5B9E\u73B0 Repository \u7AEF\u53E3\u4E0E\u9002\u914D\u5668
2247
+ - [ ] \u5B9E\u73B0\u5916\u90E8\u670D\u52A1 Client \u7AEF\u53E3\u4E0E\u9002\u914D\u5668
2248
+
2249
+ ## \u4EFB\u52A1 4\uFF1A\u5E94\u7528\u5C42\u5B9E\u73B0
2250
+
2251
+ **\u6267\u884C\u65B9**\uFF1A\`dev\`
2252
+ **\u53EF\u5E76\u884C**\uFF1A\`\u5426\`
2253
+
2254
+ ### \u6B65\u9AA4
2255
+
2256
+ - [ ] \u5B9E\u73B0 {Entity}AppService \u5E94\u7528\u670D\u52A1\u53CA\u5355\u5143\u6D4B\u8BD5
2257
+
2258
+ ## \u4EFB\u52A1 5\uFF1AAPI \u5C42\u5B9E\u73B0
2259
+
2260
+ **\u6267\u884C\u65B9**\uFF1A\`dev\`
2261
+ **\u53EF\u5E76\u884C**\uFF1A\`\u5426\`
2262
+
2263
+ ### \u6B65\u9AA4
2264
+
2265
+ - [ ] \u5B9E\u73B0 api/dto \u6D88\u606F\u5951\u7EA6
2266
+ - [ ] \u5B9E\u73B0 api/command \u547D\u4EE4\u5904\u7406\u5668
2267
+ - [ ] \u5B9E\u73B0 api/query \u67E5\u8BE2\u5904\u7406\u5668
2268
+
2269
+ ## \u4EFB\u52A1 6\uFF1A\u96C6\u6210\u6D4B\u8BD5
2270
+
2271
+ **\u6267\u884C\u65B9**\uFF1A\`qa\`
2272
+ **\u53EF\u5E76\u884C**\uFF1A\`\u662F\`
2273
+
2274
+ ### \u6B65\u9AA4
2275
+
2276
+ - [ ] \u5728 integration-tests/{slug}/ \u521B\u5EFA\u96C6\u6210\u6D4B\u8BD5\u5DE5\u7A0B
2277
+ - [ ] \u5B9E\u73B0 API \u5951\u7EA6\u6D4B\u8BD5
2278
+ - [ ] \u5B9E\u73B0\u96C6\u6210\u573A\u666F\u6D4B\u8BD5
2279
+
2280
+ ## \u4EFB\u52A1 7\uFF1A\u6784\u5EFA\u9A8C\u8BC1\u4E0E\u8BC4\u5BA1\u51C6\u5907
2281
+
2282
+ **\u6267\u884C\u65B9**\uFF1A\`dev\`
2283
+ **\u53EF\u5E76\u884C**\uFF1A\`\u5426\`
2284
+
2285
+ ### \u6B65\u9AA4
2286
+
2287
+ - [ ] \u8FD0\u884C\u5B8C\u6574\u6784\u5EFA\u4E0E\u6D4B\u8BD5\u5957\u4EF6\uFF0C\u786E\u4FDD\u5168\u90E8\u901A\u8FC7
2288
+ \`\`\`
2289
+
2290
+ ## \u5B8C\u6210\u540E\u7684\u4E0B\u4E00\u6B65
2291
+
2292
+ \u2705 \u5B8C\u6210 sparrow-plan @{slug} \u540E\uFF0C\u8BF7\u6267\u884C **sparrow-apply @{slug}**\uFF08\u56E2\u961F\u7EA7\uFF09\u2014\u2014 \u6309 plan.md \u6267\u884C\u4EFB\u52A1\uFF0C\u751F\u6210 DDD \u56DB\u5C42\u4EE3\u7801\u3002
2293
+ `;
2294
+ function register5() {
2295
+ registerSkillTemplate("sparrow-plan", () => PLAN_BODY);
2296
+ }
2297
+
2298
+ // src/skills/apply.ts
2299
+ var APPLY_BODY = `# Sparrow Apply \u2014 \u6309\u5B9E\u73B0\u8BA1\u5212\u6267\u884C\u4EE3\u7801\u751F\u6210
2300
+
2301
+ ## \u6267\u884C\u987A\u5E8F\u68C0\u67E5
2302
+
2303
+ \`\`\`
2304
+ \u5F53\u524D\u6B65\u9AA4\uFF1Asparrow-apply\uFF08\u7B2C 6 \u6B65 / \u5171 6 \u6B65\uFF09
2305
+ \u6240\u5C5E\u5C42\u7EA7\uFF1A\u56E2\u961F\u7EA7\uFF08team-level\uFF09\uFF0C\u9488\u5BF9\u7279\u5B9A\u9650\u754C\u4E0A\u4E0B\u6587
2306
+ \u524D\u7F6E\u6761\u4EF6\uFF1Adocs/sparrow/design/{slug}/plan.md \u5FC5\u987B\u5B58\u5728
2307
+ \u540E\u7EED\u6B65\u9AA4\uFF1A\u65E0\uFF08\u8FD9\u662F\u6700\u540E\u4E00\u6B65\uFF0C\u4F46\u53EF\u4EE5\u5BF9\u5176\u4ED6\u9650\u754C\u4E0A\u4E0B\u6587\u7EE7\u7EED\u6267\u884C sparrow-design \u2192 sparrow-model \u2192 sparrow-plan \u2192 sparrow-apply\uFF09
2308
+ \`\`\`
2309
+
2310
+ **\u524D\u7F6E\u6761\u4EF6\u68C0\u67E5**\uFF1A
2311
+ - \u5982\u679C \`docs/sparrow/design/{slug}/plan.md\` \u4E0D\u5B58\u5728\uFF0C\u8BF7\u63D0\u793A\u7528\u6237\u5148\u6267\u884C **sparrow-plan @{slug}**
2312
+ - \u5982\u679C\u7528\u6237\u672A\u6307\u5B9A\u9650\u754C\u4E0A\u4E0B\u6587\uFF0C\u8BF7\u5217\u51FA\u53EF\u7528\u7684\u9650\u754C\u4E0A\u4E0B\u6587\u8BA9\u7528\u6237\u9009\u62E9
2313
+ - \u5982\u679C plan.md \u4E2D\u7684\u6240\u6709\u6B65\u9AA4\u90FD\u5DF2\u6807\u8BB0\u4E3A \`- [x]\`\uFF0C\u8BF4\u660E\u5F53\u524D\u4E0A\u4E0B\u6587\u5DF2\u6267\u884C\u5B8C\u6BD5
2314
+
2315
+ ---
2316
+
2317
+ ## \u4EE3\u7801\u76EE\u5F55\u68C0\u67E5
2318
+
2319
+ \u5728\u5F00\u59CB\u6267\u884C\u4E4B\u524D\uFF1A
2320
+
2321
+ 1. \u68C0\u67E5 \`backend/\` \u76EE\u5F55\u662F\u5426\u5DF2\u5B58\u5728\uFF1A
2322
+ - **\u5982\u679C\u5DF2\u5B58\u5728**\uFF1A\u76F4\u63A5\u4F7F\u7528\u8BE5\u76EE\u5F55\uFF0C\u4E0D\u91CD\u65B0\u521B\u5EFA\u9879\u76EE\u811A\u624B\u67B6
2323
+ - **\u5982\u679C\u4E0D\u5B58\u5728**\uFF1A\u521B\u5EFA\u8BE5\u76EE\u5F55\u53CA\u9879\u76EE\u811A\u624B\u67B6
2324
+
2325
+ > \u6240\u6709\u4EA7\u54C1\u4EE3\u7801\u7EDF\u4E00\u653E\u5728 \`backend/\` \u4E0B\u3002\u591A\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u5171\u4EAB\u8BE5\u76EE\u5F55\uFF0C\u5404\u4E0A\u4E0B\u6587\u4E3A\u4E0D\u540C\u7684\u5305/\u6A21\u5757\u3002
2326
+
2327
+ ---
2328
+
2329
+ ## \u89D2\u8272\u5B9A\u4E49
2330
+
2331
+ \u4F60\u9A71\u52A8\u4E09\u4E2A\u89D2\u8272\u6309 plan.md \u6267\u884C\u4EFB\u52A1\uFF1A
2332
+
2333
+ 1. **Development Engineer** (\`dev\`)\uFF1A\u4EA7\u54C1\u4EE3\u7801\uFF08DDD \u56DB\u5C42 + \u9886\u57DF TDD\uFF09
2334
+ 2. **QA Engineer** (\`qa\`)\uFF1A\u96C6\u6210\u6D4B\u8BD5\u3001API/\u5951\u7EA6\u6D4B\u8BD5
2335
+ 3. **Code Review**\uFF1A\u4EE3\u7801\u8BC4\u5BA1\uFF0C\u751F\u6210 code_review.md
2336
+
2337
+ ---
2338
+
2339
+ ## \u5FC5\u8BFB\u89C4\u7EA6
2340
+
2341
+ - \`docs/sparrow/design/{slug}/plan.md\` \u2014 \u6267\u884C\u8BA1\u5212\uFF08\u4EE5 plan \u4E3A\u51C6\u7684\u6267\u884C\u987A\u5E8F\uFF09
2342
+ - \`docs/sparrow/design/{slug}/spec.md\` \u2014 \u573A\u666F\u4E0E\u9A8C\u6536
2343
+ - \`docs/sparrow/design/{slug}/api.md\` \u2014 \u5BF9\u5916\u5951\u7EA6
2344
+ - \`docs/sparrow/design/{slug}/tech.md\` \u2014 \u6280\u672F\u6808\u4E0E\u5DE5\u5177\u94FE
2345
+ - \`docs/sparrow/design/{slug}/model.md\` \u2014 \u9886\u57DF\u6A21\u578B\uFF08\u9759\u6001 + \u52A8\u6001\uFF09
2346
+
2347
+ ---
2348
+
2349
+ ## \u4EE3\u7801\u4E0E\u6A21\u578B\u4E00\u81F4\u6027\uFF08\u6838\u5FC3\u7EA6\u675F\uFF09
2350
+
2351
+ \u4EE3\u7801\u5B9E\u73B0**\u5FC5\u987B**\u4E0E \`docs/sparrow/design/{slug}/model.md\` \u4E2D\u5B9A\u4E49\u7684\u9886\u57DF\u6A21\u578B\u4FDD\u6301\u4E25\u683C\u4E00\u81F4\u3002
2352
+
2353
+ ### \u9886\u57DF\u5C42\u4E00\u81F4\u6027
2354
+
2355
+ | model.md \u5143\u7D20 | \u4EE3\u7801\u5B9E\u73B0 | \u4E00\u81F4\u6027\u8981\u6C42 |
2356
+ |--------------|---------|-----------|
2357
+ | \u805A\u5408\u6839 | domain/aggregate/ | \u5C5E\u6027\u540D\u3001\u65B9\u6CD5\u540D\u3001\u7C7B\u578B\u5FC5\u987B\u4E0E\u7C7B\u56FE\u4E2D\u7684\u5B9A\u4E49\u4E00\u81F4 |
2358
+ | \u5B9E\u4F53 | domain/entity/ | \u5C5E\u6027\u540D\u3001\u65B9\u6CD5\u540D\u3001\u7C7B\u578B\u5FC5\u987B\u4E0E\u7C7B\u56FE\u4E2D\u7684\u5B9A\u4E49\u4E00\u81F4 |
2359
+ | \u503C\u5BF9\u8C61 | domain/valueobject/ | \u5C5E\u6027\u540D\u3001\u4E0D\u53EF\u53D8\u6027\u5FC5\u987B\u4E0E\u7C7B\u56FE\u4E2D\u7684\u5B9A\u4E49\u4E00\u81F4 |
2360
+ | \u9886\u57DF\u670D\u52A1 | domain/service/ | \u65B9\u6CD5\u7B7E\u540D\u5FC5\u987B\u4E0E\u5E8F\u5217\u56FE\u4E2D\u7684\u8C03\u7528\u4E00\u81F4 |
2361
+
2362
+ ### \u975E\u9886\u57DF\u5C42\u4E00\u81F4\u6027
2363
+
2364
+ | model.md \u4E2D\u7684\u89D2\u8272 | \u4EE3\u7801\u5B9E\u73B0 | \u4E00\u81F4\u6027\u8981\u6C42 |
2365
+ |------------------|---------|-----------|
2366
+ | \u8FDC\u7A0B\u670D\u52A1 (Command/Query) | api/command/ \u6216 api/query/ | \u65B9\u6CD5\u7B7E\u540D\u4E0E\u4EFB\u52A1\u6811\u6839\u8282\u70B9\u4E00\u81F4 |
2367
+ | \u5E94\u7528\u670D\u52A1 (AppService) | application/ | \u65B9\u6CD5\u7B7E\u540D\u4E0E\u4EFB\u52A1\u6811\u7B2C\u4E8C\u5C42\u4E00\u81F4 |
2368
+ | \u7AEF\u53E3 (Repository/Client) | infrastructure/port/ | \u63A5\u53E3\u65B9\u6CD5\u7B7E\u540D\u4E0E\u5E8F\u5217\u56FE\u4E2D\u7684\u7AEF\u53E3\u8C03\u7528\u4E00\u81F4 |
2369
+ | \u9002\u914D\u5668 | infrastructure/adapter/ | \u5B9E\u73B0 port \u63A5\u53E3\uFF0C\u65B9\u6CD5\u7B7E\u540D\u4E00\u81F4 |
2370
+
2371
+ ### \u547D\u540D\u98CE\u683C\u8F6C\u6362
2372
+
2373
+ **model.md \u4F7F\u7528 UML \u547D\u540D\u98CE\u683C**\uFF08PascalCase \u7C7B\u540D + camelCase \u65B9\u6CD5\u540D\uFF09\u3002\u4EE3\u7801\u5B9E\u73B0\u65F6\uFF0C\u9700\u8981\u6309\u7167\u9009\u5B9A\u8BED\u8A00\u7684\u7F16\u7801\u89C4\u8303\u8FDB\u884C\u8F6C\u6362\uFF1A
2374
+
2375
+ | \u5143\u7D20 | UML (model.md) | Java | Python | TypeScript | Go | Rust | C++ |
2376
+ |------|---------------|------|--------|------------|-----|------|-----|
2377
+ | \u7C7B/\u63A5\u53E3\u540D | PascalCase | PascalCase | PascalCase | PascalCase | PascalCase | PascalCase | PascalCase |
2378
+ | \u65B9\u6CD5/\u51FD\u6570\u540D | camelCase | camelCase | snake_case | camelCase | PascalCase | snake_case | snake_case |
2379
+ | \u5C5E\u6027/\u5B57\u6BB5\u540D | camelCase | camelCase | snake_case | camelCase | PascalCase | snake_case | snake_case |
2380
+ | \u6587\u4EF6\u540D | (\u65E0) | PascalCase | snake_case | kebab-case | snake_case | snake_case | snake_case |
2381
+ | \u5305/\u6A21\u5757\u540D | (\u65E0) | \u5168\u5C0F\u5199 | snake_case | kebab-case | \u5168\u5C0F\u5199 | snake_case | \u5168\u5C0F\u5199 |
2382
+
2383
+ > **\u5173\u952E**\uFF1A\u547D\u540D\u98CE\u683C\u53EF\u4EE5\u4E0D\u540C\uFF0C\u4F46**\u8BED\u4E49\u5FC5\u987B\u4E00\u81F4**\u3002\u4F8B\u5982 model.md \u4E2D\u7684 \`placeOrder()\` \u5728 Python \u4E2D\u5E94\u5199\u4E3A \`place_order()\`\uFF0C\u5728 Go \u4E2D\u5E94\u5199\u4E3A \`PlaceOrder()\`\u3002
2384
+
2385
+ ---
2386
+
2387
+ ## DDD \u56DB\u5C42 + \u83F1\u5F62\u5BF9\u79F0\u67B6\u6784
2388
+
2389
+ \`\`\`
2390
+ api \u5C42\uFF08\u5317\u5411\u7F51\u5173\uFF09:
2391
+ api/command/ \u2014 \u547D\u4EE4\u5904\u7406\u5668\uFF08*Command\uFF09
2392
+ api/query/ \u2014 \u67E5\u8BE2\u5904\u7406\u5668\uFF08*Query\uFF09
2393
+ api/dto/ \u2014 \u6D88\u606F\u5951\u7EA6\uFF08*Request/*Response/*Event\uFF09
2394
+
2395
+ application \u5C42\uFF08\u5317\u5411\u7F51\u5173\uFF09:
2396
+ application/ \u2014 \u5E94\u7528\u670D\u52A1\uFF08*AppService\uFF09\uFF0C\u7F16\u6392\u9886\u57DF\u5C42\u4E0E\u57FA\u7840\u8BBE\u65BD\u5C42
2397
+
2398
+ domain \u5C42\uFF08\u9886\u57DF\u6838\u5FC3\uFF09:
2399
+ domain/aggregate/ \u2014 \u805A\u5408\u6839
2400
+ domain/entity/ \u2014 \u5B9E\u4F53
2401
+ domain/valueobject/ \u2014 \u503C\u5BF9\u8C61
2402
+ domain/service/ \u2014 \u9886\u57DF\u670D\u52A1\uFF08*Service\uFF09
2403
+
2404
+ infrastructure \u5C42\uFF08\u5357\u5411\u7F51\u5173\uFF09:
2405
+ infrastructure/port/repository/ \u2014 \u8D44\u6E90\u5E93\u7AEF\u53E3\uFF08\u63A5\u53E3\uFF09
2406
+ infrastructure/port/client/ \u2014 \u5BA2\u6237\u7AEF\u7AEF\u53E3\uFF08\u63A5\u53E3\uFF09
2407
+ infrastructure/adapter/repository/ \u2014 \u8D44\u6E90\u5E93\u9002\u914D\u5668\uFF08\u5B9E\u73B0\uFF09
2408
+ infrastructure/adapter/client/ \u2014 \u5BA2\u6237\u7AEF\u9002\u914D\u5668\uFF08\u5B9E\u73B0\uFF09
2409
+ \`\`\`
2410
+
2411
+ ---
2412
+
2413
+ ## \u6267\u884C\u65B9\u6620\u5C04
2414
+
2415
+ ### dev \u4EFB\u52A1\uFF08Development Engineer\uFF09
2416
+ - \u4EA7\u54C1\u4EE3\u7801\u5199\u5165 \`backend/\` \u6A21\u5757
2417
+ - **\u9886\u57DF\u5C42\u987B TDD**\uFF1A\u5148\u5199\u6D4B\u8BD5\uFF0C\u518D\u5199\u5B9E\u73B0
2418
+ - \u540C\u4E00\u6B65\u9AA4\u5185\u5B8C\u6210\u6D4B\u8BD5 + \u5B9E\u73B0
2419
+ - \u6BCF\u751F\u6210\u5B8C\u6574\u6587\u4EF6\u5185\u5BB9\uFF0C\u7ACB\u5373\u5199\u5165\u78C1\u76D8
2420
+
2421
+ ### qa \u4EFB\u52A1\uFF08QA Engineer\uFF09
2422
+ - \u96C6\u6210\u6D4B\u8BD5\u5199\u5165 \`integration-tests/{slug}/\`
2423
+ - \u8986\u76D6 API/\u5951\u7EA6/\u96C6\u6210\u573A\u666F
2424
+ - **\u7981\u6B62**\u9886\u57DF\u5C42\u5355\u5143\u6D4B\u8BD5\uFF08\u9886\u57DF TDD \u5C5E\u4E8E dev\uFF09
2425
+
2426
+ ### Code Review\uFF08\u5168\u90E8 dev + qa \u4EFB\u52A1\u5B8C\u6210\u540E\uFF09
2427
+ - \u8FD0\u884C\u68C0\u67E5\u5E76\u751F\u6210 \`docs/sparrow/design/{slug}/code_review.md\`
2428
+ - \u9A8C\u8BC1\u4EE3\u7801\u662F\u5426\u7B26\u5408 tech.md \u7684\u6280\u672F\u6808\u8981\u6C42
2429
+ - \u9A8C\u8BC1\u662F\u5426\u7B26\u5408\u5BF9\u5E94\u8BED\u8A00\u7684\u7F16\u7801\u89C4\u8303
2430
+
2431
+ ---
2432
+
2433
+ ## \u9886\u57DF TDD \u6D41\u7A0B
2434
+
2435
+ \u5BF9\u6BCF\u4E2A dev \u4EFB\u52A1\u4E2D\u7684\u9886\u57DF\u5C42\u6B65\u9AA4\uFF1A
2436
+
2437
+ 1. **\u5148\u5199\u6D4B\u8BD5\u6587\u4EF6**\uFF1A\u6839\u636E model.md \u4E2D\u7684\u805A\u5408\u5B9A\u4E49\u548C\u5E8F\u5217\u56FE\uFF0C\u7F16\u5199\u5355\u5143\u6D4B\u8BD5
2438
+ 2. **\u518D\u5199\u5B9E\u73B0\u6587\u4EF6**\uFF1A\u5B9E\u73B0\u805A\u5408\u6839\u3001\u5B9E\u4F53\u3001\u503C\u5BF9\u8C61\u3001\u9886\u57DF\u670D\u52A1\uFF0C\u4F7F\u5176\u901A\u8FC7\u6D4B\u8BD5
2439
+ 3. **\u540C\u4E00\u6B65\u9AA4\u5185\u5B8C\u6210**\uFF1A\u7981\u6B62\u5148\u5199\u6240\u6709\u6D4B\u8BD5\u518D\u5199\u6240\u6709\u5B9E\u73B0\uFF08\u5FC5\u987B\u5728\u4E00\u4E2A\u6B65\u9AA4\u5185\u5B8C\u6210\u6D4B\u8BD5+\u5B9E\u73B0\u5BF9\uFF09
2440
+
2441
+ ---
2442
+
2443
+ ## \u6267\u884C\u6D41\u7A0B
2444
+
2445
+ 1. \u8BFB\u53D6 \`plan.md\`\uFF0C\u6309\u4EFB\u52A1\u987A\u5E8F\u89E3\u6790
2446
+ 2. \u5BF9\u6BCF\u4E2A \`## \u4EFB\u52A1\`\uFF1A
2447
+ - \u6839\u636E \`\u6267\u884C\u65B9\` \u786E\u5B9A\u7531 dev \u6216 qa \u6267\u884C
2448
+ - \u6309\u987A\u5E8F\u6267\u884C\u4EFB\u52A1\u4E0B\u7684\u6BCF\u4E2A \`- [ ]\` \u6B65\u9AA4
2449
+ - \u6BCF\u6B65\u5B8C\u6210\u540E\u9A8C\u8BC1\u4EA7\u7269\uFF08\u68C0\u67E5\u6587\u4EF6\u662F\u5426\u751F\u6210\uFF09
2450
+ 3. \u5168\u90E8\u4EFB\u52A1\u5B8C\u6210\u540E\uFF0C\u5C06\u5DF2\u5B8C\u6210\u7684\u6B65\u9AA4\u6807\u8BB0\u4E3A \`- [x]\`
2451
+ 4. \u6267\u884C Code Review\uFF0C\u751F\u6210 code_review.md
2452
+
2453
+ ---
2454
+
2455
+ ## \u8BED\u8A00\u7EA7\u89C4\u5219\u53C2\u8003
2456
+
2457
+ \u6839\u636E tech.md \u4E2D\u9009\u5B9A\u7684\u8BED\u8A00\uFF0C\u9075\u5FAA\u5BF9\u5E94\u7684\u7F16\u7801\u89C4\u8303\uFF1A
2458
+
2459
+ ### \u901A\u7528\u89C4\u5219
2460
+ - \u6240\u6709\u8BED\u8A00\uFF1A\u9075\u5FAA DDD \u56DB\u5C42\u76EE\u5F55\u7ED3\u6784
2461
+ - \u9886\u57DF\u5C42\u4E0D\u4F9D\u8D56\u6846\u67B6/\u6570\u636E\u5E93\u5177\u4F53\u7C7B\u578B
2462
+ - api \u5C42\u4E0D\u5199\u9886\u57DF\u89C4\u5219
2463
+ - infrastructure \u5C42 port \u4E3A\u63A5\u53E3\uFF0Cadapter \u4E3A\u5B9E\u73B0
2464
+
2465
+ ### \u8BED\u8A00\u7279\u5B9A\u53CD\u6A21\u5F0F
2466
+
2467
+ **Java**\uFF1A
2468
+ - \u9886\u57DF\u5C42\u4E0D\u8981\u4F9D\u8D56 Spring Data / HTTP \u5177\u4F53\u7C7B\u578B
2469
+ - \u4E0D\u8981\u5728 handler \u4E2D\u5199\u6838\u5FC3\u4E1A\u52A1\u89C4\u5219
2470
+ - \u7981\u6B62 application/command\u3001application/query \u76EE\u5F55
2471
+
2472
+ **Python**\uFF1A
2473
+ - router \u4E2D\u4E0D\u8981\u5199\u9886\u57DF\u89C4\u5219
2474
+ - \u9886\u57DF\u5C42\u4E0D\u8981\u4F9D\u8D56 FastAPI/SQLAlchemy \u5177\u4F53\u7C7B\u578B
2475
+ - \u4F7F\u7528 logging \u800C\u975E print
2476
+ - \u4F18\u5148 uv + pyproject.toml
2477
+
2478
+ **Node.js/TypeScript**\uFF1A
2479
+ - controller \u4E2D\u4E0D\u8981\u5199\u9886\u57DF\u89C4\u5219
2480
+ - \u9886\u57DF\u5C42\u4E0D\u8981\u4F9D\u8D56 Express/NestJS \u5177\u4F53\u7C7B\u578B
2481
+ - \u4E25\u683C\u6A21\u5F0F \`"strict": true\`
2482
+ - \u4F7F\u7528 pino/winston \u800C\u975E console.log
2483
+
2484
+ **Go**\uFF1A
2485
+ - handler \u4E2D\u4E0D\u8981\u5199\u6838\u5FC3\u4E1A\u52A1\u89C4\u5219
2486
+ - \u9886\u57DF\u5C42\u4E0D\u5BFC\u5165 database/sql \u5177\u4F53\u9A71\u52A8
2487
+ - \u4F7F\u7528 go modules
2488
+
2489
+ **Rust**\uFF1A
2490
+ - handler \u95ED\u5305\u4E0D\u8981\u5806\u53E0\u9886\u57DF\u89C4\u5219
2491
+ - \u9886\u57DF\u5C42\u4E0D\u8981\u4F9D\u8D56 axum/sqlx \u5177\u4F53\u7C7B\u578B
2492
+ - \u907F\u514D unwrap()/expect() \u5904\u7406\u53EF\u9884\u671F\u5931\u8D25
2493
+
2494
+ **C++**\uFF1A
2495
+ - handler \u4E2D\u4E0D\u8981\u5199\u6838\u5FC3\u4E1A\u52A1\u89C4\u5219
2496
+ - \u9886\u57DF\u5C42\u4E0D\u4F9D\u8D56\u5177\u4F53 HTTP \u6846\u67B6\uFF08drogon/pistache\uFF09\u6216\u6570\u636E\u5E93\u9A71\u52A8\u7C7B\u578B
2497
+ - \u4F7F\u7528 RAII \u7BA1\u7406\u8D44\u6E90\uFF0C\u907F\u514D\u88F8\u6307\u9488\u548C\u624B\u52A8 new/delete
2498
+ - \u5934\u6587\u4EF6\u4F7F\u7528 #pragma once \u6216 include guard
2499
+ - \u4F18\u5148\u4F7F\u7528\u667A\u80FD\u6307\u9488\uFF08std::unique_ptr / std::shared_ptr\uFF09
2500
+
2501
+ ### \u5305/\u6A21\u5757\u547D\u540D\u89C4\u8303
2502
+
2503
+ - **Java**: UpperCamelCase \u7C7B\u540D\uFF0ClowerCamelCase \u65B9\u6CD5\u540D\uFF0C\u5168\u5C0F\u5199\u5305\u540D
2504
+ - **Python**: snake_case \u6587\u4EF6\u540D\u548C\u65B9\u6CD5\u540D\uFF0CPascalCase \u7C7B\u540D
2505
+ - **Node.js**: PascalCase \u7C7B\u540D\uFF0CcamelCase \u65B9\u6CD5\u540D\uFF0Ckebab-case \u6587\u4EF6\u540D
2506
+ - **Go**: PascalCase \u5BFC\u51FA\uFF0CcamelCase \u672A\u5BFC\u51FA\uFF0C\u5168\u5C0F\u5199\u5305\u540D
2507
+ - **Rust**: snake_case \u51FD\u6570/\u6A21\u5757/\u53D8\u91CF\uFF0CPascalCase \u7C7B\u578B/trait/enum
2508
+ - **C++**: PascalCase \u7C7B\u540D\uFF0Csnake_case \u51FD\u6570/\u53D8\u91CF/\u6587\u4EF6\u540D\uFF0C\u5168\u5C0F\u5199\u547D\u540D\u7A7A\u95F4
2509
+
2510
+ ---
2511
+
2512
+ ## \u4F9D\u8D56\u5B89\u88C5\u89C4\u5219
2513
+
2514
+ - \`install_dependencies\` \u4EC5\u5728\u4EE5\u4E0B\u60C5\u51B5\u5F00\u653E\uFF1A
2515
+ 1. \u6B65\u9AA4\u6587\u5B57\u660E\u786E\u8981\u6C42\u4F9D\u8D56\u5B89\u88C5
2516
+ 2. \u5F53\u524D\u4E3A dev \u4EFB\u52A1\u7684\u6700\u540E\u4E00\u4E2A\u672A\u5B8C\u6210\u6B65\u9AA4\uFF08\u6536\u5C3E\u6784\u5EFA\uFF09
2517
+ - \u5176\u4F59\u6B65\u9AA4\u53EA\u7528\u811A\u624B\u67B6 + \u6587\u4EF6\u5199\u5165
2518
+ - Code Review \u53EF\u4EE5\u8C03\u7528\u6784\u5EFA\u5DE5\u5177\u505A\u6821\u9A8C
2519
+
2520
+ ---
2521
+
2522
+ ## \u8F93\u51FA\u6587\u4EF6
2523
+
2524
+ ### \u4EA7\u54C1\u4EE3\u7801
2525
+ \`\`\`
2526
+ backend/
2527
+ ... (DDD \u56DB\u5C42\u76EE\u5F55\u7ED3\u6784)
2528
+ \`\`\`
2529
+
2530
+ ### \u96C6\u6210\u6D4B\u8BD5
2531
+ \`\`\`
2532
+ integration-tests/{slug}/
2533
+ ... (\u96C6\u6210\u6D4B\u8BD5\u5DE5\u7A0B)
2534
+ \`\`\`
2535
+
2536
+ ### \u4EE3\u7801\u8BC4\u5BA1\u62A5\u544A
2537
+ \`\`\`
2538
+ docs/sparrow/design/{slug}/code_review.md
2539
+ \`\`\`
2540
+
2541
+ ---
2542
+
2543
+ ## \u8D28\u91CF\u68C0\u67E5\u6E05\u5355
2544
+
2545
+ \u6BCF\u4E2A\u4EFB\u52A1\u5B8C\u6210\u540E\uFF1A
2546
+ - [ ] \u78C1\u76D8\u6587\u4EF6\u5DF2\u751F\u6210
2547
+ - [ ] \u6D4B\u8BD5\u53EF\u4EE5\u901A\u8FC7
2548
+ - [ ] \u4EE3\u7801\u7B26\u5408\u5BF9\u5E94\u8BED\u8A00\u7F16\u7801\u89C4\u8303
2549
+ - [ ] DDD \u56DB\u5C42\u4F9D\u8D56\u65B9\u5411\u6B63\u786E\uFF08\u5916\u5C42\u4F9D\u8D56\u5185\u5C42\uFF09
2550
+ - [ ] \u9886\u57DF\u5C42\u4E0D\u4F9D\u8D56\u6846\u67B6/\u6570\u636E\u5E93\u5177\u4F53\u7C7B\u578B
2551
+ - [ ] **\u4EE3\u7801\u7684\u5C5E\u6027/\u65B9\u6CD5/\u7C7B\u578B\u4E0E model.md \u4E2D\u7684\u5B9A\u4E49\u4E00\u81F4**\uFF08\u8BED\u4E49\u76F8\u540C\uFF0C\u547D\u540D\u98CE\u683C\u6309\u8BED\u8A00\u8F6C\u6362\uFF09
2552
+
2553
+ \u5168\u90E8\u4EFB\u52A1\u5B8C\u6210\u540E\uFF1A
2554
+ - [ ] \u5B8C\u6574\u6784\u5EFA\u901A\u8FC7
2555
+ - [ ] \u6240\u6709\u6D4B\u8BD5\u901A\u8FC7
2556
+ - [ ] Code Review \u5B8C\u6210
2557
+ - [ ] plan.md \u6240\u6709\u6B65\u9AA4\u6807\u8BB0\u4E3A \`- [x]\`
2558
+ - [ ] **\u9886\u57DF\u5C42\u4EE3\u7801\u4E0E model.md \u9759\u6001\u6A21\u578B\u5B8C\u5168\u5BF9\u9F50**\uFF08\u805A\u5408\u3001\u5B9E\u4F53\u3001\u503C\u5BF9\u8C61\u3001\u9886\u57DF\u670D\u52A1\uFF09
2559
+ - [ ] **\u975E\u9886\u57DF\u5C42\u4EE3\u7801\u4E0E model.md \u52A8\u6001\u6A21\u578B\u5B8C\u5168\u5BF9\u9F50**\uFF08Command/Query\u3001AppService\u3001Port\u3001Adapter\uFF09
2560
+ - [ ] **API \u5C42\u63A5\u53E3\u4E0E api.md \u4E2D\u5B9A\u4E49\u7684\u5951\u7EA6\u4E00\u81F4**
2561
+
2562
+ ---
2563
+
2564
+ ## \u5B8C\u6210\u540E\u7684\u4E0B\u4E00\u6B65
2565
+
2566
+ \u{1F389} \u5F53\u524D\u9650\u754C\u4E0A\u4E0B\u6587 \`{slug}\` \u5DF2\u5168\u90E8\u5B8C\u6210\uFF01
2567
+
2568
+ \u5982\u679C\u6709\u5176\u4ED6\u9650\u754C\u4E0A\u4E0B\u6587\u9700\u8981\u5B9E\u73B0\uFF0C\u8BF7\u5BF9\u6BCF\u4E2A\u4E0A\u4E0B\u6587\u6267\u884C\uFF1A
2569
+ **sparrow-design \u2192 sparrow-model \u2192 sparrow-plan \u2192 sparrow-apply**
2570
+
2571
+ \u5168\u90E8\u9650\u754C\u4E0A\u4E0B\u6587\u5B8C\u6210\u540E\uFF0C\u4EA7\u54C1\u4EE3\u7801\u96C6\u4E2D\u5728 \`backend/\` \u76EE\u5F55\u4E0B\uFF0C\u5171\u4EAB\u9879\u76EE\u6839\u547D\u540D\u7A7A\u95F4\uFF0C\u5404\u4E0A\u4E0B\u6587\u4E3A\u72EC\u7ACB\u6A21\u5757\u3002
2572
+ `;
2573
+ function register6() {
2574
+ registerSkillTemplate("sparrow-apply", () => APPLY_BODY);
2575
+ }
2576
+
2577
+ // src/skills/index.ts
2578
+ function initializeSkills() {
2579
+ register();
2580
+ register2();
2581
+ register3();
2582
+ register4();
2583
+ register5();
2584
+ register6();
2585
+ }
2586
+
2587
+ // src/core/init.ts
2588
+ var SPARROW_VERSION = "0.1.0";
2589
+ function detectInstalledTools(projectRoot) {
2590
+ return SUPPORTED_TOOLS.filter((tool) => {
2591
+ return tool.detectionPaths.some((p) => {
2592
+ const fullPath = join2(projectRoot, p);
2593
+ return existsSync(fullPath);
2594
+ });
2595
+ });
2596
+ }
2597
+ function parseToolSelection(toolsFlag, detectedTools) {
2598
+ if (!toolsFlag) {
2599
+ if (detectedTools.length > 0) {
2600
+ return detectedTools.map((t) => t.id);
2601
+ }
2602
+ return SUPPORTED_TOOLS.map((t) => t.id);
2603
+ }
2604
+ const selections = toolsFlag.toLowerCase().split(",").map((s) => s.trim());
2605
+ if (selections.includes("all")) {
2606
+ return SUPPORTED_TOOLS.map((t) => t.id);
2607
+ }
2608
+ const validIds = new Set(SUPPORTED_TOOLS.map((t) => t.id));
2609
+ const invalid = selections.filter((s) => !validIds.has(s));
2610
+ if (invalid.length > 0) {
2611
+ throw new Error(
2612
+ `Unknown tool(s): ${invalid.join(", ")}. Supported tools: ${Array.from(validIds).join(", ")}`
2613
+ );
2614
+ }
2615
+ return selections;
2616
+ }
2617
+ function formatToolDetectionSummary(detectedTools) {
2618
+ if (detectedTools.length === 0) {
2619
+ return "No AI coding tools detected in this project.";
2620
+ }
2621
+ const lines = ["Detected AI coding tools:"];
2622
+ for (const tool of detectedTools) {
2623
+ lines.push(` \u2705 ${tool.name} (${tool.id})`);
2624
+ }
2625
+ const undetected = SUPPORTED_TOOLS.filter(
2626
+ (t) => !detectedTools.some((d) => d.id === t.id)
2627
+ );
2628
+ if (undetected.length > 0) {
2629
+ lines.push("");
2630
+ lines.push("Not detected (can still be selected with --tools):");
2631
+ for (const tool of undetected) {
2632
+ lines.push(` \u2B1C ${tool.name} (${tool.id})`);
2633
+ }
2634
+ }
2635
+ return lines.join("\n");
2636
+ }
2637
+ function executeInit(projectRoot, options) {
2638
+ const detectedTools = detectInstalledTools(projectRoot);
2639
+ const selectedToolIds = parseToolSelection(options.tools, detectedTools);
2640
+ if (selectedToolIds.length === 0) {
2641
+ throw new Error("No tools selected. Use --tools to specify which tools to set up.");
2642
+ }
2643
+ initializeSkills();
2644
+ const createdFiles = generateSkillFiles(projectRoot, selectedToolIds);
2645
+ const configPath = generateProjectConfig(projectRoot, selectedToolIds, SPARROW_VERSION, options.projectName);
2646
+ const projectMdPath = generateProjectMd(projectRoot, options.projectName, SPARROW_VERSION, selectedToolIds);
2647
+ return {
2648
+ tools: selectedToolIds,
2649
+ projectName: options.projectName,
2650
+ createdFiles,
2651
+ configPath,
2652
+ projectMdPath
2653
+ };
2654
+ }
2655
+ function formatInitSummary(result) {
2656
+ const lines = [];
2657
+ lines.push("");
2658
+ lines.push("\u2728 Sparrow initialized successfully!");
2659
+ lines.push("");
2660
+ lines.push(`\u{1F4E6} Project: ${result.projectName}`);
2661
+ lines.push(`\u{1F4CB} Tools configured: ${result.tools.join(", ")}`);
2662
+ lines.push(`\u{1F4C4} Config: .sparrow/sparrow.json`);
2663
+ lines.push(`\u{1F4D1} Guide: ${result.projectMdPath}`);
2664
+ lines.push(`\u{1F4C1} Backend dir: backend/`);
2665
+ lines.push("");
2666
+ for (const { toolId, files } of result.createdFiles) {
2667
+ lines.push(`\u{1F527} ${toolId}:`);
2668
+ const skillFiles = files.filter((f) => f.includes("/skills/"));
2669
+ const skillNames = new Set(
2670
+ skillFiles.map((f) => {
2671
+ const parts = f.split("/");
2672
+ const skillsIdx = parts.indexOf("skills");
2673
+ return skillsIdx >= 0 ? parts[skillsIdx + 1] : null;
2674
+ }).filter(Boolean)
2675
+ );
2676
+ lines.push(` Skills (${skillNames.size}): ${Array.from(skillNames).sort().join(", ")}`);
2677
+ lines.push(` Files: ${files.length} generated`);
2678
+ }
2679
+ lines.push("");
2680
+ lines.push("\u{1F680} Next steps:");
2681
+ lines.push(" 1. Start with /sparrow-explore to identify business services");
2682
+ lines.push(" 2. Run /sparrow-arch to define architecture");
2683
+ lines.push(" 3. For each bounded context: /sparrow-design \u2192 /sparrow-model \u2192 /sparrow-plan \u2192 /sparrow-apply");
2684
+ lines.push("");
2685
+ lines.push(" Full pipeline: explore \u2192 arch \u2192 design \u2192 model \u2192 plan \u2192 apply");
2686
+ return lines.join("\n");
2687
+ }
2688
+
2689
+ // src/core/prompts.ts
2690
+ import { checkbox, input, confirm } from "@inquirer/prompts";
2691
+ var GREEN = "\x1B[38;2;46;125;50m";
2692
+ var CYAN = "\x1B[36m";
2693
+ var DIM = "\x1B[2m";
2694
+ var RESET = "\x1B[0m";
2695
+ function renderWelcomePage() {
2696
+ const lines = [
2697
+ "",
2698
+ `${CYAN}\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557${RESET}`,
2699
+ `${CYAN}\u2551${RESET} ${CYAN}\u2551${RESET}`,
2700
+ `${CYAN}\u2551${RESET} ${CYAN}\u2551${RESET}`,
2701
+ `${CYAN}\u2551${RESET} ${GREEN} ___ _ __ __ _ _ __ _ ____ _____ __ ${RESET} ${CYAN}\u2551${RESET}`,
2702
+ `${CYAN}\u2551${RESET} ${GREEN} / __| '_ \\ / _\` | '__| '_ \\ \\ /\\ / / _ \\/ _| ${RESET} ${CYAN}\u2551${RESET}`,
2703
+ `${CYAN}\u2551${RESET} ${GREEN} \\__ \\ |_) | (_| | | | | | \\ V V / __/ (_| ${RESET} ${CYAN}\u2551${RESET}`,
2704
+ `${CYAN}\u2551${RESET} ${GREEN} |___/ .__/ \\__,_|_| |_| |_|\\_/\\_/ \\___|\\__| ${RESET} ${CYAN}\u2551${RESET}`,
2705
+ `${CYAN}\u2551${RESET} ${GREEN} |_| ${RESET} ${CYAN}\u2551${RESET}`,
2706
+ `${CYAN}\u2551${RESET} ${CYAN}\u2551${RESET}`,
2707
+ `${CYAN}\u2551${RESET} ${GREEN}Spec-Driven DDD Framework for AI Coding Assistants${RESET} ${CYAN}\u2551${RESET}`,
2708
+ `${CYAN}\u2551${RESET} ${DIM}From business requirements to production code${RESET} ${CYAN}\u2551${RESET}`,
2709
+ `${CYAN}\u2551${RESET} ${CYAN}\u2551${RESET}`,
2710
+ `${CYAN}\u2551${RESET} ${DIM}Pipeline:${RESET} explore \u2192 arch \u2192 design \u2192 model \u2192 plan \u2192 apply ${CYAN}\u2551${RESET}`,
2711
+ `${CYAN}\u2551${RESET} ${CYAN}\u2551${RESET}`,
2712
+ `${CYAN}\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D${RESET}`,
2713
+ ""
2714
+ ];
2715
+ for (const line of lines) {
2716
+ console.log(line);
2717
+ }
2718
+ }
2719
+ async function promptInput(message, defaultValue) {
2720
+ return input({
2721
+ message,
2722
+ default: defaultValue
2723
+ });
2724
+ }
2725
+ async function promptToolSelection(detectedTools) {
2726
+ const detectedIds = new Set(detectedTools.map((t) => t.id));
2727
+ const choices = SUPPORTED_TOOLS.map((tool) => {
2728
+ const isDetected = detectedIds.has(tool.id);
2729
+ return {
2730
+ name: `${tool.name}${isDetected ? " (detected)" : ""}`,
2731
+ value: tool.id,
2732
+ checked: isDetected
2733
+ };
2734
+ });
2735
+ const selected = await checkbox({
2736
+ message: "Select AI coding tools for this project:",
2737
+ choices,
2738
+ pageSize: 10
2739
+ });
2740
+ return selected;
2741
+ }
2742
+
2743
+ // src/cli/index.ts
2744
+ var program = new Command();
2745
+ program.name("sparrow").description(
2746
+ "Sparrow \u2014 spec-driven DDD framework for AI coding assistants.\nGenerate structured skills that guide AI agents through domain-driven design,\nfrom business requirements to production code."
2747
+ ).version("0.1.0").addHelpText(
2748
+ "after",
2749
+ `
2750
+ Examples:
2751
+ $ sparrow init Initialize with detected tools
2752
+ $ sparrow init --tools claude Set up for Claude Code only
2753
+ $ sparrow init --tools claude,opencode,cursor Set up for multiple tools
2754
+ $ sparrow init --tools all --force Set up for all tools, no prompts
2755
+ $ sparrow --version Show version
2756
+
2757
+ Supported tools: ${getSupportedToolIds().join(", ")}
2758
+ `
2759
+ );
2760
+ function sanitizeProjectName(name) {
2761
+ return name.replace(/[^a-zA-Z0-9-]/g, "-").replace(/--+/g, "-").replace(/^-|-$/g, "").toLowerCase() || "my-project";
2762
+ }
2763
+ program.command("init").description("Initialize Sparrow in the current project").option(
2764
+ "--tools <ids>",
2765
+ 'Comma-separated tool ids to set up (claude, opencode, cursor), or "all"'
2766
+ ).option("--project-name <name>", "Project name in English (used for code directory)").option("--force", "Skip confirmation prompts").action(async (options) => {
2767
+ const projectRoot = resolve(process.cwd());
2768
+ let selectedToolIds;
2769
+ let projectName;
2770
+ if (!options.tools) {
2771
+ renderWelcomePage();
2772
+ const defaultName = sanitizeProjectName(basename(projectRoot));
2773
+ projectName = options.projectName || await promptInput(
2774
+ "Enter project name (English, kebab-case):",
2775
+ defaultName
2776
+ );
2777
+ if (!projectName) {
2778
+ projectName = defaultName;
2779
+ }
2780
+ projectName = sanitizeProjectName(projectName);
2781
+ const detectedTools = detectInstalledTools(projectRoot);
2782
+ console.log(formatToolDetectionSummary(detectedTools));
2783
+ console.log("");
2784
+ const chosenTools = await promptToolSelection(detectedTools);
2785
+ if (chosenTools.length === 0) {
2786
+ console.error("\u274C No tools selected. Exiting.");
2787
+ process.exit(1);
2788
+ }
2789
+ selectedToolIds = chosenTools;
2790
+ console.log("");
2791
+ } else {
2792
+ projectName = options.projectName || sanitizeProjectName(basename(projectRoot));
2793
+ const detectedTools = detectInstalledTools(projectRoot);
2794
+ console.log("");
2795
+ console.log("\u{1FAB6} Sparrow \u2014 Spec-Driven DDD Framework");
2796
+ console.log("");
2797
+ console.log(formatToolDetectionSummary(detectedTools));
2798
+ console.log("");
2799
+ selectedToolIds = [];
2800
+ }
2801
+ try {
2802
+ const result = executeInit(projectRoot, {
2803
+ tools: options.tools || selectedToolIds.join(","),
2804
+ force: options.force,
2805
+ projectName
2806
+ });
2807
+ console.log(formatInitSummary(result));
2808
+ } catch (error) {
2809
+ console.error("\u274C Error:", error instanceof Error ? error.message : String(error));
2810
+ process.exit(1);
2811
+ }
2812
+ });
2813
+ program.action(() => {
2814
+ program.outputHelp();
2815
+ });
2816
+ program.parse(process.argv);
2817
+ //# sourceMappingURL=index.js.map