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/README.md +316 -0
- package/bin/sparrow.js +2817 -0
- package/bin/sparrow.js.map +7 -0
- package/dist/index.js +2817 -0
- package/dist/index.js.map +7 -0
- package/package.json +54 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/cli/index.ts", "../src/core/init.ts", "../src/core/config.ts", "../src/core/skill-generation.ts", "../src/core/adapters/claude.ts", "../src/core/adapters/opencode.ts", "../src/core/adapters/cursor.ts", "../src/core/adapters/index.ts", "../src/core/project-md.ts", "../src/skills/explore.ts", "../src/skills/arch.ts", "../src/skills/design.ts", "../src/skills/model.ts", "../src/skills/plan.ts", "../src/skills/apply.ts", "../src/skills/index.ts", "../src/core/prompts.ts"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n/**\n * Sparrow CLI \u2014 spec-driven DDD framework for AI coding assistants.\n *\n * Main entry point using Commander.js.\n *\n * Commands:\n * sparrow init Initialize Sparrow in a project\n */\n\nimport { Command } from 'commander';\nimport { resolve, basename } from 'node:path';\nimport { detectInstalledTools, executeInit, formatInitSummary, formatToolDetectionSummary } from '../core/init.js';\nimport { getSupportedToolIds } from '../core/config.js';\nimport { renderWelcomePage, promptInput, promptToolSelection } from '../core/prompts.js';\n\nconst program = new Command();\n\nprogram\n .name('sparrow')\n .description(\n 'Sparrow \u2014 spec-driven DDD framework for AI coding assistants.\\n' +\n 'Generate structured skills that guide AI agents through domain-driven design,\\n' +\n 'from business requirements to production code.'\n )\n .version('0.1.0')\n .addHelpText(\n 'after',\n `\nExamples:\n $ sparrow init Initialize with detected tools\n $ sparrow init --tools claude Set up for Claude Code only\n $ sparrow init --tools claude,opencode,cursor Set up for multiple tools\n $ sparrow init --tools all --force Set up for all tools, no prompts\n $ sparrow --version Show version\n\nSupported tools: ${getSupportedToolIds().join(', ')}\n`\n );\n\n/**\n * Sanitize a directory name into a valid kebab-case project name.\n */\nfunction sanitizeProjectName(name: string): string {\n return name\n .replace(/[^a-zA-Z0-9-]/g, '-')\n .replace(/--+/g, '-')\n .replace(/^-|-$/g, '')\n .toLowerCase() || 'my-project';\n}\n\nprogram\n .command('init')\n .description('Initialize Sparrow in the current project')\n .option(\n '--tools <ids>',\n 'Comma-separated tool ids to set up (claude, opencode, cursor), or \"all\"'\n )\n .option('--project-name <name>', 'Project name in English (used for code directory)')\n .option('--force', 'Skip confirmation prompts')\n .action(async (options: { tools?: string; projectName?: string; force?: boolean }) => {\n const projectRoot = resolve(process.cwd());\n\n let selectedToolIds: string[];\n let projectName: string;\n\n // \u2500\u2500 Interactive mode: no --tools flag \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (!options.tools) {\n renderWelcomePage();\n\n // 1. Collect project name\n const defaultName = sanitizeProjectName(basename(projectRoot));\n projectName = options.projectName || await promptInput(\n 'Enter project name (English, kebab-case):',\n defaultName\n );\n if (!projectName) {\n projectName = defaultName;\n }\n projectName = sanitizeProjectName(projectName);\n\n // 2. Show tool detection and let user select\n const detectedTools = detectInstalledTools(projectRoot);\n console.log(formatToolDetectionSummary(detectedTools));\n console.log('');\n\n const chosenTools = await promptToolSelection(detectedTools);\n if (chosenTools.length === 0) {\n console.error('\u274C No tools selected. Exiting.');\n process.exit(1);\n }\n selectedToolIds = chosenTools;\n\n console.log('');\n } else {\n // \u2500\u2500 Non-interactive mode: --tools provided \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n projectName = options.projectName || sanitizeProjectName(basename(projectRoot));\n\n const detectedTools = detectInstalledTools(projectRoot);\n console.log('');\n console.log('\uD83E\uDEB6 Sparrow \u2014 Spec-Driven DDD Framework');\n console.log('');\n console.log(formatToolDetectionSummary(detectedTools));\n console.log('');\n\n // parseToolSelection is called inside executeInit\n selectedToolIds = []; // placeholder \u2014 executeInit will resolve from options.tools\n }\n\n try {\n const result = executeInit(projectRoot, {\n tools: options.tools || selectedToolIds.join(','),\n force: options.force,\n projectName,\n });\n\n console.log(formatInitSummary(result));\n } catch (error) {\n console.error('\u274C Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Default command: show help if no command given\nprogram.action(() => {\n program.outputHelp();\n});\n\n// Parse CLI arguments\nprogram.parse(process.argv);\n", "/**\n * InitCommand \u2014 project initialization logic.\n *\n * Detects installed AI coding assistants, generates skill and command files\n * for each selected tool, and creates a sparrow.json project config.\n */\n\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { SUPPORTED_TOOLS, type ToolDefinition } from './config.js';\nimport { generateSkillFiles, generateProjectConfig, generateProjectMd } from './skill-generation.js';\nimport { initializeSkills } from '../skills/index.js';\n\nconst SPARROW_VERSION = '0.1.0';\n\nexport interface InitOptions {\n /** Comma-separated tool ids or 'all' */\n tools?: string;\n /** Skip confirmation prompts */\n force?: boolean;\n /** Project name in English (used for code directory) */\n projectName: string;\n}\n\nexport interface InitResult {\n tools: string[];\n projectName: string;\n createdFiles: { toolId: string; files: string[] }[];\n configPath: string;\n projectMdPath: string;\n}\n\n/**\n * Detect which AI tools are installed in the project directory.\n * Checks for the presence of each tool's detection paths.\n */\nexport function detectInstalledTools(projectRoot: string): ToolDefinition[] {\n return SUPPORTED_TOOLS.filter((tool) => {\n return tool.detectionPaths.some((p) => {\n const fullPath = join(projectRoot, p);\n return existsSync(fullPath);\n });\n });\n}\n\n/**\n * Parse the --tools flag into a list of tool ids.\n * Returns 'all' tools if 'all' is specified.\n */\nexport function parseToolSelection(\n toolsFlag: string | undefined,\n detectedTools: ToolDefinition[]\n): string[] {\n if (!toolsFlag) {\n // No flag: use detected tools, or default to all if none detected\n if (detectedTools.length > 0) {\n return detectedTools.map((t) => t.id);\n }\n return SUPPORTED_TOOLS.map((t) => t.id);\n }\n\n const selections = toolsFlag.toLowerCase().split(',').map((s) => s.trim());\n\n if (selections.includes('all')) {\n return SUPPORTED_TOOLS.map((t) => t.id);\n }\n\n // Validate each selection\n const validIds = new Set(SUPPORTED_TOOLS.map((t) => t.id));\n const invalid = selections.filter((s) => !validIds.has(s));\n if (invalid.length > 0) {\n throw new Error(\n `Unknown tool(s): ${invalid.join(', ')}. Supported tools: ${Array.from(validIds).join(', ')}`\n );\n }\n\n return selections;\n}\n\n/**\n * Generate a summary table of detected tools for display.\n */\nexport function formatToolDetectionSummary(detectedTools: ToolDefinition[]): string {\n if (detectedTools.length === 0) {\n return 'No AI coding tools detected in this project.';\n }\n\n const lines = ['Detected AI coding tools:'];\n for (const tool of detectedTools) {\n lines.push(` \u2705 ${tool.name} (${tool.id})`);\n }\n\n const undetected = SUPPORTED_TOOLS.filter(\n (t) => !detectedTools.some((d) => d.id === t.id)\n );\n if (undetected.length > 0) {\n lines.push('');\n lines.push('Not detected (can still be selected with --tools):');\n for (const tool of undetected) {\n lines.push(` \u2B1C ${tool.name} (${tool.id})`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Execute the init command.\n *\n * 1. Detect installed tools\n * 2. Resolve tool selection\n * 3. Initialize skill templates\n * 4. Generate skill/command files for each tool\n * 5. Create sparrow.json config\n */\nexport function executeInit(projectRoot: string, options: InitOptions): InitResult {\n // Step 1: Detect tools\n const detectedTools = detectInstalledTools(projectRoot);\n\n // Step 2: Resolve tool selection\n const selectedToolIds = parseToolSelection(options.tools, detectedTools);\n\n if (selectedToolIds.length === 0) {\n throw new Error('No tools selected. Use --tools to specify which tools to set up.');\n }\n\n // Step 3: Initialize skill templates (triggers all registrations)\n initializeSkills();\n\n // Step 4: Generate skill and command files\n const createdFiles = generateSkillFiles(projectRoot, selectedToolIds);\n\n // Step 5: Create project config\n const configPath = generateProjectConfig(projectRoot, selectedToolIds, SPARROW_VERSION, options.projectName);\n\n // Step 6: Create project.md wizard file\n const projectMdPath = generateProjectMd(projectRoot, options.projectName, SPARROW_VERSION, selectedToolIds);\n\n return {\n tools: selectedToolIds,\n projectName: options.projectName,\n createdFiles,\n configPath,\n projectMdPath,\n };\n}\n\n/**\n * Format the init result as a user-friendly summary.\n */\nexport function formatInitSummary(result: InitResult): string {\n const lines: string[] = [];\n\n lines.push('');\n lines.push('\u2728 Sparrow initialized successfully!');\n lines.push('');\n lines.push(`\uD83D\uDCE6 Project: ${result.projectName}`);\n lines.push(`\uD83D\uDCCB Tools configured: ${result.tools.join(', ')}`);\n lines.push(`\uD83D\uDCC4 Config: .sparrow/sparrow.json`);\n lines.push(`\uD83D\uDCD1 Guide: ${result.projectMdPath}`);\n lines.push(`\uD83D\uDCC1 Backend dir: backend/`);\n lines.push('');\n\n for (const { toolId, files } of result.createdFiles) {\n lines.push(`\uD83D\uDD27 ${toolId}:`);\n // Extract skill names from skill file paths (skills/{name}/SKILL.md)\n const skillFiles = files.filter((f) => f.includes('/skills/'));\n const skillNames = new Set(\n skillFiles.map((f) => {\n const parts = f.split('/');\n const skillsIdx = parts.indexOf('skills');\n return skillsIdx >= 0 ? parts[skillsIdx + 1] : null;\n }).filter(Boolean)\n );\n lines.push(` Skills (${skillNames.size}): ${Array.from(skillNames).sort().join(', ')}`);\n lines.push(` Files: ${files.length} generated`);\n }\n\n lines.push('');\n lines.push('\uD83D\uDE80 Next steps:');\n lines.push(' 1. Start with /sparrow-explore to identify business services');\n lines.push(' 2. Run /sparrow-arch to define architecture');\n lines.push(' 3. For each bounded context: /sparrow-design \u2192 /sparrow-model \u2192 /sparrow-plan \u2192 /sparrow-apply');\n lines.push('');\n lines.push(' Full pipeline: explore \u2192 arch \u2192 design \u2192 model \u2192 plan \u2192 apply');\n\n return lines.join('\\n');\n}\n", "/**\n * Tool metadata and detection logic.\n * Defines the registry of supported AI coding assistants.\n */\n\nexport interface ToolDefinition {\n /** Unique tool identifier */\n id: string;\n /** Human-readable tool name */\n name: string;\n /** Directory where skill files should be placed (relative to project root) */\n skillsDir: string;\n /** Directory where command/slash-command files should be placed */\n commandsDir: string;\n /** Format category for the tool */\n format: 'claude-style' | 'opencode-style' | 'cursor-style';\n /** Files or directories that indicate this tool is installed */\n detectionPaths: string[];\n}\n\n/** All supported AI coding assistants */\nexport const SUPPORTED_TOOLS: ToolDefinition[] = [\n {\n id: 'claude',\n name: 'Claude Code',\n skillsDir: '.claude/skills',\n commandsDir: '.claude/commands/sparrow',\n format: 'claude-style',\n detectionPaths: ['.claude', '.claude/settings.json', '.claude/settings.local.json'],\n },\n {\n id: 'opencode',\n name: 'OpenCode',\n skillsDir: '.opencode/skills',\n commandsDir: '.opencode/commands',\n format: 'opencode-style',\n detectionPaths: ['.opencode', '.opencode/config.json'],\n },\n {\n id: 'cursor',\n name: 'Cursor',\n skillsDir: '.cursor/skills',\n commandsDir: '.cursor/commands',\n format: 'cursor-style',\n detectionPaths: ['.cursor', '.cursorrules', '.cursor/rules'],\n },\n];\n\n/**\n * Look up a tool definition by its id.\n */\nexport function getToolById(id: string): ToolDefinition | undefined {\n return SUPPORTED_TOOLS.find((t) => t.id === id);\n}\n\n/**\n * Get all supported tool ids.\n */\nexport function getSupportedToolIds(): string[] {\n return SUPPORTED_TOOLS.map((t) => t.id);\n}\n\n// \u2500\u2500\u2500 Skill Definitions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface SkillDefinition {\n /** Skill id (used in file paths) */\n id: string;\n /** Display name */\n name: string;\n /** Short description used in YAML frontmatter */\n description: string;\n /** Execution phase for ordering */\n phase: 'product' | 'team';\n /** Position in the execution order (1-6) */\n order: number;\n /** The next skill to run (null for the last skill) */\n nextSkill: string | null;\n /** Command name (same as id) */\n commandName: string;\n /** Category tag */\n category: string;\n}\n\nexport const SKILLS: SkillDefinition[] = [\n {\n id: 'sparrow-explore',\n name: 'Sparrow Explore',\n description: 'Identify and define business services from raw requirements',\n phase: 'product',\n order: 1,\n nextSkill: 'sparrow-arch',\n commandName: 'sparrow-explore',\n category: 'DDD',\n },\n {\n id: 'sparrow-arch',\n name: 'Sparrow Arch',\n description: 'Define business architecture and application architecture with bounded contexts',\n phase: 'product',\n order: 2,\n nextSkill: 'sparrow-design',\n commandName: 'sparrow-arch',\n category: 'DDD',\n },\n {\n id: 'sparrow-design',\n name: 'Sparrow Design',\n description: 'Define API contracts and technology stack for a bounded context',\n phase: 'team',\n order: 3,\n nextSkill: 'sparrow-model',\n commandName: 'sparrow-design',\n category: 'DDD',\n },\n {\n id: 'sparrow-model',\n name: 'Sparrow Model',\n description: 'Extract domain model (static and dynamic) for a bounded context',\n phase: 'team',\n order: 4,\n nextSkill: 'sparrow-plan',\n commandName: 'sparrow-model',\n category: 'DDD',\n },\n {\n id: 'sparrow-plan',\n name: 'Sparrow Plan',\n description: 'Devise implementation plan based on spec, API, tech stack, and domain model',\n phase: 'team',\n order: 5,\n nextSkill: 'sparrow-apply',\n commandName: 'sparrow-plan',\n category: 'DDD',\n },\n {\n id: 'sparrow-apply',\n name: 'Sparrow Apply',\n description: 'Execute the implementation plan and generate DDD-structured code',\n phase: 'team',\n order: 6,\n nextSkill: null,\n commandName: 'sparrow-apply',\n category: 'DDD',\n },\n];\n\n/**\n * Get a skill definition by id.\n */\nexport function getSkillById(id: string): SkillDefinition | undefined {\n return SKILLS.find((s) => s.id === id);\n}\n\n/**\n * Get all skills in execution order.\n */\nexport function getOrderedSkills(): SkillDefinition[] {\n return [...SKILLS].sort((a, b) => a.order - b.order);\n}\n", "/**\n * Skill generation engine.\n *\n * Assembles skill markdown from templates, injects prerequisite checks,\n * output path configuration, and next-step hints. Generates per-tool\n * formatted files via the adapter registry.\n */\n\nimport { mkdirSync, writeFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport type { SkillDefinition } from './config.js';\nimport { getOrderedSkills } from './config.js';\nimport { getAdapter } from './adapters/index.js';\nimport type { CommandContent } from './adapters/types.js';\nimport { generateProjectMdContent } from './project-md.js';\n\n/**\n * Skill template function type.\n * Each skill module exports a function that returns the full markdown body.\n */\nexport type SkillTemplateFn = () => string;\n\n/**\n * Registry mapping skill ids to their template functions.\n */\nconst skillTemplateRegistry = new Map<string, SkillTemplateFn>();\n\n/**\n * Register a skill template.\n */\nexport function registerSkillTemplate(skillId: string, templateFn: SkillTemplateFn): void {\n skillTemplateRegistry.set(skillId, templateFn);\n}\n\n/**\n * Get a registered skill template.\n */\nexport function getSkillTemplate(skillId: string): SkillTemplateFn | undefined {\n return skillTemplateRegistry.get(skillId);\n}\n\n/**\n * Assemble the complete CommandContent for a skill.\n */\nexport function assembleSkillContent(skill: SkillDefinition): CommandContent {\n const templateFn = skillTemplateRegistry.get(skill.id);\n if (!templateFn) {\n throw new Error(`No template registered for skill: ${skill.id}`);\n }\n\n const body = templateFn();\n\n return {\n id: skill.id,\n name: skill.name,\n description: skill.description,\n category: skill.category,\n tags: ['sparrow', 'ddd', skill.phase === 'product' ? 'product-level' : 'team-level'],\n body,\n };\n}\n\n/**\n * Generate skill and command files for a list of tool ids.\n *\n * @param projectRoot - Absolute path to the project root\n * @param toolIds - List of tool ids to generate files for\n * @returns Summary of created files\n */\nexport function generateSkillFiles(\n projectRoot: string,\n toolIds: string[]\n): { toolId: string; files: string[] }[] {\n const skills = getOrderedSkills();\n const results: { toolId: string; files: string[] }[] = [];\n\n for (const toolId of toolIds) {\n const adapter = getAdapter(toolId);\n const createdFiles: string[] = [];\n\n for (const skill of skills) {\n const content = assembleSkillContent(skill);\n\n // Generate skill file\n const skillPath = join(projectRoot, adapter.getSkillPath(skill.id));\n mkdirSync(join(skillPath, '..'), { recursive: true });\n writeFileSync(skillPath, adapter.formatSkill(content), 'utf-8');\n createdFiles.push(adapter.getSkillPath(skill.id));\n\n // Generate command file\n const commandPath = join(projectRoot, adapter.getCommandPath(skill.id));\n mkdirSync(join(commandPath, '..'), { recursive: true });\n writeFileSync(commandPath, adapter.formatCommand(content), 'utf-8');\n createdFiles.push(adapter.getCommandPath(skill.id));\n }\n\n results.push({ toolId, files: createdFiles });\n }\n\n return results;\n}\n\n/**\n * Sparrow configuration directory (hidden).\n * All framework config files live under .sparrow/ in the project root.\n */\nexport const SPARROW_DIR = '.sparrow';\n\n/**\n * Generate a sparrow.json config file under .sparrow/ in the project root.\n */\nexport function generateProjectConfig(\n projectRoot: string,\n toolIds: string[],\n version: string,\n projectName: string\n): string {\n const config = {\n version,\n tools: toolIds,\n projectName,\n createdAt: new Date().toISOString(),\n outputBase: 'docs/sparrow',\n codeBase: 'backend',\n };\n\n const sparrowDir = join(projectRoot, SPARROW_DIR);\n mkdirSync(sparrowDir, { recursive: true });\n const configPath = join(sparrowDir, 'sparrow.json');\n writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n return configPath;\n}\n\n/**\n * Generate the project.md wizard file under docs/sparrow/.\n * Returns the path to the created file.\n */\nexport function generateProjectMd(\n projectRoot: string,\n projectName: string,\n sparrowVersion: string,\n toolIds: string[]\n): string {\n const mdPath = join(projectRoot, 'docs', 'sparrow', 'project.md');\n mkdirSync(dirname(mdPath), { recursive: true });\n const content = generateProjectMdContent(projectName, sparrowVersion, toolIds);\n writeFileSync(mdPath, content, 'utf-8');\n return mdPath;\n}\n", "/**\n * Claude Code adapter.\n *\n * Claude Code uses:\n * - Skills: `.claude/skills/<skill-name>/SKILL.md` with YAML frontmatter\n * - Commands: `.claude/commands/sparrow/<name>.md` with YAML frontmatter\n *\n * Skills are invoked via `/skill-name` and commands are project-specific slash commands.\n */\n\nimport type { CommandContent, ToolCommandAdapter } from './types.js';\n\nexport const claudeAdapter: ToolCommandAdapter = {\n toolId: 'claude',\n\n getSkillPath(skillId: string): string {\n return `.claude/skills/${skillId}/SKILL.md`;\n },\n\n getCommandPath(skillId: string): string {\n // Claude Code commands use the sparrow/ subdirectory for namespacing\n return `.claude/commands/sparrow/${skillId}.md`;\n },\n\n formatSkill(content: CommandContent): string {\n const frontmatter = [\n '---',\n `name: ${content.id}`,\n `description: ${content.description}`,\n `category: ${content.category}`,\n `tags: [${content.tags.join(', ')}]`,\n '---',\n ].join('\\n');\n\n return `${frontmatter}\\n\\n${content.body}`;\n },\n\n formatCommand(content: CommandContent): string {\n // Claude Code commands use the same format as skills\n const frontmatter = [\n '---',\n `name: ${content.id}`,\n `description: ${content.description}`,\n `category: ${content.category}`,\n `tags: [${content.tags.join(', ')}]`,\n '---',\n ].join('\\n');\n\n return `${frontmatter}\\n\\n${content.body}`;\n },\n};\n", "/**\n * OpenCode adapter.\n *\n * OpenCode uses:\n * - Skills: `.opencode/skills/<skill-name>/SKILL.md` with YAML frontmatter\n * - Commands: `.opencode/commands/sparrow-<name>.md`\n *\n * OpenCode uses a similar format to Claude Code but with slightly\n * different path conventions.\n */\n\nimport type { CommandContent, ToolCommandAdapter } from './types.js';\n\nexport const opencodeAdapter: ToolCommandAdapter = {\n toolId: 'opencode',\n\n getSkillPath(skillId: string): string {\n return `.opencode/skills/${skillId}/SKILL.md`;\n },\n\n getCommandPath(skillId: string): string {\n // OpenCode uses hyphen-separated names for commands\n return `.opencode/commands/${skillId}.md`;\n },\n\n formatSkill(content: CommandContent): string {\n const frontmatter = [\n '---',\n `name: ${content.id}`,\n `description: ${content.description}`,\n `category: ${content.category}`,\n `tags: [${content.tags.join(', ')}]`,\n '---',\n ].join('\\n');\n\n return `${frontmatter}\\n\\n${content.body}`;\n },\n\n formatCommand(content: CommandContent): string {\n const frontmatter = [\n '---',\n `name: ${content.id}`,\n `description: ${content.description}`,\n `category: ${content.category}`,\n `tags: [${content.tags.join(', ')}]`,\n '---',\n ].join('\\n');\n\n return `${frontmatter}\\n\\n${content.body}`;\n },\n};\n", "/**\n * Cursor adapter.\n *\n * Cursor uses:\n * - Skills: `.cursor/skills/<skill-name>/SKILL.md`\n * - Commands: `.cursor/commands/sparrow-<name>.md` (hyphen-separated)\n *\n * Cursor skills use YAML frontmatter with a slightly different schema.\n */\n\nimport type { CommandContent, ToolCommandAdapter } from './types.js';\n\nexport const cursorAdapter: ToolCommandAdapter = {\n toolId: 'cursor',\n\n getSkillPath(skillId: string): string {\n return `.cursor/skills/${skillId}/SKILL.md`;\n },\n\n getCommandPath(skillId: string): string {\n return `.cursor/commands/${skillId}.md`;\n },\n\n formatSkill(content: CommandContent): string {\n const frontmatter = [\n '---',\n `name: ${content.id}`,\n `description: ${content.description}`,\n `category: ${content.category}`,\n `tags: [${content.tags.join(', ')}]`,\n '---',\n ].join('\\n');\n\n return `${frontmatter}\\n\\n${content.body}`;\n },\n\n formatCommand(content: CommandContent): string {\n const frontmatter = [\n '---',\n `name: ${content.id}`,\n `description: ${content.description}`,\n `category: ${content.category}`,\n `tags: [${content.tags.join(', ')}]`,\n '---',\n ].join('\\n');\n\n return `${frontmatter}\\n\\n${content.body}`;\n },\n};\n", "/**\n * Command Adapter Registry.\n *\n * Static registry that pre-registers all tool adapters at module load time.\n * Provides fail-fast errors and O(1) lookups via Map.\n */\n\nimport type { ToolCommandAdapter } from './types.js';\nimport { claudeAdapter } from './claude.js';\nimport { opencodeAdapter } from './opencode.js';\nimport { cursorAdapter } from './cursor.js';\n\nconst _registry = new Map<string, ToolCommandAdapter>();\n\n// Pre-register all adapters at module load time\nconst _adapters: ToolCommandAdapter[] = [\n claudeAdapter,\n opencodeAdapter,\n cursorAdapter,\n];\n\nfor (const adapter of _adapters) {\n if (_registry.has(adapter.toolId)) {\n throw new Error(`Duplicate tool id registered: ${adapter.toolId}`);\n }\n _registry.set(adapter.toolId, adapter);\n}\n\n/**\n * Get the adapter for a specific tool id.\n * Throws if the tool id is not registered.\n */\nexport function getAdapter(toolId: string): ToolCommandAdapter {\n const adapter = _registry.get(toolId);\n if (!adapter) {\n const supported = Array.from(_registry.keys()).join(', ');\n throw new Error(\n `No adapter registered for tool '${toolId}'. Supported tools: ${supported}`\n );\n }\n return adapter;\n}\n\n/**\n * Get all registered adapter tool ids.\n */\nexport function getRegisteredToolIds(): string[] {\n return Array.from(_registry.keys());\n}\n\n/**\n * Check if a tool id has a registered adapter.\n */\nexport function hasAdapter(toolId: string): boolean {\n return _registry.has(toolId);\n}\n\nexport { claudeAdapter, opencodeAdapter, cursorAdapter };\n", "/**\n * project.md wizard file generation and management.\n *\n * project.md lives at docs/sparrow/project.md and serves as an index/guide\n * for the current project. It is:\n * - Created by the CLI during `sparrow init`\n * - Updated by AI assistants during skill execution (per template instructions)\n */\n\nexport interface ProjectMdSection {\n title: string;\n entries: { label: string; path: string; status: 'pending' | 'generated'; version?: string }[];\n}\n\n/**\n * Generate the initial project.md content for a new project.\n */\nexport function generateProjectMdContent(\n projectName: string,\n sparrowVersion: string,\n toolIds: string[]\n): string {\n const now = new Date().toISOString().replace('T', ' ').slice(0, 19);\n const toolList = toolIds.join(', ');\n\n return `# Sparrow \u9879\u76EE\uFF1A${projectName}\n\n> \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\n>\n> \u6700\u540E\u66F4\u65B0\uFF1A${now}\n> Sparrow \u7248\u672C\uFF1A${sparrowVersion}\n\n---\n\n## \u9879\u76EE\u4FE1\u606F\n\n| \u5C5E\u6027 | \u503C |\n|------|-----|\n| \u9879\u76EE\u540D\u79F0 | \\`${projectName}\\` |\n| \u521B\u5EFA\u65F6\u95F4 | ${now} |\n| Sparrow \u7248\u672C | ${sparrowVersion} |\n| \u914D\u7F6E\u5DE5\u5177 | ${toolList} |\n| \u6587\u6863\u57FA\u8DEF\u5F84 | \\`docs/sparrow/\\` |\n| \u4EE3\u7801\u57FA\u8DEF\u5F84 | \\`backend/\\` |\n\n---\n\n## \u6587\u6863\u7D22\u5F15\n\n### 1. \u4E1A\u52A1\u9700\u6C42\n\n- [ ] [\u4E1A\u52A1\u670D\u52A1\u5B9A\u4E49](./requirement/spec.md) \u2014 *\u5F85\u751F\u6210 (sparrow-explore)*\n\n### 2. \u4E1A\u52A1\u67B6\u6784\n\n- [ ] [\u4E1A\u52A1\u67B6\u6784](./architecture/business.md) \u2014 *\u5F85\u751F\u6210 (sparrow-arch)*\n- [ ] [\u5E94\u7528\u67B6\u6784](./architecture/application.md) \u2014 *\u5F85\u751F\u6210 (sparrow-arch)*\n\n### 3. \u9650\u754C\u4E0A\u4E0B\u6587\u8BBE\u8BA1\n\n> \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\n\n---\n\n### 4. API \u76EE\u5F55\n\n- [ ] [API \u603B\u76EE\u5F55](./api.md) \u2014 *\u5F85\u751F\u6210 (sparrow-design)*\n\n> \u6BCF\u5B8C\u6210\u4E00\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u7684 sparrow-design \u540E\u66F4\u65B0\u6B64\u6587\u4EF6\u3002\n\n---\n\n### 5. \u4EA7\u54C1\u4EE3\u7801\n\n- [\\`backend/\\`](../backend/) \u2014 \u4EA7\u54C1\u4EE3\u7801\u6839\u76EE\u5F55\n\n---\n\n## \u4E0B\u4E00\u6B65\n\n1. \u6267\u884C **/sparrow-explore** \u2014 \u4ECE\u539F\u59CB\u9700\u6C42\u4E2D\u8BC6\u522B\u4E1A\u52A1\u670D\u52A1\n2. \u6267\u884C **/sparrow-arch** \u2014 \u5212\u5206\u5B50\u9886\u57DF\uFF0C\u5B9A\u4E49\u4E1A\u52A1\u67B6\u6784\u548C\u5E94\u7528\u67B6\u6784\n3. \u5BF9\u6BCF\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u4F9D\u6B21\u6267\u884C\uFF1A**design \u2192 model \u2192 plan \u2192 apply**\n`;\n}\n\n/**\n * Get the path for project.md relative to the output base.\n */\nexport function getProjectMdPath(outputBase: string): string {\n return `${outputBase}/project.md`;\n}\n\n/**\n * Generate AI-targeted instructions for updating project.md after a skill completes.\n * The skillId determines which document entries should be updated.\n */\nexport function getProjectMdUpdateBlock(skillId: string): string {\n const skillDocMap: Record<string, string> = {\n 'sparrow-explore': 'requirement/spec.md',\n 'sparrow-arch': 'architecture/business.md \u548C architecture/application.md',\n 'sparrow-design': 'design/{slug}/api.md \u548C design/{slug}/tech.md',\n 'sparrow-model': 'design/{slug}/model.md',\n 'sparrow-plan': 'design/{slug}/plan.md',\n };\n\n const docPaths = skillDocMap[skillId] || '\u5BF9\u5E94\u7684\u6587\u6863';\n\n return `## \uD83D\uDCCB project.md \u66F4\u65B0\n\n\u5B8C\u6210\u8F93\u51FA\u540E\uFF0C**\u5FC5\u987B**\u66F4\u65B0 \\`docs/sparrow/project.md\\`\uFF1A\n\n1. \u5982\u679C \\`project.md\\` \u4E0D\u5B58\u5728\uFF0C\u6839\u636E\u5F53\u524D\u9879\u76EE\u4FE1\u606F\u521B\u5EFA\u5B83\n2. \u5728\"\u6587\u6863\u7D22\u5F15\"\u90E8\u5206\uFF0C\u66F4\u65B0\u5BF9\u5E94\u7684\u6587\u6863\u94FE\u63A5\uFF08${docPaths}\uFF09\n3. \u5C06\u5BF9\u5E94\u6761\u76EE\u7684\u72B6\u6001\u4ECE \\`_\u5F85\u751F\u6210_\\` \u66F4\u65B0\u4E3A \\`_v{version}_\\`\uFF08\u4F7F\u7528\u5B9E\u9645\u7248\u672C\u53F7\uFF09\n4. \u5982\u679C\u662F\u65B0\u521B\u5EFA\u7684\u9650\u754C\u4E0A\u4E0B\u6587\u8BBE\u8BA1\u6587\u6863\uFF0C\u5728\"\u9650\u754C\u4E0A\u4E0B\u6587\u8BBE\u8BA1\"\u90E8\u5206\u6DFB\u52A0\u65B0\u7684\u5B50\u7AE0\u8282\uFF1A\n \\`\\`\\`markdown\n #### {\u9650\u754C\u4E0A\u4E0B\u6587\u540D\u79F0} (\\`{slug}\\`)\n - [spec](./design/{slug}/spec.md) \u2014 *v1.0*\n - [api](./design/{slug}/api.md) \u2014 *\u5F85\u751F\u6210*\n - [tech](./design/{slug}/tech.md) \u2014 *\u5F85\u751F\u6210*\n - [model](./design/{slug}/model.md) \u2014 *\u5F85\u751F\u6210*\n - [plan](./design/{slug}/plan.md) \u2014 *\u5F85\u751F\u6210*\n \\`\\`\\`\n5. \u66F4\u65B0\u6587\u4EF6\u5934\u90E8\u7684\"\u6700\u540E\u66F4\u65B0\"\u65F6\u95F4\u6233\n\n**project.md \u8DEF\u5F84**: \\`docs/sparrow/project.md\\``;\n}\n", "/**\n * Sparrow Explore skill template.\n *\n * This skill identifies business services from raw requirements and\n * produces a structured business service definition document.\n */\n\nimport { registerSkillTemplate } from '../core/skill-generation.js';\n\nconst EXPLORE_BODY = `# Sparrow Explore \u2014 \u4E1A\u52A1\u670D\u52A1\u8BC6\u522B\n\n## \u6267\u884C\u987A\u5E8F\u68C0\u67E5\n\n\u5728\u6267\u884C\u4E4B\u524D\uFF0C\u8BF7\u68C0\u67E5\u5F53\u524D\u9636\u6BB5\u662F\u5426\u5408\u9002\uFF1A\n\n- **\u672C\u9636\u6BB5**\uFF1Asparrow-explore\uFF08\u7B2C 1 \u6B65\uFF0C\u5171 6 \u6B65\uFF09\n- **\u6240\u5C5E\u5C42\u7EA7**\uFF1A\u4EA7\u54C1\u7EA7\uFF08product-level\uFF09\n- **\u524D\u7F6E\u6761\u4EF6**\uFF1A\u65E0\uFF08\u8FD9\u662F\u6574\u4E2A DDD \u6D41\u7A0B\u7684\u7B2C\u4E00\u6B65\uFF09\n- **\u8F93\u5165\u8981\u6C42**\uFF1A\u7528\u6237\u9700\u8981\u63D0\u4F9B\u539F\u59CB\u9700\u6C42\u6587\u6863\u6216\u9700\u6C42\u63CF\u8FF0\n- **\u68C0\u67E5\u903B\u8F91**\uFF1A\n - \u5982\u679C\u5F53\u524D\u76EE\u5F55\u4E0B\u4E0D\u5B58\u5728 \\`docs/sparrow/requirement/spec.md\\`\uFF0C\u53EF\u4EE5\u7EE7\u7EED\u6267\u884C\n - \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\n\n---\n\n## \uD83D\uDED1 \u8F93\u51FA\u6587\u4EF6\u5B58\u5728\u6027\u68C0\u67E5\uFF08\u5FC5\u987B\u5728\u751F\u6210\u524D\u6267\u884C\uFF09\n\n\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\n\n- \\`docs/sparrow/requirement/spec.md\\`\n\n\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\n\n- **\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\n- **\u8986\u76D6 (overwrite)**\uFF1A\u5220\u9664\u5DF2\u6709\u6587\u4EF6\uFF0C\u91CD\u65B0\u751F\u6210\u5168\u65B0\u7684\u5185\u5BB9\n- **\u66F4\u65B0 (update)**\uFF1A\u5728\u5DF2\u6709\u6587\u4EF6\u57FA\u7840\u4E0A\u8FDB\u884C\u4FEE\u6539\u548C\u5B8C\u5584\n\n> \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\n\n---\n\n## \uD83D\uDCCB project.md \u66F4\u65B0\n\n\u5B8C\u6210\u8F93\u51FA\u540E\uFF0C**\u5FC5\u987B**\u66F4\u65B0 \\`docs/sparrow/project.md\\`\uFF1A\n\n1. \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\n2. \u5728\"\u6587\u6863\u7D22\u5F15\"\u90E8\u5206\uFF0C\u66F4\u65B0 \\`requirement/spec.md\\` \u7684\u94FE\u63A5\n3. \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\n4. \u66F4\u65B0\u6587\u4EF6\u5934\u90E8\u7684\"\u6700\u540E\u66F4\u65B0\"\u65F6\u95F4\u6233\n\n**project.md \u8DEF\u5F84**: \\`docs/sparrow/project.md\\`\n\n---\n\n## \uD83D\uDCCC \u7248\u672C\u5143\u6570\u636E\u7BA1\u7406\n\n\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\n\n\\`\\`\\`markdown\n<!--\n version: v1.0\n last-updated: {ISO_8601_TIMESTAMP}\n generated-by: sparrow-explore\n sparrow-version: {\u4ECE .sparrow/sparrow.json \u8BFB\u53D6}\n-->\n\\`\\`\\`\n\n**\u7248\u672C\u89C4\u5219**:\n- **\u65B0\u6587\u6863**: \u4F7F\u7528 \\`v1.0\\`\n- **\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\n- **\u91CD\u5927\u91CD\u5199**: \u9012\u589E\u4E3B\u7248\u672C\u53F7\uFF08\\`v1.x\\` \u2192 \\`v2.0\\`\uFF09\n- \u6BCF\u6B21\u4FEE\u6539\u90FD**\u5FC5\u987B\u53D8\u66F4**\u7248\u672C\u53F7\n\n**\u64CD\u4F5C\u6B65\u9AA4**:\n1. \u68C0\u67E5\u76EE\u6807\u6587\u4EF6\u662F\u5426\u5DF2\u5B58\u5728\n2. \u5982\u679C\u5B58\u5728\uFF0C\u8BFB\u53D6\u6587\u4EF6\u5F00\u5934 \\`<!--\\` \u6CE8\u91CA\u5757\u4E2D\u7684 \\`version:\\` \u5B57\u6BB5\u5E76\u9012\u589E\n3. \u5728\u6587\u4EF6\u5F00\u5934\u6DFB\u52A0\u6216\u66F4\u65B0\u7248\u672C\u5143\u6570\u636E\u5757\n4. \u7EE7\u7EED\u751F\u6210\u6587\u6863\u6B63\u6587\n\n---\n\n## \u89D2\u8272\u5B9A\u4E49\n\n\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\n\n## \u6838\u5FC3\u8981\u6C42\uFF1A\u5168\u9762\u8986\u76D6\u539F\u59CB\u9700\u6C42\n\n- **\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\n- **\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\n- **\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\n\n## \u7B2C\u4E00\u6027\u539F\u7406\n\n### 1. \u4EF7\u503C\u5BFC\u5411\u539F\u5219\n- \u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u5FC5\u987B\u4E3A\u4E1A\u52A1\u53C2\u4E0E\u8005\u521B\u9020\u660E\u786E\u7684\u4EF7\u503C\n- \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\n- \u907F\u514D\u8BC6\u522B\u90A3\u4E9B\u6CA1\u6709\u5B9E\u9645\u4E1A\u52A1\u4EF7\u503C\u7684\u7EAF\u6280\u672F\u529F\u80FD\n\n### 2. \u5B8C\u6574\u6027\u539F\u5219\n- \u4E1A\u52A1\u670D\u52A1\u5FC5\u987B\u662F\u4E00\u6B21\u5B8C\u6574\u7684\u529F\u80FD\u4EA4\u4E92\uFF0C\u4ECE\u89E6\u53D1\u5230\u5B8C\u6210\n- \u4E1A\u52A1\u670D\u52A1\u5E94\u8BE5\u5305\u542B\u6210\u529F\u548C\u5931\u8D25\u7684\u6240\u6709\u53EF\u80FD\u8DEF\u5F84\n- \u4E1A\u52A1\u670D\u52A1\u5E94\u8BE5\u8003\u8651\u6240\u6709\u76F8\u5173\u7684\u4E1A\u52A1\u89C4\u5219\u548C\u7EA6\u675F\n\n### 3. \u72EC\u7ACB\u6027\u539F\u5219\n- \u4E1A\u52A1\u670D\u52A1\u5E94\u8BE5\u76F8\u5BF9\u72EC\u7ACB\uFF0C\u51CF\u5C11\u4E0E\u5176\u4ED6\u670D\u52A1\u7684\u8026\u5408\n- \u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u5E94\u8BE5\u6709\u660E\u786E\u7684\u8FB9\u754C\u548C\u804C\u8D23\n- \u4E1A\u52A1\u670D\u52A1\u4E4B\u95F4\u5E94\u8BE5\u901A\u8FC7\u660E\u786E\u7684\u63A5\u53E3\u8FDB\u884C\u4EA4\u4E92\n\n## \u4E1A\u52A1\u670D\u52A1\u5B9A\u4E49\n\n**\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\n\n### \u5173\u952E\u7406\u89E3\uFF1A\u4E1A\u52A1\u670D\u52A1 \u2260 \u7528\u4F8B\n\n**\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\n\n\u5C06\u76EE\u6807\u7CFB\u7EDF\u89C6\u4E3A\u4E00\u4E2A**\u9ED1\u76D2\u5B50**\uFF1A\n- \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\n- \u8FD9\u4E00\u6B21\u8BF7\u6C42\u5C31\u662F\u4E00\u4E2A\u4E1A\u52A1\u670D\u52A1\n- \u4E0D\u540C\u7684\u8BF7\u6C42\u5C31\u662F\u4E0D\u540C\u7684\u4E1A\u52A1\u670D\u52A1\n\n### \u7C92\u5EA6\u539F\u5219\uFF1A\u4E00\u6B21\u8BF7\u6C42 = \u4E00\u4E2A\u4E1A\u52A1\u670D\u52A1\n\n**\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\n\n**\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\n1. **\u67E5\u8BE2\u4E2A\u4EBA\u8D44\u6599**\uFF1A\u7528\u6237\u5411\u7CFB\u7EDF\u8BF7\u6C42\u67E5\u770B\u81EA\u5DF1\u7684\u8D44\u6599\u4FE1\u606F\n2. **\u66F4\u65B0\u4E2A\u4EBA\u8D44\u6599**\uFF1A\u7528\u6237\u5411\u7CFB\u7EDF\u8BF7\u6C42\u4FEE\u6539\u81EA\u5DF1\u7684\u8D44\u6599\u4FE1\u606F\n3. **\u5220\u9664\u4E2A\u4EBA\u8D44\u6599**\uFF1A\u7528\u6237\u5411\u7CFB\u7EDF\u8BF7\u6C42\u5220\u9664\u81EA\u5DF1\u7684\u8D26\u6237\n4. **\u65B0\u589E\u4E2A\u4EBA\u8D44\u6599**\uFF1A\u7528\u6237\u5411\u7CFB\u7EDF\u8BF7\u6C42\u521B\u5EFA\u65B0\u7684\u4E2A\u4EBA\u8D44\u6599\n\n**\u9519\u8BEF\u793A\u4F8B \u2014 \u8BF7\u52FF\u6A21\u4EFF**\uFF1A\n- \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\n- \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\n\n### \u5224\u65AD\u6807\u51C6\n\n\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\n\n- **\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\n- **\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\n- **\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\n\n\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\n\n### \u53C2\u4E0E\u8005\u7C7B\u578B\n\n1. **\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\n2. **\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\n3. **\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\n\n## \u4E1A\u52A1\u670D\u52A1\u7EC4\u6210\u5143\u7D20\n\n\u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u5FC5\u987B\u5305\u542B\u4EE5\u4E0B\u7EC4\u6210\u5143\u7D20\uFF1A\n\n### 1. \u670D\u52A1\u7F16\u53F7\n- \u683C\u5F0F\uFF1A\\`{\u7CFB\u7EDF\u540D\u79F0}-{\u5E8F\u53F7}\\`\n- \u793A\u4F8B\uFF1A\\`EC-001\\`\u3001\\`TRIBE-001\\`\n\n### 2. \u670D\u52A1\u540D\n- \u683C\u5F0F\uFF1A\u52A8\u8BCD\u77ED\u8BED\u5F62\u5F0F\n- \u793A\u4F8B\uFF1A\\`\u63D0\u4EA4\u8BA2\u5355\\`\u3001\\`\u7528\u6237\u6CE8\u518C\\`\u3001\\`\u7533\u8BF7\u8D37\u6B3E\\`\n\n### 3. \u670D\u52A1\u63CF\u8FF0\n- \u683C\u5F0F\uFF1A\u4F5C\u4E3A<\u89D2\u8272>\uFF0C\u6211\u60F3\u8981<\u670D\u52A1\u529F\u80FD>\uFF0C\u4EE5\u4FBF<\u670D\u52A1\u4EF7\u503C>\n\n### 4. \u89E6\u53D1\u4E8B\u4EF6\n- \u63CF\u8FF0\uFF1A\u89E6\u53D1\u8BE5\u4E1A\u52A1\u670D\u52A1\u7684\u4E8B\u4EF6\n\n### 5. \u57FA\u672C\u6D41\u7A0B\n- \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\n- \u683C\u5F0F\uFF1A\u7F16\u53F7\u5217\u8868\uFF0C\u6BCF\u4E2A\u6B65\u9AA4\u6E05\u6670\u660E\u786E\n\n### 6. \u66FF\u4EE3\u6D41\u7A0B\n- \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\n- \u683C\u5F0F\uFF1A\u7F16\u53F7+\u5B57\u6BCD\uFF08\u59821a\u30012a\uFF09\uFF0C\u5BF9\u5E94\u57FA\u672C\u6D41\u7A0B\u7684\u6B65\u9AA4\n\n### 7. \u9A8C\u6536\u6807\u51C6\n- \u63CF\u8FF0\uFF1A\u4E00\u7CFB\u5217\u53EF\u4EE5\u63A5\u53D7\u7684\u6761\u4EF6\u6216\u8005\u4E1A\u52A1\u89C4\u5219\n- \u683C\u5F0F\uFF1A\u8981\u70B9\u5F62\u5F0F\u5217\u4E3E\uFF0C\u53EF\u6D4B\u8BD5\u3001\u53EF\u9A8C\u8BC1\n\n## \u8BC6\u522B\u7EA6\u675F\u6761\u4EF6\n\n### 1. \u6267\u884C\u6B65\u9AA4\u7EA6\u675F\n- \u4E1A\u52A1\u670D\u52A1\u7684\u6267\u884C\u6B65\u9AA4\u4E0D\u5305\u62EC\u7EBF\u4E0B\u6267\u884C\u7684\u6B65\u9AA4\n- \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\n- \u4E0D\u5305\u62EC\u524D\u7AEF\u7684\u4EFB\u4F55\u64CD\u4F5C\n\n### 2. \u670D\u52A1\u540D\u79F0\u7EA6\u675F\n- \u4E1A\u52A1\u670D\u52A1\u7684\u540D\u79F0\u5E94\u91C7\u7528\u52A8\u8BCD\u77ED\u8BED\uFF0C\u4EE5\u52A8\u5BBE\u7ED3\u6784\u6784\u6210\n- \u907F\u514D\u4F7F\u7528\u6280\u672F\u672F\u8BED\n\n### 3. \u8FB9\u754C\u7EA6\u675F\n- \u4E1A\u52A1\u670D\u52A1\u5E94\u8BE5\u6709\u660E\u786E\u7684\u8F93\u5165\u548C\u8F93\u51FA\n- \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\n- \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\n- \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\n\n## \u4E1A\u52A1\u670D\u52A1\u793A\u4F8B\n\n\\`\\`\\`\n\u670D\u52A1\u7F16\u53F7\uFF1AI-001\n\u670D\u52A1\u540D\uFF1A\u63D0\u4EA4\u8BA2\u5355\n\u670D\u52A1\u63CF\u8FF0\uFF1A\n\u4F5C\u4E3A\u4E70\u5BB6\uFF0C\n\u6211\u60F3\u8981\u63D0\u4EA4\u8BA2\u5355\uFF0C\n\u4EE5\u4FBF\u4E70\u5230\u6211\u5FC3\u4EEA\u7684\u5546\u54C1\u3002\n\n\u89E6\u53D1\u4E8B\u4EF6\uFF1A\u4E70\u5BB6\u70B9\u51FB\"\u63D0\u4EA4\u8BA2\u5355\"\u6309\u94AE\n\n\u57FA\u672C\u6D41\u7A0B\uFF1A\n1. \u9A8C\u8BC1\u8BA2\u5355\u6709\u6548\u6027\uFF1B\n2. \u9A8C\u8BC1\u8BA2\u5355\u6240\u8D2D\u5546\u54C1\u662F\u5426\u7F3A\u8D27\uFF1B\n3. \u63D2\u5165\u8BA2\u5355\uFF1B\n4. \u4ECE\u8D2D\u7269\u8F66\u4E2D\u79FB\u9664\u6240\u8D2D\u5546\u54C1\uFF1B\n5. \u9501\u5B9A\u5E93\u5B58\uFF1B\n6. \u901A\u77E5\u4E70\u5BB6\u8BA2\u5355\u5DF2\u63D0\u4EA4\u3002\n\n\u66FF\u4EE3\u6D41\u7A0B\uFF1A\n1a. \u5982\u679C\u8BA2\u5355\u65E0\u6548\uFF0C\u7ED9\u51FA\u63D0\u793A\u4FE1\u606F\uFF1B\n2a. \u5982\u679C\u6240\u8D2D\u5546\u54C1\u7F3A\u8D27\uFF0C\u7ED9\u51FA\u63D0\u793A\u4FE1\u606F\uFF1B\n3a. \u82E5\u8BA2\u5355\u63D0\u4EA4\u5931\u8D25\uFF0C\u7ED9\u51FA\u5931\u8D25\u539F\u56E0\u3002\n\n\u9A8C\u6536\u6807\u51C6\uFF1A\n1. \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\n2. \u8BA2\u5355\u9879\u4E2D\u5546\u54C1\u7684\u8D2D\u4E70\u6570\u91CF\u8981\u5C0F\u4E8E\u6216\u7B49\u4E8E\u5E93\u5B58\u91CF\uFF1B\n3. \u8BA2\u5355\u63D0\u4EA4\u6210\u529F\u540E\uFF0C\u8BA2\u5355\u72B6\u6001\u66F4\u6539\u4E3A\"\u5DF2\u63D0\u4EA4\"\uFF1B\n4. \u8D2D\u7269\u8F66\u5BF9\u5E94\u5546\u54C1\u88AB\u79FB\u9664\uFF1B\n5. \u5728\u5B8C\u6210\u652F\u4ED8\u6216\u53D6\u6D88\u8BA2\u5355\u524D\uFF0C\u9700\u8981\u9501\u5B9A\u5BF9\u5E94\u6570\u91CF\u7684\u5546\u54C1\uFF1B\n6. \u4E70\u5BB6\u6536\u5230\u8BA2\u5355\u5DF2\u63D0\u4EA4\u7684\u901A\u77E5\u3002\n\\`\\`\\`\n\n## \u8BC6\u522B\u6B65\u9AA4\u6307\u5BFC\n\n### \u6B65\u9AA41\uFF1A\u9700\u6C42\u5206\u6790\n1. \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\n2. \u8BC6\u522B\u6240\u6709\u7684\u4E1A\u52A1\u53C2\u4E0E\u8005\uFF08\u7528\u6237\u3001\u7B56\u7565\u3001\u4F34\u751F\u7CFB\u7EDF\uFF09\n3. \u7406\u89E3\u6BCF\u4E2A\u53C2\u4E0E\u8005\u7684\u4E1A\u52A1\u76EE\u6807\u548C\u4EF7\u503C\u8BC9\u6C42\n4. \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\n\n### \u6B65\u9AA42\uFF1A\u529F\u80FD\u8BC6\u522B\n1. \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\n2. \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\n3. \u4E0D\u9057\u6F0F\u4EFB\u4F55\u4E1A\u52A1\u529F\u80FD\n4. \u5C06\u76F8\u5173\u529F\u80FD\u7EC4\u7EC7\u6210\u4E1A\u52A1\u670D\u52A1\n5. \u786E\u4FDD\u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u90FD\u6709\u660E\u786E\u7684\u89E6\u53D1\u4E8B\u4EF6\n\n### \u6B65\u9AA43\uFF1A\u6D41\u7A0B\u8BBE\u8BA1\n1. \u4E3A\u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u8BBE\u8BA1\u57FA\u672C\u6D41\u7A0B\n2. \u8BC6\u522B\u53EF\u80FD\u7684\u5F02\u5E38\u60C5\u51B5\uFF0C\u8BBE\u8BA1\u66FF\u4EE3\u6D41\u7A0B\n3. \u786E\u4FDD\u6D41\u7A0B\u7684\u5B8C\u6574\u6027\u548C\u4E00\u81F4\u6027\n\n### \u6B65\u9AA44\uFF1A\u9A8C\u6536\u6807\u51C6\u5236\u5B9A\n1. \u4E3A\u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u5236\u5B9A\u660E\u786E\u7684\u9A8C\u6536\u6807\u51C6\n2. \u786E\u4FDD\u9A8C\u6536\u6807\u51C6\u53EF\u6D4B\u8BD5\u3001\u53EF\u9A8C\u8BC1\n3. \u8986\u76D6\u529F\u80FD\u6027\u548C\u975E\u529F\u80FD\u6027\u8981\u6C42\n\n### \u6B65\u9AA45\uFF1A\u6587\u6863\u5316\n1. \u6309\u7167\u6807\u51C6\u683C\u5F0F\u7F16\u5199\u4E1A\u52A1\u670D\u52A1\u6587\u6863\n2. \u786E\u4FDD\u6240\u6709\u7EC4\u6210\u5143\u7D20\u90FD\u5B8C\u6574\n3. \u68C0\u67E5\u662F\u5426\u7B26\u5408\u7EA6\u675F\u6761\u4EF6\n4. \u9A8C\u8BC1\u662F\u5426\u5168\u9762\u8986\u76D6\u4E86\u539F\u59CB\u9700\u6C42\u4E2D\u7684\u6240\u6709\u4E1A\u52A1\u529F\u80FD\n\n## \u8F93\u51FA\u8981\u6C42\n\n\u8BC6\u522B\u5B8C\u6210\u540E\uFF0C\u8BF7\u5C06\u4E1A\u52A1\u670D\u52A1\u5B9A\u4E49\u6587\u6863\u5199\u5165 **\\`docs/sparrow/requirement/spec.md\\`**\u3002\n\n\u6587\u6863\u683C\u5F0F\u5982\u4E0B\uFF1A\n\n\\`\\`\\`markdown\n# {\u7CFB\u7EDF\u540D\u79F0}\u4E1A\u52A1\u670D\u52A1\u5B9A\u4E49\u6587\u6863\n\n## 1 {\u4E1A\u52A1\u670D\u52A11\u540D\u79F0}\n**\u670D\u52A1\u7F16\u53F7\uFF1A** {\u7F16\u53F7}\n**\u670D\u52A1\u540D\uFF1A** {\u670D\u52A1\u540D}\n**\u670D\u52A1\u63CF\u8FF0\uFF1A**\n\u4F5C\u4E3A{\u89D2\u8272}\uFF0C\n\u6211\u60F3\u8981{\u670D\u52A1\u529F\u80FD}\uFF0C\n\u4EE5\u4FBF{\u670D\u52A1\u4EF7\u503C}\u3002\n\n**\u89E6\u53D1\u4E8B\u4EF6\uFF1A** {\u89E6\u53D1\u4E8B\u4EF6}\n\n**\u57FA\u672C\u6D41\u7A0B\uFF1A**\n1. {\u6B65\u9AA41}\uFF1B\n2. {\u6B65\u9AA42}\uFF1B\n...\n\n**\u66FF\u4EE3\u6D41\u7A0B\uFF1A**\n1a. {\u5F02\u5E38\u60C5\u51B51}\uFF1B\n2a. {\u5F02\u5E38\u60C5\u51B52}\uFF1B\n...\n\n**\u9A8C\u6536\u6807\u51C6\uFF1A**\n1. {\u6807\u51C61}\uFF1B\n2. {\u6807\u51C62}\uFF1B\n...\n\n---\n\n## 2 {\u4E1A\u52A1\u670D\u52A12\u540D\u79F0}\n...\n\\`\\`\\`\n\n## \u8D28\u91CF\u68C0\u67E5\u6E05\u5355\n\n\u5728\u5B8C\u6210\u4E1A\u52A1\u670D\u52A1\u8BC6\u522B\u540E\uFF0C\u8BF7\u68C0\u67E5\u4EE5\u4E0B\u9879\u76EE\uFF1A\n\n- [ ] **\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\n- [ ] **\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\n- [ ] \u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u90FD\u6709\u660E\u786E\u7684\u53C2\u4E0E\u8005\n- [ ] \u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u90FD\u6709\u660E\u786E\u7684\u4EF7\u503C\u4E3B\u5F20\n- [ ] \u6BCF\u4E2A\u4E1A\u52A1\u670D\u52A1\u90FD\u6709\u660E\u786E\u7684\u89E6\u53D1\u4E8B\u4EF6\n- [ ] \u57FA\u672C\u6D41\u7A0B\u8986\u76D6\u4E86\u4E3B\u8981\u7684\u6210\u529F\u8DEF\u5F84\n- [ ] \u66FF\u4EE3\u6D41\u7A0B\u8986\u76D6\u4E86\u4E3B\u8981\u7684\u5F02\u5E38\u60C5\u51B5\n- [ ] \u9A8C\u6536\u6807\u51C6\u53EF\u6D4B\u8BD5\u3001\u53EF\u9A8C\u8BC1\n- [ ] \u670D\u52A1\u540D\u79F0\u91C7\u7528\u52A8\u8BCD\u77ED\u8BED\u5F62\u5F0F\n- [ ] \u6267\u884C\u6B65\u9AA4\u4E0D\u5305\u62EC\u7EBF\u4E0B\u64CD\u4F5C\n- [ ] \u6267\u884C\u6B65\u9AA4\u4EC5\u9650\u4E8E\u7CFB\u7EDF\u540E\u7AEF\u529F\u80FD\n- [ ] \u4E1A\u52A1\u670D\u52A1\u4E4B\u95F4\u6709\u6E05\u6670\u7684\u8FB9\u754C\n- [ ] **\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\n- [ ] **\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\n- [ ] \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\n\n## \u5B8C\u6210\u540E\u7684\u4E0B\u4E00\u6B65\n\n\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\n`;\n\nexport function register(): void {\n registerSkillTemplate('sparrow-explore', () => EXPLORE_BODY);\n}\n", "/**\n * Sparrow Arch skill template.\n *\n * This skill has two phases:\n * Phase 1: Define business architecture (subdomains + business architecture diagram)\n * Phase 2: Map to application architecture (bounded contexts + application architecture diagram)\n */\n\nimport { registerSkillTemplate } from '../core/skill-generation.js';\n\nconst ARCH_BODY = `# Sparrow Arch \u2014 \u4E1A\u52A1\u67B6\u6784\u4E0E\u5E94\u7528\u67B6\u6784\u5B9A\u4E49\n\n## \u6267\u884C\u987A\u5E8F\u68C0\u67E5\n\n\u5728\u6267\u884C\u4E4B\u524D\uFF0C\u8BF7\u68C0\u67E5\u5F53\u524D\u9636\u6BB5\u662F\u5426\u5408\u9002\uFF1A\n\n\\`\\`\\`\n\u5F53\u524D\u6B65\u9AA4\uFF1Asparrow-arch\uFF08\u7B2C 2 \u6B65 / \u5171 6 \u6B65\uFF09\n\u6240\u5C5E\u5C42\u7EA7\uFF1A\u4EA7\u54C1\u7EA7\uFF08product-level\uFF09\n\u524D\u7F6E\u6761\u4EF6\uFF1Adocs/sparrow/requirement/spec.md \u5FC5\u987B\u5B58\u5728\n\u4E0B\u4E00\u6B65\u9AA4\uFF1Asparrow-design\uFF08\u56E2\u961F\u7EA7\uFF0C\u6309\u9650\u754C\u4E0A\u4E0B\u6587\u6267\u884C\uFF09\n\\`\\`\\`\n\n**\u524D\u7F6E\u6761\u4EF6\u68C0\u67E5**\uFF1A\n- \u5982\u679C \\`docs/sparrow/requirement/spec.md\\` \u4E0D\u5B58\u5728\uFF0C\u8BF7\u63D0\u793A\u7528\u6237\u5148\u6267\u884C **sparrow-explore**\n- \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\n\n---\n\n## \uD83D\uDED1 \u8F93\u51FA\u6587\u4EF6\u5B58\u5728\u6027\u68C0\u67E5\uFF08\u5FC5\u987B\u5728\u751F\u6210\u524D\u6267\u884C\uFF09\n\n\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\n\n- \\`docs/sparrow/architecture/business.md\\`\n- \\`docs/sparrow/architecture/application.md\\`\n- \\`docs/sparrow/design/{slug}/spec.md\\`\uFF08\u5BF9\u6BCF\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\uFF09\n\n\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\n\n- **\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\n- **\u8986\u76D6 (overwrite)**\uFF1A\u5220\u9664\u5DF2\u6709\u6587\u4EF6\uFF0C\u91CD\u65B0\u751F\u6210\u5168\u65B0\u7684\u5185\u5BB9\n- **\u66F4\u65B0 (update)**\uFF1A\u5728\u5DF2\u6709\u6587\u4EF6\u57FA\u7840\u4E0A\u8FDB\u884C\u4FEE\u6539\u548C\u5B8C\u5584\n\n> \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\n\n---\n\n## \uD83D\uDCCB project.md \u66F4\u65B0\n\n\u5B8C\u6210\u8F93\u51FA\u540E\uFF0C**\u5FC5\u987B**\u66F4\u65B0 \\`docs/sparrow/project.md\\`\uFF1A\n\n1. \u5982\u679C \\`project.md\\` \u4E0D\u5B58\u5728\uFF0C\u6839\u636E\u5F53\u524D\u9879\u76EE\u4FE1\u606F\u521B\u5EFA\u5B83\n2. \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\n3. \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\n \\`\\`\\`markdown\n #### {\u9650\u754C\u4E0A\u4E0B\u6587\u540D\u79F0} (\\`{slug}\\`)\n - [spec](./design/{slug}/spec.md) \u2014 *v1.0*\n - [api](./design/{slug}/api.md) \u2014 *\u5F85\u751F\u6210*\n - [tech](./design/{slug}/tech.md) \u2014 *\u5F85\u751F\u6210*\n - [model](./design/{slug}/model.md) \u2014 *\u5F85\u751F\u6210*\n - [plan](./design/{slug}/plan.md) \u2014 *\u5F85\u751F\u6210*\n \\`\\`\\`\n4. \u66F4\u65B0\u6587\u4EF6\u5934\u90E8\u7684\"\u6700\u540E\u66F4\u65B0\"\u65F6\u95F4\u6233\n\n**project.md \u8DEF\u5F84**: \\`docs/sparrow/project.md\\`\n\n---\n\n## \uD83D\uDCCC \u7248\u672C\u5143\u6570\u636E\u7BA1\u7406\n\n\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\n\n\\`\\`\\`markdown\n<!--\n version: v1.0\n last-updated: {ISO_8601_TIMESTAMP}\n generated-by: sparrow-arch\n sparrow-version: {\u4ECE .sparrow/sparrow.json \u8BFB\u53D6}\n-->\n\\`\\`\\`\n\n**\u7248\u672C\u89C4\u5219**:\n- **\u65B0\u6587\u6863**: \u4F7F\u7528 \\`v1.0\\`\n- **\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\n- **\u91CD\u5927\u91CD\u5199**: \u9012\u589E\u4E3B\u7248\u672C\u53F7\uFF08\\`v1.x\\` \u2192 \\`v2.0\\`\uFF09\n- \u6BCF\u6B21\u4FEE\u6539\u90FD**\u5FC5\u987B\u53D8\u66F4**\u7248\u672C\u53F7\n\n**\u64CD\u4F5C\u6B65\u9AA4**:\n1. \u68C0\u67E5\u76EE\u6807\u6587\u4EF6\u662F\u5426\u5DF2\u5B58\u5728\n2. \u5982\u679C\u5B58\u5728\uFF0C\u8BFB\u53D6\u6587\u4EF6\u5F00\u5934 \\`<!--\\` \u6CE8\u91CA\u5757\u4E2D\u7684 \\`version:\\` \u5B57\u6BB5\u5E76\u9012\u589E\n3. \u5728\u6587\u4EF6\u5F00\u5934\u6DFB\u52A0\u6216\u66F4\u65B0\u7248\u672C\u5143\u6570\u636E\u5757\n4. \u7EE7\u7EED\u751F\u6210\u6587\u6863\u6B63\u6587\n\n---\n\n## \u6982\u8FF0\n\n\u672C\u9636\u6BB5\u5206\u4E3A\u4E24\u4E2A\u5B50\u6B65\u9AA4\uFF1A\n\n### \u5B50\u6B65\u9AA4 1\uFF1A\u4E1A\u52A1\u67B6\u6784\u5B9A\u4E49\n\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\n\n### \u5B50\u6B65\u9AA4 2\uFF1A\u5E94\u7528\u67B6\u6784\u6620\u5C04\n\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\n\n---\n\n# \u9636\u6BB5\u4E00\uFF1A\u4E1A\u52A1\u67B6\u6784\u5B9A\u4E49\n\n## \u7B2C\u4E00\u6027\u539F\u7406\n\n### 1. \u4EF7\u503C\u5BFC\u5411\u539F\u5219\n- \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\n- \u6BCF\u4E2A\u5B50\u9886\u57DF\u90FD\u5E94\u8BE5\u4E3A\u4E1A\u52A1\u76EE\u6807\u521B\u9020\u660E\u786E\u7684\u4EF7\u503C\n\n### 2. \u5185\u805A\u6027\u539F\u5219\n- \u540C\u4E00\u5B50\u9886\u57DF\u5185\u7684\u4E1A\u52A1\u670D\u52A1\u5E94\u8BE5\u5177\u6709\u9AD8\u5EA6\u7684\u5185\u805A\u6027\n- \u4E0D\u540C\u5B50\u9886\u57DF\u4E4B\u95F4\u5E94\u8BE5\u4FDD\u6301\u677E\u8026\u5408\u5173\u7CFB\n\n### 3. \u6218\u7565\u91CD\u8981\u6027\u539F\u5219\n- \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\n- \u652F\u6491\u5B50\u9886\u57DF\u4E3A\u4E1A\u52A1\u5FC5\u9700\uFF0C\u4F46\u975E\u6838\u5FC3\u7ADE\u4E89\u529B\n- \u901A\u7528\u5B50\u9886\u57DF\u5E94\u4F18\u5148\u8003\u8651\u8D2D\u4E70\u6216\u4F7F\u7528\u6210\u719F\u89E3\u51B3\u65B9\u6848\n\n## \u5B50\u9886\u57DF\u5206\u7C7B\u6807\u51C6\n\n### \u6838\u5FC3\u5B50\u9886\u57DF (Core Subdomain)\n**\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\n**\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\n**\u989C\u8272**\uFF1A\u84DD\u8272 (#e1f5fe)\n\n### \u652F\u6491\u5B50\u9886\u57DF (Supporting Subdomain)\n**\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\n**\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\n**\u989C\u8272**\uFF1A\u7D2B\u8272 (#f3e5f5)\n\n### \u901A\u7528\u5B50\u9886\u57DF (Generic Subdomain)\n**\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\n**\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\n**\u989C\u8272**\uFF1A\u7EFF\u8272 (#e8f5e8)\n\n## \u8BC6\u522B\u6B65\u9AA4\u6307\u5BFC\n\n### \u6B65\u9AA41\uFF1A\u8BED\u4E49\u76F8\u5173\u6027\u5206\u6790\n\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\n\n### \u6B65\u9AA42\uFF1A\u529F\u80FD\u76F8\u5173\u6027\u5206\u6790\n\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\n\n### \u6B65\u9AA43\uFF1A\u5F52\u7EB3\u5171\u540C\u7279\u5F81\n\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\n\n**\u5F52\u7EB3\u539F\u5219**\uFF1A\n- **\u9AD8\u5185\u805A\u677E\u8026\u5408\u539F\u5219**\n- **\u5355\u4E00\u62BD\u8C61\u5C42\u6B21\u539F\u5219**\n- **\u5965\u5361\u59C6\u5243\u5200\u539F\u5219**\n- **\u6700\u5C0F\u60CA\u8BB6\u6CD5\u5219**\n- **\u6E05\u6670\u8FB9\u754C\u539F\u5219**\n\n## \u8BC6\u522B\u6CE8\u610F\u4E8B\u9879\n\n1. **\u907F\u514D\u754C\u9762\u83DC\u5355\u5206\u7C7B\u5F71\u54CD**\uFF1A\u4E0D\u8981\u53D7 UI \u83DC\u5355\u5E03\u5C40\u5F71\u54CD\n2. **\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\n3. **\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\n4. **\u907F\u514D\u8FC7\u5EA6\u62BD\u8C61**\uFF1A\u4E0D\u8981\u4ECE\u4E00\u5F00\u59CB\u5C31\u5EFA\u7ACB\u8FC7\u9AD8\u7684\u62BD\u8C61\n\n## \u4E1A\u52A1\u67B6\u6784\u56FE\u7ED8\u5236\u89C4\u8303\n\n\u4F7F\u7528 Mermaid \u8BED\u6CD5\u3002**Mermaid 8.8.0 \u7248\u672C\u91CD\u8981\u8981\u6C42**\uFF1A\n- \u6240\u6709 subgraph \u540D\u79F0\u5FC5\u987B\u4F7F\u7528**\u82F1\u6587\u53CC\u5F15\u53F7** \\`\"\\`\uFF0C\u4E0D\u80FD\u4F7F\u7528\u4E2D\u6587\u5F15\u53F7\n- \u8282\u70B9 ID \u4E0D\u80FD\u5305\u542B\u7A7A\u683C\uFF0C\u4F7F\u7528\u4E0B\u5212\u7EBF\u6216\u9A7C\u5CF0\u547D\u540D\n- \u8282\u70B9\u6807\u7B7E\u53EF\u4EE5\u4F7F\u7528\u4E2D\u6587\uFF0C\u5EFA\u8BAE\u7528\u5F15\u53F7\u5305\u88F9\n\n\\`\\`\\`mermaid\ngraph TB\n subgraph \"\u7CFB\u7EDF\u8303\u56F4\"\n subgraph \"\u901A\u7528\u5B50\u9886\u57DF\"\n C1[\u5B50\u9886\u57DFC1]\n C2[\u5B50\u9886\u57DFC2]\n end\n\n subgraph \"\u652F\u6491\u5B50\u9886\u57DF\"\n B1[\u5B50\u9886\u57DFB1]\n B2[\u5B50\u9886\u57DFB2]\n end\n\n subgraph \"\u6838\u5FC3\u5B50\u9886\u57DF\"\n A1[\u5B50\u9886\u57DFA1]\n A2[\u5B50\u9886\u57DFA2]\n end\n end\n\n classDef coreDomain fill:#e1f5fe,stroke:#01579b,stroke-width:2px\n classDef supportingDomain fill:#f3e5f5,stroke:#4a148c,stroke-width:2px\n classDef genericDomain fill:#e8f5e8,stroke:#1b5e20,stroke-width:2px\n\n class A1,A2 coreDomain\n class B1,B2 supportingDomain\n class C1,C2 genericDomain\n\\`\\`\\`\n\n## \u8F93\u51FA\u6587\u6863\u683C\u5F0F\uFF08\u9636\u6BB5\u4E00\uFF09\n\n\u5199\u5165 **\\`docs/sparrow/architecture/business.md\\`**\uFF1A\n\n\\`\\`\\`markdown\n# 1 \u4E1A\u52A1\u67B6\u6784\n\n## 1.1 \u6218\u7565\u76EE\u6807\u4E0E\u5546\u4E1A\u80CC\u666F\n\n### 1.1.1 \u4E1A\u52A1\u613F\u666F\n### 1.1.2 \u8981\u89E3\u51B3\u7684\u6838\u5FC3\u4E1A\u52A1\u95EE\u9898\n### 1.1.3 \u5173\u952E\u4E1A\u52A1\u76EE\u6807/\u6307\u6807\n### 1.1.4 \u4E3B\u8981\u9650\u5236\u4E0E\u5047\u8BBE\n\n## 1.2 \u4E1A\u52A1\u67B6\u6784\u56FE\n[Mermaid \u4E1A\u52A1\u67B6\u6784\u56FE]\n\n## 1.3 \u5B50\u9886\u57DF\u5212\u5206\n\n### 1.3.1 \u6838\u5FC3\u5B50\u9886\u57DF\n#### \u5B50\u9886\u57DFA\n- SERVICE-001: \u670D\u52A1\u540D\u79F0\n- SERVICE-002: \u670D\u52A1\u540D\u79F0\n\n### 1.3.2 \u652F\u6491\u5B50\u9886\u57DF\n### 1.3.3 \u901A\u7528\u5B50\u9886\u57DF\n\n## 1.4 \u5B50\u9886\u57DF\u5206\u6790\u8BF4\u660E\n\\`\\`\\`\n\n---\n\n# \u9636\u6BB5\u4E8C\uFF1A\u5E94\u7528\u67B6\u6784\u6620\u5C04\n\n## \u7B2C\u4E00\u6027\u539F\u7406\n\n### 1. \u9886\u57DF\u9A71\u52A8\u539F\u5219\n- \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\n- \u6BCF\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u90FD\u5E94\u8BE5\u62E5\u6709\u7B26\u5408\u5176\u4E1A\u52A1\u80FD\u529B\u7684\u9886\u57DF\u77E5\u8BC6\n- \u907F\u514D\u8DE8\u4E0A\u4E0B\u6587\u7684\u9886\u57DF\u6982\u5FF5\u51B2\u7A81\n\n### 2. \u4E1A\u52A1\u80FD\u529B\u5BFC\u5411\u539F\u5219\n- \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\n- \u6BCF\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u90FD\u5E94\u8BE5\u5177\u5907\u5171\u540C\u7684\u4E1A\u52A1\u76EE\u6807\n- \u5BF9\u5916\u63D0\u4F9B\u5185\u805A\u7684\u4E1A\u52A1\u80FD\u529B\uFF0C\u5BF9\u5185\u7BA1\u7406\u76F8\u5173\u7684\u4E1A\u52A1\u89C4\u5219\n\n### 3. \u6280\u672F\u67B6\u6784\u539F\u5219\n- \u670D\u52A1\u81EA\u6CBB\uFF1A\u6BCF\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u5E94\u8BE5\u80FD\u591F\u72EC\u7ACB\u90E8\u7F72\u548C\u8FD0\u884C\n- \u9AD8\u5185\u805A\u4F4E\u8026\u5408\n- \u63A5\u53E3\u7A33\u5B9A\u6027\n\n### 4. \u56E2\u961F\u7EC4\u7EC7\u539F\u5219\n- \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\n- \u56E2\u961F\u7684\u8D23\u4EFB\u8FB9\u754C\u5E94\u4E0E\u9650\u754C\u4E0A\u4E0B\u6587\u7684\u4E1A\u52A1\u80FD\u529B\u4FDD\u6301\u4E00\u81F4\n\n## \u6620\u5C04\u8FC7\u7A0B\uFF08\u5FC5\u987B\u4E25\u683C\u6309\u987A\u5E8F\u6267\u884C\uFF09\n\n### \u6B65\u9AA41\uFF1A\u5B50\u9886\u57DF\u6620\u5C04\u4E3A\u9650\u754C\u4E0A\u4E0B\u6587\uFF08\u521D\u59CB\u6620\u5C04\uFF09\n\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\n- **\u6838\u5FC3\u5B50\u9886\u57DF** \u2192 **\u6838\u5FC3\u80FD\u529B\u5C42**\n- **\u652F\u6491\u5B50\u9886\u57DF** \u2192 **\u516C\u5171\u80FD\u529B\u5C42**\n- **\u901A\u7528\u5B50\u9886\u57DF** \u2192 **\u516C\u5171\u80FD\u529B\u5C42**\n\n### \u6B65\u9AA42\uFF1A\u5F3A\u5236\u4F18\u5316\u8C03\u6574\u5206\u6790\uFF08\u5FC5\u987B\u6267\u884C\uFF09\n\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\n\n#### 2.1 \u9886\u57DF\u6A21\u578B\u77E5\u8BC6\u8BED\u5883\u51B2\u7A81\u5206\u6790\n- \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\n- \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\n- \u6570\u636E\u4E00\u81F4\u6027\uFF1A\u5B50\u9886\u57DF\u5185\u7684\u6570\u636E\u6A21\u578B\u662F\u5426\u5B58\u5728\u51B2\u7A81\n\n#### 2.2 \u4E1A\u52A1\u80FD\u529B\u5185\u805A\u6027\u5206\u6790\n- \u4E1A\u52A1\u76EE\u6807\u4E00\u81F4\u6027\n- \u529F\u80FD\u76F8\u5173\u6027\n- \u6570\u636E\u5171\u4EAB\u7A0B\u5EA6\n\n#### 2.3 \u6280\u672F\u56E0\u7D20\u5F71\u54CD\u5206\u6790\n- \u590D\u7528\u9700\u6C42\n- \u53D8\u5316\u9891\u7387\n- \u8D28\u91CF\u5C5E\u6027\u8981\u6C42\n- \u6280\u672F\u6808\u5DEE\u5F02\n\n#### 2.4 \u56E2\u961F\u7EC4\u7EC7\u56E0\u7D20\u5206\u6790\n- \u56E2\u961F\u89C4\u6A21\n- \u6280\u80FD\u5339\u914D\n- \u4EA4\u4ED8\u5468\u671F\n\n### \u6B65\u9AA43\uFF1A\u9650\u754C\u4E0A\u4E0B\u6587\u91CD\u6784\n\u57FA\u4E8E\u6B65\u9AA42\u7684\u5206\u6790\u7ED3\u679C\u8FDB\u884C\u91CD\u6784\uFF1A\n- **\u4E0A\u4E0B\u6587\u5206\u79BB**\uFF1A\u6309\u4E1A\u52A1\u76EE\u6807\u3001\u6280\u672F\u7279\u6027\u3001\u56E2\u961F\u80FD\u529B\u5206\u79BB\n- **\u4E0A\u4E0B\u6587\u5408\u5E76**\uFF1A\u6309\u4E1A\u52A1\u76EE\u6807\u3001\u6570\u636E\u4F9D\u8D56\u3001\u529F\u80FD\u8026\u5408\u5408\u5E76\n- **\u4E0A\u4E0B\u6587\u91CD\u7EC4**\uFF1A\u6309\u4E1A\u52A1\u4EF7\u503C\u3001\u6280\u672F\u590D\u6742\u5EA6\u3001\u56E2\u961F\u7EC4\u7EC7\u91CD\u7EC4\n\n### \u6B65\u9AA44\uFF1A\u9A8C\u8BC1\u9650\u754C\u4E0A\u4E0B\u6587\u7684\u5408\u7406\u6027\n- \u81EA\u6CBB\u539F\u5219\u9A8C\u8BC1\n- \u5965\u5361\u59C6\u5243\u5200\u539F\u5219\u9A8C\u8BC1\n- \u6E05\u6670\u8FB9\u754C\u539F\u5219\u9A8C\u8BC1\n- \u6700\u5C0F\u60CA\u8BB6\u6CD5\u5219\u9A8C\u8BC1\n\n## \u4E0A\u4E0B\u6587\u6620\u5C04\u5173\u7CFB\u6A21\u5F0F\n\n1. **\u9632\u8150\u5C42 (ACL)**\uFF1A\u4E0B\u6E38\u9694\u79BB\u4E0A\u6E38\u53D8\u5316\n2. **\u5F00\u653E\u4E3B\u673A\u670D\u52A1 (OHS)**\uFF1A\u4E0A\u6E38\u63D0\u4F9B\u7A33\u5B9A\u670D\u52A1\u63A5\u53E3\n3. **\u9075\u5949\u8005 (Conformist)**\uFF1A\u4E0B\u6E38\u5B8C\u5168\u9075\u5FAA\u4E0A\u6E38\u6A21\u578B\n4. **\u5BA2\u6237-\u4F9B\u5E94\u5546 (Customer-Supplier)**\uFF1A\u660E\u786E\u4F9D\u8D56\u5173\u7CFB\n5. **\u5171\u4EAB\u5185\u6838 (Shared Kernel)**\uFF1A\u5171\u4EAB\u6838\u5FC3\u6982\u5FF5\u548C\u6A21\u578B\n\n## \u5E94\u7528\u67B6\u6784\u56FE\u7ED8\u5236\u89C4\u8303\n\n\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\n\n**Mermaid 8.8.0 \u8BED\u6CD5\u8981\u6C42**\uFF1A\n- subgraph \u540D\u79F0\u4F7F\u7528\u82F1\u6587\u53CC\u5F15\u53F7\n- \u8282\u70B9 ID \u4F7F\u7528\u82F1\u6587\u9A7C\u5CF0\u547D\u540D\n- \u8FB9\u6807\u7B7E\u4F7F\u7528\u82F1\u6587\u5F15\u53F7\u5305\u88F9\n- \u683C\u5F0F\uFF1A\\`NodeA -->|\"\u5173\u7CFB\u8BF4\u660E\"| NodeB\\`\n\n## \u8F93\u51FA\u6587\u6863\u683C\u5F0F\uFF08\u9636\u6BB5\u4E8C\uFF09\n\n\u5199\u5165 **\\`docs/sparrow/architecture/application.md\\`**\uFF1A\n\n\\`\\`\\`markdown\n# \u5E94\u7528\u67B6\u6784\u5B9A\u4E49\u6587\u6863\n\n## 1. \u5E94\u7528\u67B6\u6784\u56FE\n[Mermaid \u56DB\u5C42\u67B6\u6784\u56FE]\n\n## 2. \u9650\u754C\u4E0A\u4E0B\u6587\u603B\u89C8\n| \u9650\u754C\u4E0A\u4E0B\u6587 | \u627F\u8F7D\u7684\u4E3B\u8981\u5B50\u57DF | \u5B9E\u73B0\u5EFA\u8BAE |\n|-----------|---------------|---------|\n| \u4E0A\u4E0B\u6587\u540D\u79F0 | \u5B50\u57DF\u7C7B\u578B: \u5B50\u57DF\u540D\u79F0 | \u5FAE\u670D\u52A1/\u6A21\u5757/SaaS |\n\n## 3. \u4E0A\u4E0B\u6587\u6620\u5C04\u56FE\n[Mermaid \u4E0A\u4E0B\u6587\u6620\u5C04\u56FE]\n\n## 4. \u5173\u7CFB\u5B9A\u4E49\u4E0E\u96C6\u6210\u7B56\u7565\n| \u4E0A\u6E38\u4E0A\u4E0B\u6587 | \u4E0B\u6E38\u4E0A\u4E0B\u6587 | \u5173\u7CFB\u6A21\u5F0F | \u7406\u7531\u4E0E\u8BF4\u660E |\n\n## 5. \u9650\u754C\u4E0A\u4E0B\u6587\u8BE6\u7EC6\u8BBE\u8BA1\n\u4E3A\u6BCF\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u63D0\u4F9B\uFF1A\n- \u9650\u754C\u4E0A\u4E0B\u6587\u540D\u79F0\uFF08\u4E2D\u6587 + \u82F1\u6587\u9A7C\u5CF0\u547D\u540D\uFF09\n- \u5173\u8054\u5B50\u57DF\n- \u6838\u5FC3\u804C\u8D23\n- \u6838\u5FC3\u4E1A\u52A1\u89C4\u5219/\u4E0D\u53D8\u91CF\n- \u5173\u952E\u4E1A\u52A1\u6982\u5FF5\n- \u7EDF\u4E00\u8BED\u8A00\u8868\n- \u5BF9\u5916\u66B4\u9732\u7684\u5173\u952E\u80FD\u529B\n- \u6280\u672F\u5B9E\u73B0\u5EFA\u8BAE\n- \u670D\u52A1\u5951\u7EA6\uFF08\u670D\u52A1ID: \u670D\u52A1\u540D\u79F0\uFF09\n\\`\\`\\`\n\n## \u8D28\u91CF\u68C0\u67E5\u6E05\u5355\n\n- [ ] \u6BCF\u4E2A\u5B50\u9886\u57DF\u90FD\u6B63\u786E\u6620\u5C04\u4E3A\u9650\u754C\u4E0A\u4E0B\u6587\n- [ ] \u6838\u5FC3\u5B50\u9886\u57DF\u6620\u5C04\u5230\u6838\u5FC3\u80FD\u529B\u5C42\n- [ ] \u652F\u6491\u548C\u901A\u7528\u5B50\u9886\u57DF\u6620\u5C04\u5230\u516C\u5171\u80FD\u529B\u5C42\n- [ ] \u9650\u754C\u4E0A\u4E0B\u6587\u4E4B\u95F4\u7684\u4F9D\u8D56\u5173\u7CFB\u6E05\u6670\u660E\u786E\n- [ ] \u4E0A\u4E0B\u6587\u6620\u5C04\u5173\u7CFB\u6A21\u5F0F\u9009\u62E9\u5408\u7406\n- [ ] \u6BCF\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u90FD\u6709\u660E\u786E\u7684\u804C\u8D23\u8FB9\u754C\n- [ ] \u670D\u52A1\u5951\u7EA6\u5206\u914D\u5408\u7406\uFF0C\u65E0\u91CD\u590D\u6216\u9057\u6F0F\n\n## \u5F3A\u5236\u6027\u4F18\u5316\u68C0\u67E5\u6E05\u5355\n- [ ] \u8BC6\u522B\u5E76\u89E3\u51B3\u4E86\u6982\u5FF5\u91CD\u53E0\u95EE\u9898\n- [ ] \u660E\u786E\u4E86\u804C\u8D23\u8FB9\u754C\n- [ ] \u9A8C\u8BC1\u4E86\u4E1A\u52A1\u76EE\u6807\u4E00\u81F4\u6027\n- [ ] \u8BC4\u4F30\u4E86\u529F\u80FD\u76F8\u5173\u6027\n- [ ] \u8BC6\u522B\u4E86\u590D\u7528\u9700\u6C42\n- [ ] \u6267\u884C\u4E86\u4E0A\u4E0B\u6587\u5206\u79BB/\u5408\u5E76/\u91CD\u7EC4\n- [ ] \u9A8C\u8BC1\u4E86\u5408\u7406\u6027\n\n## \u9650\u754C\u4E0A\u4E0B\u6587\u76EE\u5F55\u521B\u5EFA\n\n\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\n\n1. \u4ECE application.md \u4E2D\u63D0\u53D6\u6240\u6709\u9650\u754C\u4E0A\u4E0B\u6587\u7684\u82F1\u6587 slug\n2. \u5728 \\`docs/sparrow/design/{english-slug}/\\` \u4E0B\u521B\u5EFA\u76EE\u5F55\n3. \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\\`\n\n## \u5B8C\u6210\u540E\u7684\u4E0B\u4E00\u6B65\n\n\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\n`;\n\nexport function register(): void {\n registerSkillTemplate('sparrow-arch', () => ARCH_BODY);\n}\n", "/**\n * Sparrow Design skill template.\n *\n * This skill generates API contracts (api.md) and technology stack selection (tech.md)\n * for a specific bounded context.\n */\n\nimport { registerSkillTemplate } from '../core/skill-generation.js';\n\nconst DESIGN_BODY = `# Sparrow Design \u2014 API \u5951\u7EA6\u4E0E\u6280\u672F\u9009\u578B\n\n## \u6267\u884C\u987A\u5E8F\u68C0\u67E5\n\n\u5728\u6267\u884C\u4E4B\u524D\uFF0C\u8BF7\u68C0\u67E5\u5F53\u524D\u9636\u6BB5\u662F\u5426\u5408\u9002\uFF1A\n\n\\`\\`\\`\n\u5F53\u524D\u6B65\u9AA4\uFF1Asparrow-design\uFF08\u7B2C 3 \u6B65 / \u5171 6 \u6B65\uFF09\n\u6240\u5C5E\u5C42\u7EA7\uFF1A\u56E2\u961F\u7EA7\uFF08team-level\uFF09\uFF0C\u9488\u5BF9\u7279\u5B9A\u9650\u754C\u4E0A\u4E0B\u6587\n\u524D\u7F6E\u6761\u4EF6\uFF1A\n 1. docs/sparrow/architecture/application.md \u5FC5\u987B\u5B58\u5728\n 2. docs/sparrow/design/{slug}/spec.md \u5FC5\u987B\u5B58\u5728\n\u4E0B\u4E00\u6B65\u9AA4\uFF1Asparrow-model @{slug}\uFF08\u56E2\u961F\u7EA7\uFF09\n\\`\\`\\`\n\n**\u524D\u7F6E\u6761\u4EF6\u68C0\u67E5**\uFF1A\n- \u5982\u679C \\`docs/sparrow/architecture/application.md\\` \u4E0D\u5B58\u5728\uFF0C\u8BF7\u63D0\u793A\u7528\u6237\u5148\u6267\u884C **sparrow-arch**\n- \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\n- \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\n- \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\n\n---\n\n## \uD83D\uDED1 \u8F93\u51FA\u6587\u4EF6\u5B58\u5728\u6027\u68C0\u67E5\uFF08\u5FC5\u987B\u5728\u751F\u6210\u524D\u6267\u884C\uFF09\n\n\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\n\n- \\`docs/sparrow/design/{slug}/api.md\\`\n- \\`docs/sparrow/design/{slug}/tech.md\\`\n\n\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\n\n- **\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\n- **\u8986\u76D6 (overwrite)**\uFF1A\u5220\u9664\u5DF2\u6709\u6587\u4EF6\uFF0C\u91CD\u65B0\u751F\u6210\u5168\u65B0\u7684\u5185\u5BB9\n- **\u66F4\u65B0 (update)**\uFF1A\u5728\u5DF2\u6709\u6587\u4EF6\u57FA\u7840\u4E0A\u8FDB\u884C\u4FEE\u6539\u548C\u5B8C\u5584\n\n> \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\n\n---\n\n## \uD83D\uDCCB project.md \u66F4\u65B0\n\n\u5B8C\u6210\u8F93\u51FA\u540E\uFF0C**\u5FC5\u987B**\u66F4\u65B0 \\`docs/sparrow/project.md\\`\uFF1A\n\n1. \u5982\u679C \\`project.md\\` \u4E0D\u5B58\u5728\uFF0C\u6839\u636E\u5F53\u524D\u9879\u76EE\u4FE1\u606F\u521B\u5EFA\u5B83\n2. \u5728\"\u9650\u754C\u4E0A\u4E0B\u6587\u8BBE\u8BA1\"\u90E8\u5206\uFF0C\u627E\u5230\u5F53\u524D \\`{slug}\\` \u7684\u5B50\u7AE0\u8282\n3. \u66F4\u65B0 \\`api.md\\` \u548C \\`tech.md\\` \u7684\u72B6\u6001\u4ECE \\`_\u5F85\u751F\u6210_\\` \u6539\u4E3A \\`_v{version}_\\`\n4. \u786E\u4FDD project.md \u7684\"API \u76EE\u5F55\"\u90E8\u5206\u5F15\u7528\u4E86 \\`docs/sparrow/api.md\\`\uFF1A\n \\`\\`\\`markdown\n ### 5. API \u76EE\u5F55\n - [API \u603B\u76EE\u5F55](./api.md) \u2014 \u6240\u6709\u9650\u754C\u4E0A\u4E0B\u6587\u7684\u516C\u5F00 API \u6C47\u603B\n \\`\\`\\`\n5. \u66F4\u65B0\u6587\u4EF6\u5934\u90E8\u7684\"\u6700\u540E\u66F4\u65B0\"\u65F6\u95F4\u6233\n\n**project.md \u8DEF\u5F84**: \\`docs/sparrow/project.md\\`\n\n---\n\n## \uD83D\uDCCC \u7248\u672C\u5143\u6570\u636E\u7BA1\u7406\n\n\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\n\n\\`\\`\\`markdown\n<!--\n version: v1.0\n last-updated: {ISO_8601_TIMESTAMP}\n generated-by: sparrow-design\n sparrow-version: {\u4ECE .sparrow/sparrow.json \u8BFB\u53D6}\n-->\n\\`\\`\\`\n\n**\u7248\u672C\u89C4\u5219**:\n- **\u65B0\u6587\u6863**: \u4F7F\u7528 \\`v1.0\\`\n- **\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\n- **\u91CD\u5927\u91CD\u5199**: \u9012\u589E\u4E3B\u7248\u672C\u53F7\uFF08\\`v1.x\\` \u2192 \\`v2.0\\`\uFF09\n- \u6BCF\u6B21\u4FEE\u6539\u90FD**\u5FC5\u987B\u53D8\u66F4**\u7248\u672C\u53F7\n\n**\u64CD\u4F5C\u6B65\u9AA4**:\n1. \u68C0\u67E5\u76EE\u6807\u6587\u4EF6\u662F\u5426\u5DF2\u5B58\u5728\n2. \u5982\u679C\u5B58\u5728\uFF0C\u8BFB\u53D6\u6587\u4EF6\u5F00\u5934 \\`<!--\\` \u6CE8\u91CA\u5757\u4E2D\u7684 \\`version:\\` \u5B57\u6BB5\u5E76\u9012\u589E\n3. \u5728\u6587\u4EF6\u5F00\u5934\u6DFB\u52A0\u6216\u66F4\u65B0\u7248\u672C\u5143\u6570\u636E\u5757\n4. \u7EE7\u7EED\u751F\u6210\u6587\u6863\u6B63\u6587\n\n---\n\n## \u89D2\u8272\u5B9A\u4E49\n\n\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\n1. **\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\n2. **\u6280\u672F\u9009\u578B\u6587\u6863\uFF08tech.md\uFF09**\uFF1A\u6280\u672F\u6808\u9009\u62E9\u4E0E\u5B9E\u73B0\u7EA6\u675F\n\n## \u6838\u5FC3\u539F\u5219\uFF1A\u805A\u7126\u8DE8\u4E0A\u4E0B\u6587\u534F\u4F5C\n\n**\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**\n\n- \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\n- \u2705 API \u5B9A\u4E49\u662F\u5F53\u524D\u9650\u754C\u4E0A\u4E0B\u6587**\u5BF9\u5916\u516C\u5F00**\u7684\u670D\u52A1\u5951\u7EA6\n- \u2705 \u8DE8\u4E0A\u4E0B\u6587\u7684\u6D88\u606F\u4EA4\u4E92\uFF08\u540C\u6B65\u8C03\u7528 + \u5F02\u6B65\u4E8B\u4EF6\uFF09\n- \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\n- \u274C **\u4E0D\u8981**\u8BBE\u8BA1\u5185\u90E8\u67B6\u6784\u7684\u5206\u5C42\u7EC6\u8282\n\n> \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\n\n## \u6838\u5FC3\u539F\u5219\uFF1A\u4E00\u4E2A\u4E1A\u52A1\u670D\u52A1 = \u4E00\u4E2A API\n\n**\u5728 sequence diagram \u4E2D\uFF0Cactor \u5411\u5F53\u524D\u9650\u754C\u4E0A\u4E0B\u6587\u5E94\u53EA\u53D1\u8D77\u4E00\u6B21\u8BF7\u6C42\u3002**\n\n\u8FD9\u662F\u8FDE\u63A5 explore \u4E0E design \u7684\u5173\u952E\u7EA6\u675F\uFF1A\n- 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**\n- \u8FD9\u4E00\u8BF7\u6C42\u9A71\u52A8\u51FA\u4E00\u4E2A**\u5E8F\u5217\u56FE**\uFF0C\u8FDB\u800C\u63A8\u5BFC\u51FA\u4E00\u4E2A **API \u5B9A\u4E49**\n- \u56E0\u6B64\uFF1A**\u4E00\u4E2A\u4E1A\u52A1\u670D\u52A1 \u2192 \u4E00\u4E2A\u5E8F\u5217\u56FE \u2192 \u4E00\u4E2A API**\n\n### \u5E8F\u5217\u56FE\u7ED8\u5236\u7EA6\u675F\n\n1. \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**\n2. \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\n3. \u4E0D\u8981\u5728\u4E00\u4E2A\u5E8F\u5217\u56FE\u4E2D\u7ED8\u5236\u591A\u4E2A\u72EC\u7ACB\u7684\u4E1A\u52A1\u670D\u52A1\n4. \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\n\n### \u81EA\u68C0\u6E05\u5355\n\n- [ ] \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\n- [ ] \u6BCF\u4E2A\u5E8F\u5217\u56FE\u4E2D\uFF0C\u5411\u5F53\u524D BC \u53D1\u8D77\u7684\u8BF7\u6C42\u662F\u5426\u53EA\u6709**\u4E00\u6B21**\uFF1F\n- [ ] \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\n\n## \u8F93\u5165\u6587\u6863\u8981\u6C42\n\n### \u5FC5\u9700\u6587\u6863\n1. **\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\n2. **\u5E94\u7528\u67B6\u6784\u5B9A\u4E49\u6587\u6863**\uFF1A\\`docs/sparrow/architecture/application.md\\`\n3. **\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\n\n## \u6280\u672F\u9009\u578B\u4EA4\u4E92\u6D41\u7A0B\n\n\u5728\u6267\u884C sparrow-design \u65F6\uFF0C\u4F60\u9700\u8981\u5F15\u5BFC\u7528\u6237\u8FDB\u884C\u4EE5\u4E0B\u9009\u62E9\uFF1A\n\n### \u7B2C\u4E00\u6B65\uFF1A\u9009\u62E9\u540E\u7AEF\u5B9E\u73B0\u8BED\u8A00\n\u8BF7\u7528\u6237\u4ECE\u4EE5\u4E0B\u9009\u9879\u4E2D\u9009\u62E9\uFF1A\n1. **Java** (Spring Boot 3.x + Maven)\n2. **Node.js** (TypeScript + Express/NestJS)\n3. **Python** (FastAPI/Django + uv)\n4. **Go** (\u6807\u51C6\u5E93 net/http \u6216 chi)\n5. **Rust** (Axum + SQLx)\n6. **C++** (C++17/20 + CMake + drogon/pistache)\n\n### \u7B2C\u4E8C\u6B65\uFF1A\u9009\u62E9\u5177\u4F53\u6280\u672F\u6808\u65B9\u6848\n\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\n\n### \u7B2C\u4E09\u6B65\uFF1A\u5199\u5165 tech.md\n\u5C06\u7528\u6237\u9009\u5B9A\u7684\u65B9\u6848\u5199\u5165 \\`docs/sparrow/design/{slug}/tech.md\\`\n\n## tech.md \u7ED3\u6784\n\n\u5199\u5165 **\\`docs/sparrow/design/{slug}/tech.md\\`**\uFF1A\n\n\\`\\`\\`markdown\n# \u6280\u672F\u9009\u578B \u2014 {\u9650\u754C\u4E0A\u4E0B\u6587\u4E2D\u6587\u540D} ({english-slug})\n\n## 1. \u6982\u8FF0\u4E0E\u9009\u578B\u7ED3\u8BBA\n- **\u9009\u5B9A\u65B9\u6848**: {\u65B9\u6848\u6807\u9898}\n- **\u7ED3\u8BBA\u6458\u8981**: {\u4E3A\u4EC0\u4E48\u8BE5\u65B9\u6848\u9002\u914D\u672C\u4E0A\u4E0B\u6587}\n\n## 2. \u4E0E\u5E94\u7528\u67B6\u6784\u7684\u5BF9\u5E94\u5173\u7CFB\n- **\u6280\u672F\u5B9E\u73B0\u5EFA\u8BAE\uFF08\u6458\u5F55\uFF09**: {\u6765\u81EA application.md}\n- **\u5BF9\u7B56**: {\u9009\u578B\u5982\u4F55\u843D\u5B9E\u4E0A\u8FF0\u5EFA\u8BAE}\n\n## 3. \u9009\u5B9A\u6280\u672F\u6808\u8BE6\u8FF0\n| \u5C42\u6B21 | \u9009\u578B | \u8BF4\u660E |\n|------|------|------|\n| \u8FD0\u884C\u65F6 / \u8BED\u8A00 | | |\n| \u5E94\u7528\u6846\u67B6 | | |\n| API \u5C42 | | |\n| \u4E3B\u8981\u4F9D\u8D56 | | |\n\n## 4. API \u4E0E\u96C6\u6210\n- **\u5BF9\u5916\u5951\u7EA6**: \u5BF9\u9F50 api.md\n- **\u8BA4\u8BC1\u4E0E\u6388\u6743**:\n- **\u7B2C\u4E09\u65B9\u4E0E\u4E0A\u6E38\u4E0A\u4E0B\u6587**:\n\n## 5. \u6570\u636E\u4E0E\u6301\u4E45\u5316\n- **\u5B58\u50A8**:\n- **\u4E8B\u52A1\u4E0E\u4E00\u81F4\u6027**:\n- **\u7F13\u5B58\uFF08\u82E5\u9002\u7528\uFF09**:\n\n## 6. \u6A2A\u5207\u80FD\u529B\n- **\u53EF\u89C2\u6D4B\u6027**:\n- **\u914D\u7F6E**:\n- **\u5B89\u5168**:\n\n## 7. \u6784\u5EFA\u3001\u6D4B\u8BD5\u4E0E\u90E8\u7F72\n- **\u6784\u5EFA**:\n- **\u6D4B\u8BD5**:\n- **\u90E8\u7F72/\u8FD0\u884C**:\n- **\u6A21\u5757\u8FB9\u754C**: code/{slug}/ \u5355\u6A21\u5757\uFF0CDDD \u56DB\u5C42\u4E3A\u5305/\u76EE\u5F55\u5212\u5206\n\n## 8. \u98CE\u9669\u4E0E\u5F85\u51B3\u4E8B\u9879\n\\`\\`\\`\n\n---\n\n## \u670D\u52A1\u5951\u7EA6\u751F\u6210\u6B65\u9AA4\n\n### \u6B65\u9AA41: \u5206\u6790\u4E1A\u52A1\u670D\u52A1\u5206\u914D\n1. \u4ECE\u5F53\u524D\u9650\u754C\u4E0A\u4E0B\u6587\u7684 spec.md \u4E2D\u63D0\u53D6\u4E1A\u52A1\u670D\u52A1\u5217\u8868\n2. \u786E\u5B9A\u670D\u52A1\u5951\u7EA6\u7684\u8C03\u7528\u65B9\u5F0F (HTTP/RPC/Event)\n3. \u533A\u5206\u54EA\u4E9B\u662F\u5F53\u524D BC \u5BF9\u5916\u63D0\u4F9B\u7684\u670D\u52A1\uFF0C\u54EA\u4E9B\u4F9D\u8D56\u5176\u4ED6 BC\n\n### \u6B65\u9AA42: \u5206\u6790\u4E0A\u4E0B\u6587\u6620\u5C04\u5173\u7CFB\n1. \u4ECE application.md \u4E2D\u8BC6\u522B\u5F53\u524D\u4E0A\u4E0B\u6587\u4E0E\u5176\u4ED6\u4E0A\u4E0B\u6587\u7684\u5173\u7CFB\n2. \u786E\u5B9A\u8C03\u7528\u6A21\u5F0F (Customer/Supplier, ACL, OHS \u7B49)\n3. \u8BBE\u8BA1\u8DE8\u4E0A\u4E0B\u6587\u7684\u6D88\u606F\u4EA4\u4E92\uFF08\u540C\u6B65\u8C03\u7528 + \u5F02\u6B65\u4E8B\u4EF6\uFF09\n\n### \u6B65\u9AA43: \u7ED8\u5236\u5E8F\u5217\u56FE\uFF08\u4EC5\u9650\u754C\u4E0A\u4E0B\u6587\u7EA7\u522B\uFF09\n1. \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**\n2. \u8BBE\u8BA1\u8DE8 BC \u7684\u6D88\u606F\u4EA4\u4E92\u6D41\u7A0B\n3. \u6807\u6CE8\u6D88\u606F\u7684\u901A\u4FE1\u534F\u8BAE\uFF08HTTP REST / gRPC / \u6D88\u606F\u961F\u5217\u7B49\uFF09\n4. \u6DFB\u52A0\u4E1A\u52A1\u903B\u8F91\u6CE8\u91CA\n5. \u5904\u7406\u5F02\u5E38\u6D41\u7A0B\n\n### \u6B65\u9AA44: \u5B9A\u4E49 API\n1. \u6839\u636E\u5E8F\u5217\u56FE\u4E2D\u7684\u6D88\u606F\u4EA4\u4E92\uFF0C\u63D0\u53D6\u5F53\u524D BC \u5BF9\u5916\u516C\u5F00\u7684 API\n2. \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\n3. \u8BBE\u8BA1\u8BF7\u6C42/\u54CD\u5E94\u6A21\u578B\uFF08DTO \u683C\u5F0F\uFF09\n4. \u5B9A\u4E49\u9519\u8BEF\u5904\u7406\n\n## \u5E8F\u5217\u56FE\u7ED8\u5236\u89C4\u5219\n\n### \u53C2\u4E0E\u8005\u5B9A\u4E49\n- **\u53EA\u5305\u542B\u9650\u754C\u4E0A\u4E0B\u6587\u4F5C\u4E3A\u6574\u4F53\u53C2\u4E0E\u8005**\uFF0C\u6BCF\u4E2A BC \u662F\u4E00\u4E2A participant\n- **\u5916\u90E8\u7CFB\u7EDF**\uFF08\u7B2C\u4E09\u65B9\u652F\u4ED8\u3001\u77ED\u4FE1\u7F51\u5173\u7B49\uFF09\u4F5C\u4E3A\u72EC\u7ACB\u53C2\u4E0E\u8005\n- **\u7EDD\u4E0D\u5305\u542B** BC \u5185\u90E8\u7EC4\u4EF6\uFF08\u5982 Command\u3001AppService\u3001\u805A\u5408\u3001Repository \u7B49\uFF09\n- \u5E8F\u5217\u56FE\u7684\u7C92\u5EA6\u662F\"\u9650\u754C\u4E0A\u4E0B\u6587\u5BF9\u9650\u754C\u4E0A\u4E0B\u6587\"\uFF0C\u4E0D\u662F\"\u7C7B\u5BF9\u7C7B\"\n\n### \u6D88\u606F\u4EA4\u4E92\u7C7B\u578B\n1. **HTTP RESTful \u8C03\u7528**: \u4F7F\u7528 \\`->>\\` \u8868\u793A\u540C\u6B65\u8BF7\u6C42\uFF0C\\`-->>\\` \u8868\u793A\u540C\u6B65\u54CD\u5E94\n2. **RPC \u8C03\u7528 (gRPC\u7B49)**: \u4F7F\u7528 \\`->>\\` \u8868\u793A\u540C\u6B65\u8C03\u7528\n3. **\u4E8B\u4EF6\u53D1\u5E03**: \u4F7F\u7528 \\`->>\\` \u53D1\u5F80\u6D88\u606F\u961F\u5217\uFF0C\u6807\u6CE8\u4E8B\u4EF6\u540D\u79F0\n4. **\u4E8B\u4EF6\u8BA2\u9605**: \u4F7F\u7528 \\`-->>\\` \u4ECE\u6D88\u606F\u961F\u5217\u63A5\u6536\uFF0C\u6807\u6CE8\u4E8B\u4EF6\u540D\u79F0\n\n### \u5E8F\u5217\u56FE\u6A21\u677F\n\\`\\`\\`mermaid\nsequenceDiagram\n participant \u5916\u90E8\u7CFB\u7EDF as External System\n participant \u4E0A\u6E38\u4E0A\u4E0B\u6587 as Upstream Context\n participant \u4E0B\u6E38\u4E0A\u4E0B\u6587 as Downstream Context\n\n \u5916\u90E8\u7CFB\u7EDF->>\u4E0A\u6E38\u4E0A\u4E0B\u6587: \u53D1\u8D77\u8BF7\u6C42\n \u4E0A\u6E38\u4E0A\u4E0B\u6587->>\u4E0B\u6E38\u4E0A\u4E0B\u6587: \u8C03\u7528\u670D\u52A1\n Note right of \u4E0B\u6E38\u4E0A\u4E0B\u6587: \u4E1A\u52A1\u5904\u7406\u903B\u8F91\n \u4E0B\u6E38\u4E0A\u4E0B\u6587-->>\u4E0A\u6E38\u4E0A\u4E0B\u6587: \u8FD4\u56DE\u7ED3\u679C\n \u4E0A\u6E38\u4E0A\u4E0B\u6587-->>\u5916\u90E8\u7CFB\u7EDF: \u54CD\u5E94\u7ED3\u679C\n\\`\\`\\`\n\n## API \u5B9A\u4E49\u89C4\u5219\n\n### RESTful \u8BBE\u8BA1\u539F\u5219\n- \u4F7F\u7528 HTTP \u52A8\u8BCD\u8868\u793A\u64CD\u4F5C\u7C7B\u578B\n- \u4F7F\u7528\u540D\u8BCD\u8868\u793A\u8D44\u6E90\n- \u4F7F\u7528\u590D\u6570\u5F62\u5F0F\u547D\u540D\u8D44\u6E90\n- \u4F7F\u7528\u5D4C\u5957 URL \u8868\u793A\u8D44\u6E90\u5173\u7CFB\n\n### API \u6A21\u677F\n\\`\\`\\`yaml\n- API\u540D\u79F0: \u670D\u52A1\u540D\u79F0\n- API\u5B9A\u4E49: operationName(RequestType): ResponseType\n- Swagger\u534F\u8BAE: HTTP_METHOD /api/v1/resource\n\n#### Request Format\n{ \"field1\": \"type\", \"field2\": \"type\" }\n\n#### Response Format\n{ \"status\": \"success|error\", \"data\": {}, \"message\": \"Optional message\" }\n\\`\\`\\`\n\n## api.md \u7ED3\u6784\n\n\u5199\u5165 **\\`docs/sparrow/design/{slug}/api.md\\`**\uFF1A\n\n\\`\\`\\`markdown\n# \u670D\u52A1\u5951\u7EA6 \u2014 {\u9650\u754C\u4E0A\u4E0B\u6587\u4E2D\u6587\u540D}\n\n## 1. \u9650\u754C\u4E0A\u4E0B\u6587\u6982\u8FF0\n## 2. \u670D\u52A1\u5951\u7EA6\u5217\u8868\n## 3. \u670D\u52A1\u5951\u7EA6\u8BE6\u7EC6\u5B9A\u4E49\n\n### 3.1 {\u670D\u52A1\u540D\u79F0}\n#### \u5E8F\u5217\u56FE\n[Mermaid \u5E8F\u5217\u56FE \u2014 \u4EC5\u9650\u754C\u4E0A\u4E0B\u6587\u7EA7\u522B]\n\n#### API \u5B9A\u4E49\n- **API\u540D\u79F0**:\n- **API\u5B9A\u4E49**: operationName(RequestType): ResponseType\n- **\u901A\u4FE1\u534F\u8BAE**: HTTP_METHOD /api/v1/resource\uFF08\u6216 gRPC \u65B9\u6CD5\u7B7E\u540D / \u4E8B\u4EF6\u5B9A\u4E49\uFF09\n\n#### Request Format\n{ \"field1\": \"type\", \"field2\": \"type\" }\n\n#### Response Format\n{ \"status\": \"success|error\", \"data\": {}, \"message\": \"Optional message\" }\n\n---\n\n## 4. \u7EC4\u4EF6\u56FE\uFF08PlantUML\uFF09\n\n\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\n\n### \u7EC4\u4EF6\u56FE\u7ED8\u5236\u89C4\u5219\n\n**\u7EC4\u4EF6\u8868\u793A**\uFF1A\n- \u5F53\u524D\u9650\u754C\u4E0A\u4E0B\u6587\u7528 \\`[\u5F53\u524D\u4E0A\u4E0B\u6587\u540D\u79F0]\\` \u8868\u793A\n- \u534F\u4F5C\u7684\u5176\u4ED6\u9650\u754C\u4E0A\u4E0B\u6587\u7528 \\`[\u534F\u4F5C\u4E0A\u4E0B\u6587\u540D\u79F0]\\` \u8868\u793A\n- \u5916\u90E8\u7CFB\u7EDF\u7528 \\`[\u5916\u90E8\u7CFB\u7EDF\u540D\u79F0]\\` \u8868\u793A\n\n**\u63A5\u53E3\u8868\u793A**\uFF1A\n- **provided interface**\uFF08\u5F53\u524D BC \u5BF9\u5916\u516C\u5F00\u7684 API\uFF09\uFF1A\u4F7F\u7528 \\`()\\` \u5706\u5708\u63A5\u53E3\u7B26\u53F7\n- **required interface**\uFF08\u5F53\u524D BC \u8C03\u7528\u5176\u4ED6 BC \u7684 API\uFF09\uFF1A\u4F7F\u7528 \\`()\\` \u534A\u5706\u63A5\u53E3\u7B26\u53F7\n\n**\u4E8B\u4EF6\u8868\u793A**\uFF1A\n- \u4E8B\u4EF6\u53D1\u5E03\uFF1A\u4F7F\u7528 \\`-->>\\` \u7BAD\u5934\uFF0C\u6807\u6CE8\u4E8B\u4EF6\u540D\u79F0\n- \u4E8B\u4EF6\u8BA2\u9605\uFF1A\u4F7F\u7528 \\`<<--\\` \u7BAD\u5934\uFF0C\u6807\u6CE8\u4E8B\u4EF6\u540D\u79F0\n\n### \u7EC4\u4EF6\u56FE\u6A21\u677F\n\n\\`\\`\\`plantuml\n@startuml\n!theme plain\n\n' \u5F53\u524D\u9650\u754C\u4E0A\u4E0B\u6587\ncomponent \"{\u5F53\u524DBC\u4E2D\u6587\u540D}\" as CurrentBC\n\n' \u534F\u4F5C\u7684\u9650\u754C\u4E0A\u4E0B\u6587\ncomponent \"{\u534F\u4F5CBC1\u4E2D\u6587\u540D}\" as BC1\ncomponent \"{\u534F\u4F5CBC2\u4E2D\u6587\u540D}\" as BC2\n\n' \u5916\u90E8\u7CFB\u7EDF\ncomponent \"{\u5916\u90E8\u7CFB\u7EDF\u540D}\" as ExtSys\n\n' \u5F53\u524D BC \u5BF9\u5916\u63D0\u4F9B\u7684 API (provided interface)\n() \"POST /api/v1/orders\" as API_PlaceOrder\n() \"GET /api/v1/orders/{id}\" as API_GetOrder\n\n' \u5F53\u524D BC \u4F9D\u8D56\u7684 API (required interface)\n() \"GET /api/v1/users/{id}\" as API_GetUser\n() \"POST /api/v1/payments\" as API_CreatePayment\n() \"OrderPlaced\" as EVT_OrderPlaced\n\n' provided interfaces \u8FDE\u63A5\u5230\u5F53\u524D BC\nCurrentBC -- API_PlaceOrder\nCurrentBC -- API_GetOrder\n\n' required interfaces \u8FDE\u63A5\u5230\u534F\u4F5C BC\nAPI_GetUser -- BC1\nAPI_CreatePayment -- BC2\n\n' \u4E8B\u4EF6\u53D1\u5E03/\u8BA2\u9605\nCurrentBC -->> EVT_OrderPlaced : publishes\nExtSys <<-- EVT_OrderPlaced : subscribes\n\n@enduml\n\\`\\`\\`\n\n> **\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\n\\`\\`\\`\n\n---\n\n## \u9879\u76EE\u7EA7 API \u76EE\u5F55\u66F4\u65B0\n\n\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\n\n### api.md \u76EE\u5F55\u7ED3\u6784\uFF08\u9879\u76EE\u7EA7\uFF09\n\n\\`\\`\\`markdown\n# API \u76EE\u5F55 \u2014 {\u9879\u76EE\u540D\u79F0}\n\n> \u672C\u6587\u4EF6\u7531 Sparrow \u81EA\u52A8\u7EF4\u62A4\uFF0C\u6C47\u603B\u6240\u6709\u9650\u754C\u4E0A\u4E0B\u6587\u7684\u516C\u5F00 API\u3002\n> \u6BCF\u5B8C\u6210\u4E00\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587\u7684 sparrow-design \u64CD\u4F5C\u540E\u66F4\u65B0\u3002\n\n## {\u9650\u754C\u4E0A\u4E0B\u65871\u4E2D\u6587\u540D} (\\`{slug1}\\`)\n\n### \u5BF9\u5916\u63D0\u4F9B\u7684 API (Provided)\n\n| API \u540D\u79F0 | \u901A\u4FE1\u534F\u8BAE | \u5B9A\u4E49 | \u8BF4\u660E |\n|---------|---------|------|------|\n| \u63D0\u4EA4\u8BA2\u5355 | HTTP POST | /api/v1/orders | \u521B\u5EFA\u65B0\u8BA2\u5355 |\n| \u67E5\u8BE2\u8BA2\u5355 | HTTP GET | /api/v1/orders/{id} | \u6309ID\u67E5\u8BE2\u8BA2\u5355 |\n\n### \u5BF9\u5916\u53D1\u5E03\u7684\u4E8B\u4EF6\n\n| \u4E8B\u4EF6\u540D\u79F0 | \u4E8B\u4EF6\u7C7B\u578B | \u8BF4\u660E |\n|---------|---------|------|\n| OrderPlaced | \u9886\u57DF\u4E8B\u4EF6 | \u8BA2\u5355\u5DF2\u63D0\u4EA4 |\n\n### \u4F9D\u8D56\u7684 API (Required)\n\n| API \u540D\u79F0 | \u63D0\u4F9B\u65B9\u4E0A\u4E0B\u6587 | \u901A\u4FE1\u534F\u8BAE | \u8BF4\u660E |\n|---------|------------|---------|------|\n| \u67E5\u8BE2\u7528\u6237 | user-identity | HTTP GET | \u83B7\u53D6\u7528\u6237\u4FE1\u606F |\n\n---\n\n## {\u9650\u754C\u4E0A\u4E0B\u65872\u4E2D\u6587\u540D} (\\`{slug2}\\`)\n\n...\n\\`\\`\\`\n\n### \u66F4\u65B0\u64CD\u4F5C\n\n1. \u5982\u679C \\`docs/sparrow/api.md\\` \u4E0D\u5B58\u5728\uFF0C\u6839\u636E\u4E0A\u8FF0\u6A21\u677F\u521B\u5EFA\n2. \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\n3. \u66F4\u65B0\"\u5BF9\u5916\u63D0\u4F9B\u7684 API\"\u8868\u683C\uFF08\u4E0E api.md \u4E2D\u7684 API \u5B9A\u4E49\u4FDD\u6301\u4E00\u81F4\uFF09\n4. \u66F4\u65B0\"\u5BF9\u5916\u53D1\u5E03\u7684\u4E8B\u4EF6\"\u8868\u683C\n5. \u66F4\u65B0\"\u4F9D\u8D56\u7684 API\"\u8868\u683C\uFF08\u5217\u51FA\u5F53\u524D BC \u8C03\u7528\u7684\u5176\u4ED6 BC \u7684 API\uFF09\n6. \u66F4\u65B0\u6587\u4EF6\u5934\u90E8\u7684\"\u6700\u540E\u66F4\u65B0\"\u65F6\u95F4\u6233\n\n## \u8D28\u91CF\u68C0\u67E5\u6E05\u5355\n\n- [ ] \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\n- [ ] **\u6BCF\u4E2A\u5E8F\u5217\u56FE\u4E2D actor \u5411\u5F53\u524D BC \u53EA\u53D1\u8D77\u4E86\u4E00\u6B21\u8BF7\u6C42**\n- [ ] **API \u6570\u91CF = \u5206\u914D\u7ED9\u5F53\u524D BC \u7684\u4E1A\u52A1\u670D\u52A1\u6570\u91CF**\uFF08\u6765\u81EA spec.md\uFF09\n- [ ] \u5E8F\u5217\u56FE\u4E2D\u6BCF\u4E2A\u8DE8 BC \u6D88\u606F\u90FD\u660E\u786E\u4E86\u901A\u4FE1\u534F\u8BAE\uFF08HTTP/RPC/Event\uFF09\n- [ ] API \u5B9A\u4E49\u5B8C\u6574\uFF0C\u5305\u542B\u8BF7\u6C42/\u54CD\u5E94\u6A21\u578B\u548C\u9519\u8BEF\u5904\u7406\n- [ ] \u4E8B\u4EF6\u9A71\u52A8\u7684\u670D\u52A1\u5951\u7EA6\u6709\u660E\u786E\u7684\u4E8B\u4EF6\u5B9A\u4E49\n- [ ] **\u7EC4\u4EF6\u56FE\u5DF2\u7ED8\u5236**\uFF1Aprovided interface \u4E0E API \u5B9A\u4E49\u4E00\u4E00\u5BF9\u5E94\n- [ ] **\u7EC4\u4EF6\u56FE\u5DF2\u7ED8\u5236**\uFF1Arequired interface \u4F53\u73B0\u4E86\u6240\u6709\u8DE8 BC \u8C03\u7528\n- [ ] \u4E8B\u4EF6\u53D1\u5E03/\u8BA2\u9605\u5728\u7EC4\u4EF6\u56FE\u4E2D\u6B63\u786E\u8868\u793A\n- [ ] tech.md \u5305\u542B\u6240\u6709 8 \u4E2A\u5FC5\u8981\u7AE0\u8282\n- [ ] **\u9879\u76EE\u7EA7 \\`docs/sparrow/api.md\\` \u5DF2\u66F4\u65B0**\uFF0C\u5F53\u524D BC \u7684 API \u5DF2\u5F55\u5165\n- [ ] \u8DE8\u4E0A\u4E0B\u6587\u8C03\u7528\u5173\u7CFB\u548C\u901A\u4FE1\u534F\u8BAE\u6E05\u6670\n\n## \u5B8C\u6210\u540E\u7684\u4E0B\u4E00\u6B65\n\n\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\n`;\n\nexport function register(): void {\n registerSkillTemplate('sparrow-design', () => DESIGN_BODY);\n}\n", "/**\n * Sparrow Model skill template.\n *\n * This skill generates the domain model (static + dynamic) for a bounded context.\n */\n\nimport { registerSkillTemplate } from '../core/skill-generation.js';\n\nconst MODEL_BODY = `# Sparrow Model \u2014 \u9886\u57DF\u5EFA\u6A21\n\n## \u6267\u884C\u987A\u5E8F\u68C0\u67E5\n\n\\`\\`\\`\n\u5F53\u524D\u6B65\u9AA4\uFF1Asparrow-model\uFF08\u7B2C 4 \u6B65 / \u5171 6 \u6B65\uFF09\n\u6240\u5C5E\u5C42\u7EA7\uFF1A\u56E2\u961F\u7EA7\uFF08team-level\uFF09\uFF0C\u9488\u5BF9\u7279\u5B9A\u9650\u754C\u4E0A\u4E0B\u6587\n\u524D\u7F6E\u6761\u4EF6\uFF1A\n 1. docs/sparrow/design/{slug}/spec.md \u5FC5\u987B\u5B58\u5728\n 2. docs/sparrow/design/{slug}/api.md \u5FC5\u987B\u5B58\u5728\n 3. docs/sparrow/design/{slug}/tech.md \u5FC5\u987B\u5B58\u5728\n\u4E0B\u4E00\u6B65\u9AA4\uFF1Asparrow-plan @{slug}\uFF08\u56E2\u961F\u7EA7\uFF09\n\\`\\`\\`\n\n**\u524D\u7F6E\u6761\u4EF6\u68C0\u67E5**\uFF1A\n- \u5982\u679C api.md \u6216 tech.md \u4E0D\u5B58\u5728\uFF0C\u8BF7\u63D0\u793A\u7528\u6237\u5148\u6267\u884C **sparrow-design @{slug}**\n- \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\n- \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\n\n---\n\n## \uD83D\uDED1 \u8F93\u51FA\u6587\u4EF6\u5B58\u5728\u6027\u68C0\u67E5\uFF08\u5FC5\u987B\u5728\u751F\u6210\u524D\u6267\u884C\uFF09\n\n\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\n\n- \\`docs/sparrow/design/{slug}/model.md\\`\n\n\u5982\u679C\u6587\u4EF6\u5DF2\u5B58\u5728\uFF0C\u8BF7**\u8BA9\u7528\u6237\u8FDB\u884C\u9009\u62E9**\uFF1A\n\n- **\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\n- **\u8986\u76D6 (overwrite)**\uFF1A\u5220\u9664\u5DF2\u6709\u6587\u4EF6\uFF0C\u91CD\u65B0\u751F\u6210\u5168\u65B0\u7684\u5185\u5BB9\n- **\u66F4\u65B0 (update)**\uFF1A\u5728\u5DF2\u6709\u6587\u4EF6\u57FA\u7840\u4E0A\u8FDB\u884C\u4FEE\u6539\u548C\u5B8C\u5584\n\n> \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\n\n---\n\n## \uD83D\uDCCB project.md \u66F4\u65B0\n\n\u5B8C\u6210\u8F93\u51FA\u540E\uFF0C**\u5FC5\u987B**\u66F4\u65B0 \\`docs/sparrow/project.md\\`\uFF1A\n\n1. \u5982\u679C \\`project.md\\` \u4E0D\u5B58\u5728\uFF0C\u6839\u636E\u5F53\u524D\u9879\u76EE\u4FE1\u606F\u521B\u5EFA\u5B83\n2. \u5728\"\u9650\u754C\u4E0A\u4E0B\u6587\u8BBE\u8BA1\"\u90E8\u5206\uFF0C\u627E\u5230\u5F53\u524D \\`{slug}\\` \u7684\u5B50\u7AE0\u8282\n3. \u66F4\u65B0 \\`model.md\\` \u7684\u72B6\u6001\u4ECE \\`_\u5F85\u751F\u6210_\\` \u6539\u4E3A \\`_v{version}_\\`\n4. \u66F4\u65B0\u6587\u4EF6\u5934\u90E8\u7684\"\u6700\u540E\u66F4\u65B0\"\u65F6\u95F4\u6233\n\n**project.md \u8DEF\u5F84**: \\`docs/sparrow/project.md\\`\n\n---\n\n## \uD83D\uDCCC \u7248\u672C\u5143\u6570\u636E\u7BA1\u7406\n\n\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\n\n\\`\\`\\`markdown\n<!--\n version: v1.0\n last-updated: {ISO_8601_TIMESTAMP}\n generated-by: sparrow-model\n sparrow-version: {\u4ECE .sparrow/sparrow.json \u8BFB\u53D6}\n-->\n\\`\\`\\`\n\n**\u7248\u672C\u89C4\u5219**:\n- **\u65B0\u6587\u6863**: \u4F7F\u7528 \\`v1.0\\`\n- **\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\n- **\u91CD\u5927\u91CD\u5199**: \u9012\u589E\u4E3B\u7248\u672C\u53F7\uFF08\\`v1.x\\` \u2192 \\`v2.0\\`\uFF09\n- \u6BCF\u6B21\u4FEE\u6539\u90FD**\u5FC5\u987B\u53D8\u66F4**\u7248\u672C\u53F7\n\n**\u64CD\u4F5C\u6B65\u9AA4**:\n1. \u68C0\u67E5\u76EE\u6807\u6587\u4EF6\u662F\u5426\u5DF2\u5B58\u5728\n2. \u5982\u679C\u5B58\u5728\uFF0C\u8BFB\u53D6\u6587\u4EF6\u5F00\u5934 \\`<!--\\` \u6CE8\u91CA\u5757\u4E2D\u7684 \\`version:\\` \u5B57\u6BB5\u5E76\u9012\u589E\n3. \u5728\u6587\u4EF6\u5F00\u5934\u6DFB\u52A0\u6216\u66F4\u65B0\u7248\u672C\u5143\u6570\u636E\u5757\n4. \u7EE7\u7EED\u751F\u6210\u6587\u6863\u6B63\u6587\n\n---\n\n## \u89D2\u8272\u5B9A\u4E49\n\n\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\n\n## \u5EFA\u6A21\u76EE\u6807\n\n1. **\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\n2. **\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\n\n\u8F93\u51FA\u6587\u4EF6\uFF1A**\\`docs/sparrow/design/{slug}/model.md\\`**\n\n## \u6838\u5FC3\u539F\u5219\uFF1AAPI \u9A71\u52A8\u7684\u52A8\u6001\u5EFA\u6A21\n\n**\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**\n\n- \u4ECE \\`docs/sparrow/design/{slug}/api.md\\` \u4E2D\u63D0\u53D6\u5F53\u524D BC \u7684\u6BCF\u4E2A**\u5BF9\u5916\u516C\u5F00\u7684 API**\n- \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\n- \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\n- **\u8FDC\u7A0B\u670D\u52A1\uFF08Command/Query\uFF09\u7684\u63A5\u53E3\u5FC5\u987B\u4E0E api.md \u4E2D\u7684 API \u5B9A\u4E49\u4FDD\u6301\u4E00\u81F4**\n- **\u5E94\u7528\u670D\u52A1\u7684\u65B9\u6CD5\u7B7E\u540D\u5FC5\u987B\u4E0E\u8FDC\u7A0B\u670D\u52A1\u7684\u63A5\u53E3\u4FDD\u6301\u4E00\u81F4**\n- \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\n\n> 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\n\n---\n\n## \u9636\u6BB5\u4E00\uFF1A\u9759\u6001\u5EFA\u6A21\u9636\u6BB5\n\n### \u6B65\u9AA4\u4E00\uFF1A\u7EDF\u4E00\u8BED\u8A00\u63D0\u70BC\n\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\n\n### \u6B65\u9AA4\u4E8C\uFF1A\u5B9E\u4F53\u4E0E\u503C\u5BF9\u8C61\u8BC6\u522B\n- **\u5B9E\u4F53 (Entity)**\uFF1A\u5177\u6709\u552F\u4E00\u6807\u8BC6\u7684\u5BF9\u8C61\uFF0C\u7C7B\u56FE\u7528**\u9EC4\u8272** (#FFFFCC) \u8868\u793A\n- **\u503C\u5BF9\u8C61 (Value Object)**\uFF1A\u4E0D\u53EF\u53D8\u7684\u5BF9\u8C61\uFF0C\u7C7B\u56FE\u7528**\u84DD\u8272** (#E6F3FF) \u8868\u793A\n\n### \u6B65\u9AA4\u4E09\uFF1A\u5173\u7CFB\u5EFA\u6A21\n- **Composite \u5173\u7CFB**\uFF1A\u6574\u4F53-\u90E8\u5206\uFF0C\u751F\u547D\u5468\u671F\u5B8C\u5168\u4E00\u81F4\uFF0C\u4F7F\u7528 \\`*-->\\` \u7B26\u53F7\n- **Aggregation \u5173\u7CFB**\uFF1A\u6574\u4F53-\u90E8\u5206\uFF0C\u751F\u547D\u5468\u671F\u53EF\u72EC\u7ACB\uFF0C\u4F7F\u7528 \\`o-->\\` \u7B26\u53F7\n- **\u5173\u8054\u5173\u7CFB**\uFF1A\u666E\u901A\u5173\u8054\n- **\u503C\u5BF9\u8C61\u5173\u8054**\uFF1A\u4F7F\u7528 \\`||--||\\` (\u4E00\u5BF9\u4E00) \u6216 \\`||--o{\\` (\u4E00\u5BF9\u591A)\n\n### \u6B65\u9AA4\u56DB\uFF1A\u805A\u5408\u8BC6\u522B\n- \u4E24\u4E2A\u5177\u6709 Composite \u5173\u7CFB\u7684\u5B9E\u4F53\u5E94\u8BE5\u4F4D\u4E8E\u540C\u4E00\u805A\u5408\u4E2D\n- \u5177\u6709 Aggregation \u5173\u7CFB\u6216\u666E\u901A\u5173\u8054\u5173\u7CFB\u7684\u5B9E\u4F53\uFF0C\u4F4D\u4E8E\u4E0D\u540C\u7684\u805A\u5408\n- \u805A\u5408\u6839\u5B9E\u4F53\u7528**\u6D45\u7EA2\u8272** (#FFE6E6) \u8868\u793A\uFF0C\u6807\u6CE8 \\`<<AggregateRoot>>\\`\n- \u805A\u5408\u8FB9\u754C\u5185\u7684\u5BF9\u8C61\u5177\u6709\u5F3A\u4E00\u81F4\u6027\n- \u805A\u5408\u8FB9\u754C\u5916\u7684\u5BF9\u8C61\u901A\u8FC7\u805A\u5408\u6839\u8FDB\u884C\u8BBF\u95EE\n\n### \u6B65\u9AA4\u4E94\uFF1A\u7C7B\u56FE\u7ED8\u5236\uFF08PlantUML\uFF09\n\n\u4F7F\u7528 PlantUML \u8BED\u6CD5\u7ED8\u5236 UML \u7C7B\u56FE\uFF1A\n\n\\`\\`\\`plantuml\n@startuml\n!theme plain\n\n' \u805A\u5408\u6839 - \u6D45\u7EA2\u8272\u80CC\u666F\nclass Meeting <<AggregateRoot>> #FFE6E6 {\n +MeetingId id\n +String title\n +MeetingStatus status\n --\n +createMeeting()\n +addParticipant()\n +startMeeting()\n}\n\n' \u5B9E\u4F53 - \u9EC4\u8272\u80CC\u666F\nclass Participant #FFFFCC {\n +ParticipantId id\n +String email\n +ParticipantRole role\n --\n +joinMeeting()\n}\n\n' \u503C\u5BF9\u8C61 - \u84DD\u8272\u80CC\u666F\nclass MeetingTime #E6F3FF {\n +LocalDateTime startTime\n +LocalDateTime endTime\n +TimeZone timeZone\n}\n\n' \u5173\u7CFB\u5B9A\u4E49\nMeeting o--> Participant : aggregates\nMeeting ||--|| MeetingTime : has\n\n@enduml\n\\`\\`\\`\n\n**PlantUML \u8BED\u6CD5\u89C4\u8303**\uFF1A\n- \u4F7F\u7528 \\`@startuml\\` \u548C \\`@enduml\\` \u6807\u8BB0\n- \u5173\u7CFB\u7B26\u53F7\uFF1A\\`||--o{\\` (\u4E00\u5BF9\u591A), \\`||--||\\` (\u4E00\u5BF9\u4E00)\n- Composite: \\`*-->\\` \uFF0C\u7531\u6574\u4F53\u6307\u5411\u90E8\u5206\n- Aggregate: \\`o-->\\` \uFF0C\u7531\u6574\u4F53\u6307\u5411\u90E8\u5206\n- \u503C\u5BF9\u8C61\u5173\u8054\uFF1A\\`||--||\\` \u8868\u793A has \u5173\u7CFB\n\n---\n\n## \u9636\u6BB5\u4E8C\uFF1A\u52A8\u6001\u5EFA\u6A21\u9636\u6BB5\n\n### \u6B65\u9AA4\u3007\uFF1AAPI \u5165\u53E3\u63D0\u53D6\uFF08\u5FC5\u987B\u5728\u4EFB\u52A1\u5206\u89E3\u4E4B\u524D\u6267\u884C\uFF09\n\n1. \u8BFB\u53D6 \\`docs/sparrow/design/{slug}/api.md\\`\uFF0C\u63D0\u53D6\u5F53\u524D BC \u7684**\u6240\u6709\u5BF9\u5916\u516C\u5F00\u7684 API**\n2. \u5BF9\u6BCF\u4E2A API\uFF0C\u786E\u8BA4\u5176\u901A\u4FE1\u534F\u8BAE\uFF08HTTP/RPC/Event\uFF09\u548C\u64CD\u4F5C\u7B7E\u540D\n3. \u8FD9\u4E9B API \u5C06\u4F5C\u4E3A\u52A8\u6001\u9886\u57DF\u6A21\u578B**\u4EFB\u52A1\u6811\u7684\u7B2C\u4E00\u7EA7\u5165\u53E3**\n\n**API \u5230\u4EFB\u52A1\u6811\u5165\u53E3\u7684\u6620\u5C04\u89C4\u5219**\uFF1A\n\n| API \u7C7B\u578B | \u4EFB\u52A1\u6811\u5165\u53E3 | \u5BF9\u5E94\u89D2\u8272 |\n|---------|-----------|---------|\n| HTTP POST /api/v1/xxx | \u547D\u4EE4\u4EFB\u52A1\uFF08\u6839\u4EFB\u52A1\uFF09 | Command |\n| HTTP GET /api/v1/xxx | \u67E5\u8BE2\u4EFB\u52A1\uFF08\u6839\u4EFB\u52A1\uFF09 | Query |\n| HTTP PUT/PATCH /api/v1/xxx | \u547D\u4EE4\u4EFB\u52A1\uFF08\u6839\u4EFB\u52A1\uFF09 | Command |\n| HTTP DELETE /api/v1/xxx | \u547D\u4EE4\u4EFB\u52A1\uFF08\u6839\u4EFB\u52A1\uFF09 | Command |\n| gRPC Method(param): result | \u547D\u4EE4/\u67E5\u8BE2\u4EFB\u52A1 | Command/Query |\n| \u9886\u57DF\u4E8B\u4EF6\u8BA2\u9605 | \u4E8B\u4EF6\u5904\u7406\u4EFB\u52A1 | Command |\n\n### \u6B65\u9AA4\u4E00\uFF1A\u4EFB\u52A1\u5206\u89E3\n\u4EE5\u6BCF\u4E2A API \u5165\u53E3\u4E3A\u6839\u8282\u70B9\uFF0C\u5C06\u4EFB\u52A1\u9010\u5C42\u5206\u89E3\u4E3A\u4EFB\u52A1\u6811\uFF1A\n\n**\u4EFB\u52A1\u6811\u7ED3\u6784**\uFF1A\n- **\u6839**\uFF1AAPI \u5165\u53E3\uFF08\u8FDC\u7A0B\u670D\u52A1 Command/Query\uFF09\n- **\u679D**\uFF1A\u5E94\u7528\u670D\u52A1\u7F16\u6392\uFF08AppService\uFF09\n- **\u679D**\uFF1A\u9886\u57DF\u670D\u52A1\u903B\u8F91\uFF08DomainService\uFF09\n- **\u53F6**\uFF1A\u805A\u5408\u64CD\u4F5C / \u7AEF\u53E3\u8C03\u7528\uFF08Repository/Client\uFF09\u2192 \u539F\u5B50\u4EFB\u52A1\n\n**\u539F\u5B50\u4EFB\u52A1\u5224\u65AD\u6761\u4EF6**\uFF1A\n1. \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\n2. \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\n3. \u7528\u6237\u754C\u9762\u4EA4\u4E92 \u2192 \u5FFD\u7565\n\n### \u6B65\u9AA4\u4E8C\uFF1A\u89D2\u8272\u6784\u9020\u578B\u5206\u914D\n\n**\u63A5\u53E3\u5BF9\u9F50\u7EA6\u675F\uFF08\u5173\u952E\uFF09**\uFF1A\n- **\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**\n - \u65B9\u6CD5\u540D = api.md \u4E2D\u7684 operationName\n - \u53C2\u6570\u7C7B\u578B = api.md \u4E2D\u7684 RequestType\n - \u8FD4\u56DE\u7C7B\u578B = api.md \u4E2D\u7684 ResponseType\n- **\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**\n - AppService \u7684\u65B9\u6CD5\u540D\u4E0E Command/Query \u7684\u65B9\u6CD5\u540D\u4E00\u81F4\n - \u53C2\u6570\u548C\u8FD4\u56DE\u7C7B\u578B\u4FDD\u6301\u4E00\u81F4\n\n**\u89D2\u8272\u6784\u9020\u578B\u5B9A\u4E49**\uFF1A\n\n| \u89D2\u8272 | \u5C42 | \u5305\u4F4D\u7F6E | \u547D\u540D\u89C4\u8303 | \u989C\u8272 |\n|------|---|--------|---------|------|\n| \u547D\u4EE4 (Command) | api | api/command/ | *Command | \u767D\u8272 |\n| \u67E5\u8BE2 (Query) | api | api/query/ | *Query | \u767D\u8272 |\n| \u6D88\u606F (DTO) | api | api/dto/ | *Request/*Response/*Event | \u6A59\u8272 |\n| \u5E94\u7528\u670D\u52A1 | application | application/ | *AppService | \u767D\u8272 |\n| \u9886\u57DF\u670D\u52A1 | domain | domain/service/ | *Service | \u7EFF\u8272 |\n| \u805A\u5408\u6839 | domain | domain/aggregate/ | \u9886\u57DF\u6A21\u578B\u5B9A\u4E49\u540D | \u6D45\u7EA2\u8272 |\n| \u7AEF\u53E3 (\u63A5\u53E3) | infrastructure | infrastructure/port/ | *Repository/*Client | \u767D\u8272 |\n\n**\u89D2\u8272\u6784\u9020\u578B\u534F\u4F5C\u7EA6\u675F**\uFF1A\n\n1. **\u8FDC\u7A0B\u670D\u52A1\uFF08\u547D\u4EE4/\u67E5\u8BE2\uFF09\u53EA\u80FD\u8BBF\u95EE\u5E94\u7528\u670D\u52A1\u548C\u6D88\u606F**\n2. **\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\n3. **\u9886\u57DF\u670D\u52A1\u53EF\u4EE5\u8BBF\u95EE\u9886\u57DF\u670D\u52A1\u3001\u805A\u5408\u548C\u7AEF\u53E3**\n4. **\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\n5. **\u7AEF\u53E3\u53EF\u4EE5\u8BBF\u95EE\u805A\u5408**\n6. **\u6D88\u606F\u53EA\u80FD\u88AB\u8FDC\u7A0B\u670D\u52A1\u548C\u5E94\u7528\u670D\u52A1\u8BBF\u95EE**\n\n### \u6B65\u9AA4\u4E09\uFF1A\u5E8F\u5217\u56FE\u7ED8\u5236\uFF08PlantUML\uFF09\n\n\\`\\`\\`plantuml\n@startuml\n!theme plain\n\nparticipant \"CommandName\" as CMD #FFFFFF\nparticipant \"AppServiceName\" as APP #FFFFFF\nparticipant \"DomainService\" as DS #CEF5CF\nparticipant \"AggregateRoot\" as AR #FFE6E6\nparticipant \"Repository\" as REPO #FFFFFF\nparticipant \"Client\" as CL #FFFFFF\n\nbox \"\u5317\u5411\u7F51\u5173\u5C42\uFF08api + application\uFF09\" #CCCCCC\nparticipant CMD\nparticipant APP\nend box\n\nbox \"\u9886\u57DF\u5C42\" #4CAF50\nparticipant DS\nparticipant AR\nend box\n\nbox \"\u5357\u5411\u7F51\u5173\u5C42\uFF08infrastructure\uFF09\" #CCCCCC\nparticipant REPO\nparticipant CL\nend box\n\nCMD -> APP: operation(Request)\nactivate APP\n\nAPP -> DS: domainMethod(params)\nactivate DS\n\nDS -> AR: aggregateMethod(data)\nactivate AR\nAR --> DS: result\ndeactivate AR\n\nDS -> REPO: save(aggregate)\nactivate REPO\nREPO --> DS: saved\ndeactivate REPO\n\nAPP --> CMD: Response\ndeactivate APP\n\n@enduml\n\\`\\`\\`\n\n---\n\n## \u8F93\u51FA\u6587\u6863\u683C\u5F0F\n\n\u5199\u5165 **\\`docs/sparrow/design/{slug}/model.md\\`**\uFF1A\n\n\\`\\`\\`markdown\n# {\u9650\u754C\u4E0A\u4E0B\u6587\u4E2D\u6587\u540D} - \u9886\u57DF\u6A21\u578B\u5B9A\u4E49\n\n## 1. \u9759\u6001\u9886\u57DF\u6A21\u578B\n\n### 1.1 \u805A\u5408\u5B9A\u4E49\n#### \u805A\u54081\uFF1A{\u805A\u5408\u540D\u79F0}\n- **\u805A\u5408\u6839**\uFF1A{AggregateRootName}\n- **\u5B9E\u4F53**\uFF1A{Entity1}, {Entity2}\n- **\u503C\u5BF9\u8C61**\uFF1A{VO1}, {VO2}\n\n### 1.2 \u9886\u57DF\u6A21\u578B\u7C7B\u56FE\n[PlantUML \u7C7B\u56FE \u2014 UML \u547D\u540D\u98CE\u683C]\n\n## 2. \u52A8\u6001\u9886\u57DF\u6A21\u578B\n\n> \u4EE5\u4E0B\u6BCF\u4E2A API \u5165\u53E3\u6765\u81EA docs/sparrow/design/{slug}/api.md\n\n### 2.1 API\uFF1A{API\u540D\u79F0}\uFF08\u6765\u81EA api.md\uFF09\n\n**API \u5B9A\u4E49**\uFF1A\\`POST /api/v1/resource\\`\n\n#### \u4EFB\u52A1\u6811\n\\`\\`\\`\n{CommandName}.{method}(Request): Response \u2190 API \u5165\u53E3\uFF08\u4E0E api.md \u4E00\u81F4\uFF09\n\u251C\u2500\u2500 {AppService}.{method}(Request): Response \u2190 \u5E94\u7528\u670D\u52A1\uFF08\u7B7E\u540D\u4E0E Command \u4E00\u81F4\uFF09\n\u2502 \u251C\u2500\u2500 {DomainService}.{method}(params): result \u2190 \u9886\u57DF\u670D\u52A1\n\u2502 \u2502 \u251C\u2500\u2500 {Aggregate}.{method}(data): result \u2190 \u805A\u5408\u64CD\u4F5C\uFF08\u539F\u5B50\u4EFB\u52A1\uFF09\n\u2502 \u2502 \u2514\u2500\u2500 {Repository}.{save}(aggregate) \u2190 \u7AEF\u53E3\u8C03\u7528\uFF08\u539F\u5B50\u4EFB\u52A1\uFF09\n\u2502 \u2514\u2500\u2500 {Client}.{call}(params): result \u2190 \u5916\u90E8\u8C03\u7528\uFF08\u539F\u5B50\u4EFB\u52A1\uFF09\n\\`\\`\\`\n\n#### \u89D2\u8272\u5206\u914D\n\\`\\`\\`\n{\u6839\u4EFB\u52A1} \u2192 {Command}.{method}(Request): Response\n\u251C\u2500\u2500 {\u7EC4\u5408\u4EFB\u52A1} \u2192 {AppService}.{method}(Request): Response\n\u2502 \u251C\u2500\u2500 {\u539F\u5B50\u4EFB\u52A11} \u2192 {DomainService}.{method}(params): result\n\u2502 \u2502 \u251C\u2500\u2500 {Aggregate}.{method}(data): result\n\u2502 \u2502 \u2514\u2500\u2500 {Repository}.{save}(aggregate)\n\u2502 \u2514\u2500\u2500 {\u539F\u5B50\u4EFB\u52A12} \u2192 {Client}.{call}(params): result\n...\n\\`\\`\\`\n\n#### \u5E8F\u5217\u56FE\n[PlantUML \u5E8F\u5217\u56FE \u2014 \u5C55\u793A BC \u5185\u90E8\u5404\u89D2\u8272\u7684\u534F\u4F5C]\n\n### 2.2 API\uFF1A{\u4E0B\u4E00\u4E2AAPI\u540D\u79F0}\n...\n\n## 3. \u89D2\u8272\u804C\u8D23\u5B9A\u4E49\n[\u5404\u89D2\u8272\u53CA\u5176\u804C\u8D23\u7684\u603B\u7ED3]\n\\`\\`\\`\n\n**\u547D\u540D\u7EA6\u5B9A\uFF08UML \u98CE\u683C\uFF09**\uFF1A\n- \u7C7B\u540D\uFF1APascalCase\uFF08\u5982 \\`OrderCommand\\`\u3001\\`OrderAppService\\`\uFF09\n- \u65B9\u6CD5\u540D\uFF1AcamelCase\uFF08\u5982 \\`placeOrder()\\`\u3001\\`getOrderById()\\`\uFF09\n- \u5C5E\u6027\u540D\uFF1AcamelCase\uFF08\u5982 \\`orderId\\`\u3001\\`customerName\\`\uFF09\n- \u547D\u540D\u7A7A\u95F4/\u5305\uFF1Adot.case\uFF08\u5982 \\`com.sparrow.order\\`\uFF09\n\n> \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\n\n## \u8D28\u91CF\u68C0\u67E5\u6E05\u5355\n\n### \u9759\u6001\u6A21\u578B\n- [ ] \u6240\u6709\u6838\u5FC3\u6982\u5FF5\u90FD\u5DF2\u8BC6\u522B\u4E3A\u5B9E\u4F53\u6216\u503C\u5BF9\u8C61\n- [ ] \u805A\u5408\u8FB9\u754C\u6E05\u6670\uFF0C\u805A\u5408\u6839\u660E\u786E\n- [ ] \u5B9E\u4F53\u95F4\u5173\u7CFB\u6B63\u786E\u5EFA\u6A21\n- [ ] \u503C\u5BF9\u8C61\u4E0D\u53EF\u53D8\u4E14\u81EA\u5305\u542B\n- [ ] \u7C7B\u56FE\u989C\u8272\u89C4\u8303\u6B63\u786E\uFF08\u805A\u5408\u6839=\u6D45\u7EA2\uFF0C\u5B9E\u4F53=\u9EC4\uFF0C\u503C\u5BF9\u8C61=\u84DD\uFF09\n- [ ] PlantUML \u7C7B\u56FE\u8BED\u6CD5\u6B63\u786E\n\n### \u52A8\u6001\u6A21\u578B\n- [ ] **\u6BCF\u4E2A api.md \u4E2D\u7684 API \u90FD\u6709\u5BF9\u5E94\u7684\u4EFB\u52A1\u6811\u5165\u53E3**\uFF08\u4E0D\u9057\u6F0F\uFF09\n- [ ] **\u8FDC\u7A0B\u670D\u52A1\uFF08Command/Query\uFF09\u7684\u63A5\u53E3\u7B7E\u540D\u4E0E api.md \u7684 API \u5B9A\u4E49\u4E00\u81F4**\n- [ ] **\u5E94\u7528\u670D\u52A1\u7684\u65B9\u6CD5\u7B7E\u540D\u4E0E\u8FDC\u7A0B\u670D\u52A1\u63A5\u53E3\u4E00\u81F4**\n- [ ] \u4EFB\u52A1\u6811\u7ED3\u6784\u6E05\u6670\uFF0C\u5C42\u6B21\u5408\u7406\uFF08API \u2192 AppService \u2192 DomainService \u2192 Aggregate/Port\uFF09\n- [ ] \u539F\u5B50\u4EFB\u52A1\u5224\u65AD\u51C6\u786E\n- [ ] \u89D2\u8272\u5206\u914D\u7B26\u5408\u6784\u9020\u578B\u5B9A\u4E49\n- [ ] \u5E8F\u5217\u56FE\u5B8C\u6574\uFF0C\u5C55\u793A BC \u5185\u90E8\u6240\u6709\u5FC5\u8981\u4EA4\u4E92\n- [ ] \u5E8F\u5217\u56FE\u989C\u8272\u89C4\u8303\u6B63\u786E\n- [ ] PlantUML \u5E8F\u5217\u56FE\u8BED\u6CD5\u6B63\u786E\uFF0C\u4F7F\u7528 box \u5206\u7EC4\n- [ ] \u89D2\u8272\u534F\u4F5C\u7EA6\u675F\u5F97\u5230\u4E25\u683C\u9075\u5B88\n- [ ] \u5E8F\u5217\u56FE\u6D88\u606F\u6D41\u4E0E\u4EFB\u52A1\u6811\u6267\u884C\u6D41\u7A0B\u5B8C\u5168\u5BF9\u5E94\n\n### \u6A21\u578B\u4E00\u81F4\u6027\n- [ ] \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\n- [ ] \u7C7B\u56FE\u4E2D\u7684\u65B9\u6CD5\u4E0E\u5E8F\u5217\u56FE\u4E2D\u7684\u6D88\u606F\u8C03\u7528\u4E00\u81F4\n- [ ] UML \u547D\u540D\u98CE\u683C\u7EDF\u4E00\uFF08PascalCase \u7C7B\u540D\uFF0CcamelCase \u65B9\u6CD5/\u5C5E\u6027\uFF09\n\n## \u5B8C\u6210\u540E\u7684\u4E0B\u4E00\u6B65\n\n\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\n`;\n\nexport function register(): void {\n registerSkillTemplate('sparrow-model', () => MODEL_BODY);\n}\n", "/**\n * Sparrow Plan skill template.\n *\n * This skill creates an implementation plan based on spec, api, tech, and model documents.\n */\n\nimport { registerSkillTemplate } from '../core/skill-generation.js';\n\nconst PLAN_BODY = `# Sparrow Plan \u2014 \u5B9E\u73B0\u8BA1\u5212\u5236\u8BA2\n\n## \u6267\u884C\u987A\u5E8F\u68C0\u67E5\n\n\\`\\`\\`\n\u5F53\u524D\u6B65\u9AA4\uFF1Asparrow-plan\uFF08\u7B2C 5 \u6B65 / \u5171 6 \u6B65\uFF09\n\u6240\u5C5E\u5C42\u7EA7\uFF1A\u56E2\u961F\u7EA7\uFF08team-level\uFF09\uFF0C\u9488\u5BF9\u7279\u5B9A\u9650\u754C\u4E0A\u4E0B\u6587\n\u524D\u7F6E\u6761\u4EF6\uFF08\u5FC5\u987B\u5168\u90E8\u5B58\u5728\uFF09\uFF1A\n 1. docs/sparrow/design/{slug}/spec.md\n 2. docs/sparrow/design/{slug}/api.md\n 3. docs/sparrow/design/{slug}/tech.md\n 4. docs/sparrow/design/{slug}/model.md\n\u4E0B\u4E00\u6B65\u9AA4\uFF1Asparrow-apply @{slug}\uFF08\u56E2\u961F\u7EA7\uFF09\n\\`\\`\\`\n\n**\u524D\u7F6E\u6761\u4EF6\u68C0\u67E5**\uFF1A\n- \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\n- \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\n- \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\n\n---\n\n## \uD83D\uDED1 \u8F93\u51FA\u6587\u4EF6\u5B58\u5728\u6027\u68C0\u67E5\uFF08\u5FC5\u987B\u5728\u751F\u6210\u524D\u6267\u884C\uFF09\n\n\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\n\n- \\`docs/sparrow/design/{slug}/plan.md\\`\n\n\u5982\u679C\u6587\u4EF6\u5DF2\u5B58\u5728\uFF0C\u8BF7**\u8BA9\u7528\u6237\u8FDB\u884C\u9009\u62E9**\uFF1A\n\n- **\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\n- **\u8986\u76D6 (overwrite)**\uFF1A\u5220\u9664\u5DF2\u6709\u6587\u4EF6\uFF0C\u91CD\u65B0\u751F\u6210\u5168\u65B0\u7684\u5185\u5BB9\n- **\u66F4\u65B0 (update)**\uFF1A\u5728\u5DF2\u6709\u6587\u4EF6\u57FA\u7840\u4E0A\u8FDB\u884C\u4FEE\u6539\u548C\u5B8C\u5584\n\n> \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\n\n---\n\n## \uD83D\uDCCB project.md \u66F4\u65B0\n\n\u5B8C\u6210\u8F93\u51FA\u540E\uFF0C**\u5FC5\u987B**\u66F4\u65B0 \\`docs/sparrow/project.md\\`\uFF1A\n\n1. \u5982\u679C \\`project.md\\` \u4E0D\u5B58\u5728\uFF0C\u6839\u636E\u5F53\u524D\u9879\u76EE\u4FE1\u606F\u521B\u5EFA\u5B83\n2. \u5728\"\u9650\u754C\u4E0A\u4E0B\u6587\u8BBE\u8BA1\"\u90E8\u5206\uFF0C\u627E\u5230\u5F53\u524D \\`{slug}\\` \u7684\u5B50\u7AE0\u8282\n3. \u66F4\u65B0 \\`plan.md\\` \u7684\u72B6\u6001\u4ECE \\`_\u5F85\u751F\u6210_\\` \u6539\u4E3A \\`_v{version}_\\`\n4. \u66F4\u65B0\u6587\u4EF6\u5934\u90E8\u7684\"\u6700\u540E\u66F4\u65B0\"\u65F6\u95F4\u6233\n\n**project.md \u8DEF\u5F84**: \\`docs/sparrow/project.md\\`\n\n---\n\n## \uD83D\uDCCC \u7248\u672C\u5143\u6570\u636E\u7BA1\u7406\n\n\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\n\n\\`\\`\\`markdown\n<!--\n version: v1.0\n last-updated: {ISO_8601_TIMESTAMP}\n generated-by: sparrow-plan\n sparrow-version: {\u4ECE .sparrow/sparrow.json \u8BFB\u53D6}\n-->\n\\`\\`\\`\n\n**\u7248\u672C\u89C4\u5219**:\n- **\u65B0\u6587\u6863**: \u4F7F\u7528 \\`v1.0\\`\n- **\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\n- **\u91CD\u5927\u91CD\u5199**: \u9012\u589E\u4E3B\u7248\u672C\u53F7\uFF08\\`v1.x\\` \u2192 \\`v2.0\\`\uFF09\n- \u6BCF\u6B21\u4FEE\u6539\u90FD**\u5FC5\u987B\u53D8\u66F4**\u7248\u672C\u53F7\n\n**\u64CD\u4F5C\u6B65\u9AA4**:\n1. \u68C0\u67E5\u76EE\u6807\u6587\u4EF6\u662F\u5426\u5DF2\u5B58\u5728\n2. \u5982\u679C\u5B58\u5728\uFF0C\u8BFB\u53D6\u6587\u4EF6\u5F00\u5934 \\`<!--\\` \u6CE8\u91CA\u5757\u4E2D\u7684 \\`version:\\` \u5B57\u6BB5\u5E76\u9012\u589E\n3. \u5728\u6587\u4EF6\u5F00\u5934\u6DFB\u52A0\u6216\u66F4\u65B0\u7248\u672C\u5143\u6570\u636E\u5757\n4. \u7EE7\u7EED\u751F\u6210\u6587\u6863\u6B63\u6587\n\n---\n\n## \u4EE3\u7801\u76EE\u5F55\n\n\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\n\n> \\`backend/\\` \u76EE\u5F55\u5728\u9996\u6B21\u6267\u884C sparrow-apply \u65F6\u81EA\u52A8\u521B\u5EFA\u3002\n\n---\n\n## \u89D2\u8272\u5B9A\u4E49\n\n\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\n\n## \u5FC5\u8BFB\u8F93\u5165\n\n- \\`docs/sparrow/design/{slug}/spec.md\\` \u2014 \u573A\u666F\u4E0E\u9A8C\u6536\n- \\`docs/sparrow/design/{slug}/api.md\\` \u2014 \u5BF9\u5916\u5951\u7EA6\n- \\`docs/sparrow/design/{slug}/tech.md\\` \u2014 \u6280\u672F\u6808\u4E0E\u5DE5\u5177\u94FE\n- \\`docs/sparrow/design/{slug}/model.md\\` \u2014 \u9886\u57DF\u9759\u6001/\u52A8\u6001\u6A21\u578B\n\n## \u8F93\u51FA\n\n\u5199\u5165 **\\`docs/sparrow/design/{slug}/plan.md\\`**\n\n---\n\n## \u4EFB\u52A1\uFF08Task\uFF09\u683C\u5F0F\n\n\u6BCF\u4E2A\u4EFB\u52A1\u4F7F\u7528\u4E8C\u7EA7\u6807\u9898\u5F15\u5165\uFF0C\u6807\u9898\u5FC5\u987B\u4EE5 \\`## \u4EFB\u52A1\\` \u5F00\u5934\uFF1A\n\n\\`\\`\\`markdown\n## \u4EFB\u52A1 1\uFF1A{\u4EFB\u52A1\u6807\u9898}\n\n**\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\n**\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\n\n### \u6B65\u9AA4\n\n- [ ] \u7B2C\u4E00\u6B65\u8BF4\u660E\n- [ ] \u7B2C\u4E8C\u6B65\u8BF4\u660E\n\\`\\`\\`\n\n### \u6267\u884C\u65B9\u8BF4\u660E\n\n- **\\`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**\n- **\\`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\n\n### \u805A\u5408\u7C92\u5EA6\u4E0E\u6B65\u9AA4\u5408\u5E76\n\n- \u540C\u4E00\u805A\u5408\u6839\u7684\u9886\u57DF\u5C42\u5B9E\u73B0\u5E94\u5C3D\u91CF\u5199\u5728\u540C\u4E00 \\`- [ ]\\` \u6B65\u9AA4\u4E2D\n- \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\n- \u4E0D\u540C\u805A\u5408\u3001\u6216\u4EA7\u54C1\u4EE3\u7801\u4E0E\u96C6\u6210\u6D4B\u8BD5\u4E4B\u95F4\u53EF\u5206\u4EFB\u52A1\n\n---\n\n## \u4EFB\u52A1\u6392\u5E8F\u89C4\u5219\uFF08DDD \u5206\u5C42\u4F9D\u8D56\uFF09\n\n\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\n\n| \u987A\u5E8F | \u5C42\u6B21 | \u5185\u5BB9 |\n|------|------|------|\n| 1 | **\u811A\u624B\u67B6 + \u4F9D\u8D56** | \u9879\u76EE\u521D\u59CB\u5316\u3001\u6784\u5EFA\u811A\u672C\u3001\u4F9D\u8D56\u58F0\u660E |\n| 2 | **\u9886\u57DF\u5C42** | domain/aggregate\u3001entity\u3001valueobject\u3001service |\n| 3 | **\u57FA\u7840\u8BBE\u65BD\u5C42** | infrastructure/port/ + adapter/ |\n| 4 | **\u5E94\u7528\u5C42** | application/\uFF08AppService\uFF09 |\n| 5 | **api \u5C42** | api/dto\u3001api/command\u3001api/query |\n\n---\n\n## \u4EE3\u7801\u6A21\u5757\u5E03\u5C40\n\n### \u6838\u5FC3\u539F\u5219\n\n- **\u4E00\u4E2A\u9650\u754C\u4E0A\u4E0B\u6587 = \u4E00\u4E2A\u4EA7\u54C1\u6A21\u5757**\uFF0C\u6839\u76EE\u5F55\u4E3A **\\`backend/\\`**\n- \u56DB\u5C42\uFF08api\u3001application\u3001domain\u3001infrastructure\uFF09\u4EE5\u5305/\u76EE\u5F55\u5212\u5206\n- **\u96C6\u6210/API \u6D4B\u8BD5**\u5728 **\\`integration-tests/{slug}/\\`** \u4E0B\n- **\u7981\u6B62**\u5C06\u5404\u5C42\u62C6\u4E3A Maven/npm/Cargo \u5B50\u6A21\u5757\n\n### \u8DE8\u8BED\u8A00 DDD \u56DB\u5C42\u5E03\u5C40\n\n\u5C06\u4EE5\u4E0B\u76EE\u5F55\u7ED3\u6784\u5E94\u7528\u5230 plan \u4E2D\u7684\u6B65\u9AA4\u63CF\u8FF0\uFF1A\n\n**Java (Maven)**\uFF1A\n\\`\\`\\`\nbackend/\n src/main/java/{basePackage}/\n api/command/\n api/query/\n api/dto/\n application/\n domain/aggregate/\n domain/entity/\n domain/valueobject/\n domain/service/\n infrastructure/port/repository/\n infrastructure/port/client/\n infrastructure/adapter/repository/\n infrastructure/adapter/client/\n src/test/java/{basePackage}/\n domain/...\n\\`\\`\\`\n\n**Python (uv/pip)**\uFF1A\n\\`\\`\\`\nbackend/\n {package}/api/command/\n {package}/api/query/\n {package}/api/dto/\n {package}/application/\n {package}/domain/aggregate/\n {package}/domain/entity/\n {package}/domain/valueobject/\n {package}/domain/service/\n {package}/infrastructure/port/repository/\n {package}/infrastructure/port/client/\n {package}/infrastructure/adapter/repository/\n {package}/infrastructure/adapter/client/\n tests/{package}/domain/...\n\\`\\`\\`\n\n**Node.js (TypeScript)**\uFF1A\n\\`\\`\\`\nbackend/\n src/api/command/\n src/api/query/\n src/api/dto/\n src/application/\n src/domain/aggregate/\n src/domain/entity/\n src/domain/valueobject/\n src/domain/service/\n src/infrastructure/port/repository/\n src/infrastructure/port/client/\n src/infrastructure/adapter/repository/\n src/infrastructure/adapter/client/\n tests/domain/...\n\\`\\`\\`\n\n**Go**\uFF1A\n\\`\\`\\`\nbackend/\n cmd/\n internal/api/command/\n internal/api/query/\n internal/api/dto/\n internal/application/\n internal/domain/aggregate/\n internal/domain/entity/\n internal/domain/valueobject/\n internal/domain/service/\n internal/infrastructure/port/repository/\n internal/infrastructure/port/client/\n internal/infrastructure/adapter/repository/\n internal/infrastructure/adapter/client/\n\\`\\`\\`\n\n**Rust**\uFF1A\n\\`\\`\\`\nbackend/\n src/api/command/\n src/api/query/\n src/api/dto/\n src/application/\n src/domain/aggregate/\n src/domain/entity/\n src/domain/valueobject/\n src/domain/service/\n src/infrastructure/port/repository/\n src/infrastructure/port/client/\n src/infrastructure/adapter/repository/\n src/infrastructure/adapter/client/\n src/lib.rs\n tests/\n\\`\\`\\`\n\n**C++ (CMake + Conan/vcpkg)**\uFF1A\n\\`\\`\\`\nbackend/\n src/api/command/\n src/api/query/\n src/api/dto/\n src/application/\n src/domain/aggregate/\n src/domain/entity/\n src/domain/valueobject/\n src/domain/service/\n src/infrastructure/port/repository/\n src/infrastructure/port/client/\n src/infrastructure/adapter/repository/\n src/infrastructure/adapter/client/\n tests/\n CMakeLists.txt\n\\`\\`\\`\n\n---\n\n## \u4EFB\u52A1\u5B8C\u6574\u6027\u68C0\u67E5\u8868\n\n\u4ECE\u4E0B\u5217\u89D2\u5EA6\u81EA\u68C0\uFF0C\u907F\u514D\u9057\u6F0F\uFF1A\n\n| \u89D2\u5EA6 | \u5E94\u8986\u76D6\u7684\u5178\u578B\u6B65\u9AA4 |\n|------|-----------------|\n| spec | \u4E0E\u5173\u952E\u573A\u666F\u5BF9\u5E94\u7684\u5B9E\u73B0\u4E0E\u9A8C\u8BC1 |\n| api | \u5951\u7EA6\u6D4B\u8BD5\u3001\u63A7\u5236\u5668\u5F62\u72B6\u4E0E\u9519\u8BEF\u7801 |\n| model | \u805A\u5408/\u5B9E\u4F53/\u503C\u5BF9\u8C61/\u9886\u57DF\u670D\u52A1\u4E0E\u5E8F\u5217\u56FE\u7EA6\u675F |\n| tech | \u811A\u624B\u67B6\u3001\u9009\u5B9A\u6D4B\u8BD5\u4E0E\u6784\u5EFA\u547D\u4EE4 |\n| \u96C6\u6210/API \u6D4B\u8BD5 | \u5728\u96C6\u6210\u6D4B\u8BD5\u76EE\u5F55\u521B\u5EFA\u6D4B\u8BD5\u5DE5\u7A0B |\n| \u4EA7\u54C1\u4EE3\u7801 | \u6309\u805A\u5408\u5408\u5E76\u7684\u9886\u57DF TDD\u3001\u5E94\u7528\u5C42\u4E0E\u57FA\u7840\u8BBE\u65BD |\n| \u4F9D\u8D56\u4E0E\u6784\u5EFA | \u5355\u72EC\u4E00\u6B65\u5199\u660E\u4F9D\u8D56\u5B89\u88C5\u547D\u4EE4 |\n\n---\n\n## \u7981\u6B62\u4E8B\u9879\n\n- \u4E0D\u8981\u81C6\u9020 api.md / model.md \u4E2D\u4E0D\u5B58\u5728\u7684 API \u6216\u805A\u5408\n- \u4E0D\u8981\u5728 plan.md \u4E2D\u5D4C\u5165\u5B8C\u6574\u5927\u6BB5\u89C4\u7EA6\u539F\u6587\n- **\u7981\u6B62**\u521B\u5EFA\u6309\u5C42\u62C6\u5206\u7684 Maven/npm/Cargo \u5B50\u6A21\u5757\n- **\u7981\u6B62**\u5C06\u96C6\u6210\u6D4B\u8BD5\u4F5C\u4E3A\u4EA7\u54C1\u4EE3\u7801\u5B50\u6A21\u5757\n- **\u7981\u6B62**\u51FA\u73B0 \\`application/command\\`\u3001\\`application/query\\`\u3001\\`interfaces/\\` \u7B49\u76EE\u5F55\u7ED3\u6784\n\n---\n\n## \u793A\u4F8B Plan \u7ED3\u6784\n\n\\`\\`\\`markdown\n# \u5B9E\u73B0\u8BA1\u5212 \u2014 {\u9650\u754C\u4E0A\u4E0B\u6587\u4E2D\u6587\u540D}\n\n\u672C\u8BA1\u5212\u8986\u76D6 sparrow-apply \u9636\u6BB5\u7684\u6240\u6709\u5F00\u53D1\u4E0E\u6D4B\u8BD5\u4EFB\u52A1\u3002\n\n## \u4EFB\u52A1 1\uFF1A\u9879\u76EE\u811A\u624B\u67B6\u4E0E\u4F9D\u8D56\u914D\u7F6E\n\n**\u6267\u884C\u65B9**\uFF1A\\`dev\\`\n**\u53EF\u5E76\u884C**\uFF1A\\`\u5426\\`\n\n### \u6B65\u9AA4\n\n- [ ] \u5728 backend/ \u521B\u5EFA\u9879\u76EE\u811A\u624B\u67B6\n- [ ] \u914D\u7F6E\u4F9D\u8D56\u7BA1\u7406\u6587\u4EF6\uFF0C\u5B89\u88C5\u4F9D\u8D56\n\n## \u4EFB\u52A1 2\uFF1A{\u805A\u5408\u540D}\u9886\u57DF\u6A21\u578B\u843D\u5730\n\n**\u6267\u884C\u65B9**\uFF1A\\`dev\\`\n**\u53EF\u5E76\u884C**\uFF1A\\`\u5426\\`\n\n### \u6B65\u9AA4\n\n- [ ] \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\n- [ ] \u5B9E\u73B0 {DomainService} \u9886\u57DF\u670D\u52A1\u53CA\u5355\u5143\u6D4B\u8BD5\n\n## \u4EFB\u52A1 3\uFF1A\u57FA\u7840\u8BBE\u65BD\u5C42\u5B9E\u73B0\n\n**\u6267\u884C\u65B9**\uFF1A\\`dev\\`\n**\u53EF\u5E76\u884C**\uFF1A\\`\u5426\\`\n\n### \u6B65\u9AA4\n\n- [ ] \u5B9E\u73B0 Repository \u7AEF\u53E3\u4E0E\u9002\u914D\u5668\n- [ ] \u5B9E\u73B0\u5916\u90E8\u670D\u52A1 Client \u7AEF\u53E3\u4E0E\u9002\u914D\u5668\n\n## \u4EFB\u52A1 4\uFF1A\u5E94\u7528\u5C42\u5B9E\u73B0\n\n**\u6267\u884C\u65B9**\uFF1A\\`dev\\`\n**\u53EF\u5E76\u884C**\uFF1A\\`\u5426\\`\n\n### \u6B65\u9AA4\n\n- [ ] \u5B9E\u73B0 {Entity}AppService \u5E94\u7528\u670D\u52A1\u53CA\u5355\u5143\u6D4B\u8BD5\n\n## \u4EFB\u52A1 5\uFF1AAPI \u5C42\u5B9E\u73B0\n\n**\u6267\u884C\u65B9**\uFF1A\\`dev\\`\n**\u53EF\u5E76\u884C**\uFF1A\\`\u5426\\`\n\n### \u6B65\u9AA4\n\n- [ ] \u5B9E\u73B0 api/dto \u6D88\u606F\u5951\u7EA6\n- [ ] \u5B9E\u73B0 api/command \u547D\u4EE4\u5904\u7406\u5668\n- [ ] \u5B9E\u73B0 api/query \u67E5\u8BE2\u5904\u7406\u5668\n\n## \u4EFB\u52A1 6\uFF1A\u96C6\u6210\u6D4B\u8BD5\n\n**\u6267\u884C\u65B9**\uFF1A\\`qa\\`\n**\u53EF\u5E76\u884C**\uFF1A\\`\u662F\\`\n\n### \u6B65\u9AA4\n\n- [ ] \u5728 integration-tests/{slug}/ \u521B\u5EFA\u96C6\u6210\u6D4B\u8BD5\u5DE5\u7A0B\n- [ ] \u5B9E\u73B0 API \u5951\u7EA6\u6D4B\u8BD5\n- [ ] \u5B9E\u73B0\u96C6\u6210\u573A\u666F\u6D4B\u8BD5\n\n## \u4EFB\u52A1 7\uFF1A\u6784\u5EFA\u9A8C\u8BC1\u4E0E\u8BC4\u5BA1\u51C6\u5907\n\n**\u6267\u884C\u65B9**\uFF1A\\`dev\\`\n**\u53EF\u5E76\u884C**\uFF1A\\`\u5426\\`\n\n### \u6B65\u9AA4\n\n- [ ] \u8FD0\u884C\u5B8C\u6574\u6784\u5EFA\u4E0E\u6D4B\u8BD5\u5957\u4EF6\uFF0C\u786E\u4FDD\u5168\u90E8\u901A\u8FC7\n\\`\\`\\`\n\n## \u5B8C\u6210\u540E\u7684\u4E0B\u4E00\u6B65\n\n\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\n`;\n\nexport function register(): void {\n registerSkillTemplate('sparrow-plan', () => PLAN_BODY);\n}\n", "/**\n * Sparrow Apply skill template.\n *\n * This skill executes the implementation plan to generate DDD-structured code.\n * It drives three roles: QA Engineer, Development Engineer, and Code Review.\n */\n\nimport { registerSkillTemplate } from '../core/skill-generation.js';\n\nconst APPLY_BODY = `# Sparrow Apply \u2014 \u6309\u5B9E\u73B0\u8BA1\u5212\u6267\u884C\u4EE3\u7801\u751F\u6210\n\n## \u6267\u884C\u987A\u5E8F\u68C0\u67E5\n\n\\`\\`\\`\n\u5F53\u524D\u6B65\u9AA4\uFF1Asparrow-apply\uFF08\u7B2C 6 \u6B65 / \u5171 6 \u6B65\uFF09\n\u6240\u5C5E\u5C42\u7EA7\uFF1A\u56E2\u961F\u7EA7\uFF08team-level\uFF09\uFF0C\u9488\u5BF9\u7279\u5B9A\u9650\u754C\u4E0A\u4E0B\u6587\n\u524D\u7F6E\u6761\u4EF6\uFF1Adocs/sparrow/design/{slug}/plan.md \u5FC5\u987B\u5B58\u5728\n\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\n\\`\\`\\`\n\n**\u524D\u7F6E\u6761\u4EF6\u68C0\u67E5**\uFF1A\n- \u5982\u679C \\`docs/sparrow/design/{slug}/plan.md\\` \u4E0D\u5B58\u5728\uFF0C\u8BF7\u63D0\u793A\u7528\u6237\u5148\u6267\u884C **sparrow-plan @{slug}**\n- \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\n- \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\n\n---\n\n## \u4EE3\u7801\u76EE\u5F55\u68C0\u67E5\n\n\u5728\u5F00\u59CB\u6267\u884C\u4E4B\u524D\uFF1A\n\n1. \u68C0\u67E5 \\`backend/\\` \u76EE\u5F55\u662F\u5426\u5DF2\u5B58\u5728\uFF1A\n - **\u5982\u679C\u5DF2\u5B58\u5728**\uFF1A\u76F4\u63A5\u4F7F\u7528\u8BE5\u76EE\u5F55\uFF0C\u4E0D\u91CD\u65B0\u521B\u5EFA\u9879\u76EE\u811A\u624B\u67B6\n - **\u5982\u679C\u4E0D\u5B58\u5728**\uFF1A\u521B\u5EFA\u8BE5\u76EE\u5F55\u53CA\u9879\u76EE\u811A\u624B\u67B6\n\n> \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\n\n---\n\n## \u89D2\u8272\u5B9A\u4E49\n\n\u4F60\u9A71\u52A8\u4E09\u4E2A\u89D2\u8272\u6309 plan.md \u6267\u884C\u4EFB\u52A1\uFF1A\n\n1. **Development Engineer** (\\`dev\\`)\uFF1A\u4EA7\u54C1\u4EE3\u7801\uFF08DDD \u56DB\u5C42 + \u9886\u57DF TDD\uFF09\n2. **QA Engineer** (\\`qa\\`)\uFF1A\u96C6\u6210\u6D4B\u8BD5\u3001API/\u5951\u7EA6\u6D4B\u8BD5\n3. **Code Review**\uFF1A\u4EE3\u7801\u8BC4\u5BA1\uFF0C\u751F\u6210 code_review.md\n\n---\n\n## \u5FC5\u8BFB\u89C4\u7EA6\n\n- \\`docs/sparrow/design/{slug}/plan.md\\` \u2014 \u6267\u884C\u8BA1\u5212\uFF08\u4EE5 plan \u4E3A\u51C6\u7684\u6267\u884C\u987A\u5E8F\uFF09\n- \\`docs/sparrow/design/{slug}/spec.md\\` \u2014 \u573A\u666F\u4E0E\u9A8C\u6536\n- \\`docs/sparrow/design/{slug}/api.md\\` \u2014 \u5BF9\u5916\u5951\u7EA6\n- \\`docs/sparrow/design/{slug}/tech.md\\` \u2014 \u6280\u672F\u6808\u4E0E\u5DE5\u5177\u94FE\n- \\`docs/sparrow/design/{slug}/model.md\\` \u2014 \u9886\u57DF\u6A21\u578B\uFF08\u9759\u6001 + \u52A8\u6001\uFF09\n\n---\n\n## \u4EE3\u7801\u4E0E\u6A21\u578B\u4E00\u81F4\u6027\uFF08\u6838\u5FC3\u7EA6\u675F\uFF09\n\n\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\n\n### \u9886\u57DF\u5C42\u4E00\u81F4\u6027\n\n| model.md \u5143\u7D20 | \u4EE3\u7801\u5B9E\u73B0 | \u4E00\u81F4\u6027\u8981\u6C42 |\n|--------------|---------|-----------|\n| \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 |\n| \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 |\n| \u503C\u5BF9\u8C61 | domain/valueobject/ | \u5C5E\u6027\u540D\u3001\u4E0D\u53EF\u53D8\u6027\u5FC5\u987B\u4E0E\u7C7B\u56FE\u4E2D\u7684\u5B9A\u4E49\u4E00\u81F4 |\n| \u9886\u57DF\u670D\u52A1 | domain/service/ | \u65B9\u6CD5\u7B7E\u540D\u5FC5\u987B\u4E0E\u5E8F\u5217\u56FE\u4E2D\u7684\u8C03\u7528\u4E00\u81F4 |\n\n### \u975E\u9886\u57DF\u5C42\u4E00\u81F4\u6027\n\n| model.md \u4E2D\u7684\u89D2\u8272 | \u4EE3\u7801\u5B9E\u73B0 | \u4E00\u81F4\u6027\u8981\u6C42 |\n|------------------|---------|-----------|\n| \u8FDC\u7A0B\u670D\u52A1 (Command/Query) | api/command/ \u6216 api/query/ | \u65B9\u6CD5\u7B7E\u540D\u4E0E\u4EFB\u52A1\u6811\u6839\u8282\u70B9\u4E00\u81F4 |\n| \u5E94\u7528\u670D\u52A1 (AppService) | application/ | \u65B9\u6CD5\u7B7E\u540D\u4E0E\u4EFB\u52A1\u6811\u7B2C\u4E8C\u5C42\u4E00\u81F4 |\n| \u7AEF\u53E3 (Repository/Client) | infrastructure/port/ | \u63A5\u53E3\u65B9\u6CD5\u7B7E\u540D\u4E0E\u5E8F\u5217\u56FE\u4E2D\u7684\u7AEF\u53E3\u8C03\u7528\u4E00\u81F4 |\n| \u9002\u914D\u5668 | infrastructure/adapter/ | \u5B9E\u73B0 port \u63A5\u53E3\uFF0C\u65B9\u6CD5\u7B7E\u540D\u4E00\u81F4 |\n\n### \u547D\u540D\u98CE\u683C\u8F6C\u6362\n\n**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\n\n| \u5143\u7D20 | UML (model.md) | Java | Python | TypeScript | Go | Rust | C++ |\n|------|---------------|------|--------|------------|-----|------|-----|\n| \u7C7B/\u63A5\u53E3\u540D | PascalCase | PascalCase | PascalCase | PascalCase | PascalCase | PascalCase | PascalCase |\n| \u65B9\u6CD5/\u51FD\u6570\u540D | camelCase | camelCase | snake_case | camelCase | PascalCase | snake_case | snake_case |\n| \u5C5E\u6027/\u5B57\u6BB5\u540D | camelCase | camelCase | snake_case | camelCase | PascalCase | snake_case | snake_case |\n| \u6587\u4EF6\u540D | (\u65E0) | PascalCase | snake_case | kebab-case | snake_case | snake_case | snake_case |\n| \u5305/\u6A21\u5757\u540D | (\u65E0) | \u5168\u5C0F\u5199 | snake_case | kebab-case | \u5168\u5C0F\u5199 | snake_case | \u5168\u5C0F\u5199 |\n\n> **\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\n\n---\n\n## DDD \u56DB\u5C42 + \u83F1\u5F62\u5BF9\u79F0\u67B6\u6784\n\n\\`\\`\\`\napi \u5C42\uFF08\u5317\u5411\u7F51\u5173\uFF09:\n api/command/ \u2014 \u547D\u4EE4\u5904\u7406\u5668\uFF08*Command\uFF09\n api/query/ \u2014 \u67E5\u8BE2\u5904\u7406\u5668\uFF08*Query\uFF09\n api/dto/ \u2014 \u6D88\u606F\u5951\u7EA6\uFF08*Request/*Response/*Event\uFF09\n\napplication \u5C42\uFF08\u5317\u5411\u7F51\u5173\uFF09:\n application/ \u2014 \u5E94\u7528\u670D\u52A1\uFF08*AppService\uFF09\uFF0C\u7F16\u6392\u9886\u57DF\u5C42\u4E0E\u57FA\u7840\u8BBE\u65BD\u5C42\n\ndomain \u5C42\uFF08\u9886\u57DF\u6838\u5FC3\uFF09:\n domain/aggregate/ \u2014 \u805A\u5408\u6839\n domain/entity/ \u2014 \u5B9E\u4F53\n domain/valueobject/ \u2014 \u503C\u5BF9\u8C61\n domain/service/ \u2014 \u9886\u57DF\u670D\u52A1\uFF08*Service\uFF09\n\ninfrastructure \u5C42\uFF08\u5357\u5411\u7F51\u5173\uFF09:\n infrastructure/port/repository/ \u2014 \u8D44\u6E90\u5E93\u7AEF\u53E3\uFF08\u63A5\u53E3\uFF09\n infrastructure/port/client/ \u2014 \u5BA2\u6237\u7AEF\u7AEF\u53E3\uFF08\u63A5\u53E3\uFF09\n infrastructure/adapter/repository/ \u2014 \u8D44\u6E90\u5E93\u9002\u914D\u5668\uFF08\u5B9E\u73B0\uFF09\n infrastructure/adapter/client/ \u2014 \u5BA2\u6237\u7AEF\u9002\u914D\u5668\uFF08\u5B9E\u73B0\uFF09\n\\`\\`\\`\n\n---\n\n## \u6267\u884C\u65B9\u6620\u5C04\n\n### dev \u4EFB\u52A1\uFF08Development Engineer\uFF09\n- \u4EA7\u54C1\u4EE3\u7801\u5199\u5165 \\`backend/\\` \u6A21\u5757\n- **\u9886\u57DF\u5C42\u987B TDD**\uFF1A\u5148\u5199\u6D4B\u8BD5\uFF0C\u518D\u5199\u5B9E\u73B0\n- \u540C\u4E00\u6B65\u9AA4\u5185\u5B8C\u6210\u6D4B\u8BD5 + \u5B9E\u73B0\n- \u6BCF\u751F\u6210\u5B8C\u6574\u6587\u4EF6\u5185\u5BB9\uFF0C\u7ACB\u5373\u5199\u5165\u78C1\u76D8\n\n### qa \u4EFB\u52A1\uFF08QA Engineer\uFF09\n- \u96C6\u6210\u6D4B\u8BD5\u5199\u5165 \\`integration-tests/{slug}/\\`\n- \u8986\u76D6 API/\u5951\u7EA6/\u96C6\u6210\u573A\u666F\n- **\u7981\u6B62**\u9886\u57DF\u5C42\u5355\u5143\u6D4B\u8BD5\uFF08\u9886\u57DF TDD \u5C5E\u4E8E dev\uFF09\n\n### Code Review\uFF08\u5168\u90E8 dev + qa \u4EFB\u52A1\u5B8C\u6210\u540E\uFF09\n- \u8FD0\u884C\u68C0\u67E5\u5E76\u751F\u6210 \\`docs/sparrow/design/{slug}/code_review.md\\`\n- \u9A8C\u8BC1\u4EE3\u7801\u662F\u5426\u7B26\u5408 tech.md \u7684\u6280\u672F\u6808\u8981\u6C42\n- \u9A8C\u8BC1\u662F\u5426\u7B26\u5408\u5BF9\u5E94\u8BED\u8A00\u7684\u7F16\u7801\u89C4\u8303\n\n---\n\n## \u9886\u57DF TDD \u6D41\u7A0B\n\n\u5BF9\u6BCF\u4E2A dev \u4EFB\u52A1\u4E2D\u7684\u9886\u57DF\u5C42\u6B65\u9AA4\uFF1A\n\n1. **\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\n2. **\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\n3. **\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\n\n---\n\n## \u6267\u884C\u6D41\u7A0B\n\n1. \u8BFB\u53D6 \\`plan.md\\`\uFF0C\u6309\u4EFB\u52A1\u987A\u5E8F\u89E3\u6790\n2. \u5BF9\u6BCF\u4E2A \\`## \u4EFB\u52A1\\`\uFF1A\n - \u6839\u636E \\`\u6267\u884C\u65B9\\` \u786E\u5B9A\u7531 dev \u6216 qa \u6267\u884C\n - \u6309\u987A\u5E8F\u6267\u884C\u4EFB\u52A1\u4E0B\u7684\u6BCF\u4E2A \\`- [ ]\\` \u6B65\u9AA4\n - \u6BCF\u6B65\u5B8C\u6210\u540E\u9A8C\u8BC1\u4EA7\u7269\uFF08\u68C0\u67E5\u6587\u4EF6\u662F\u5426\u751F\u6210\uFF09\n3. \u5168\u90E8\u4EFB\u52A1\u5B8C\u6210\u540E\uFF0C\u5C06\u5DF2\u5B8C\u6210\u7684\u6B65\u9AA4\u6807\u8BB0\u4E3A \\`- [x]\\`\n4. \u6267\u884C Code Review\uFF0C\u751F\u6210 code_review.md\n\n---\n\n## \u8BED\u8A00\u7EA7\u89C4\u5219\u53C2\u8003\n\n\u6839\u636E tech.md \u4E2D\u9009\u5B9A\u7684\u8BED\u8A00\uFF0C\u9075\u5FAA\u5BF9\u5E94\u7684\u7F16\u7801\u89C4\u8303\uFF1A\n\n### \u901A\u7528\u89C4\u5219\n- \u6240\u6709\u8BED\u8A00\uFF1A\u9075\u5FAA DDD \u56DB\u5C42\u76EE\u5F55\u7ED3\u6784\n- \u9886\u57DF\u5C42\u4E0D\u4F9D\u8D56\u6846\u67B6/\u6570\u636E\u5E93\u5177\u4F53\u7C7B\u578B\n- api \u5C42\u4E0D\u5199\u9886\u57DF\u89C4\u5219\n- infrastructure \u5C42 port \u4E3A\u63A5\u53E3\uFF0Cadapter \u4E3A\u5B9E\u73B0\n\n### \u8BED\u8A00\u7279\u5B9A\u53CD\u6A21\u5F0F\n\n**Java**\uFF1A\n- \u9886\u57DF\u5C42\u4E0D\u8981\u4F9D\u8D56 Spring Data / HTTP \u5177\u4F53\u7C7B\u578B\n- \u4E0D\u8981\u5728 handler \u4E2D\u5199\u6838\u5FC3\u4E1A\u52A1\u89C4\u5219\n- \u7981\u6B62 application/command\u3001application/query \u76EE\u5F55\n\n**Python**\uFF1A\n- router \u4E2D\u4E0D\u8981\u5199\u9886\u57DF\u89C4\u5219\n- \u9886\u57DF\u5C42\u4E0D\u8981\u4F9D\u8D56 FastAPI/SQLAlchemy \u5177\u4F53\u7C7B\u578B\n- \u4F7F\u7528 logging \u800C\u975E print\n- \u4F18\u5148 uv + pyproject.toml\n\n**Node.js/TypeScript**\uFF1A\n- controller \u4E2D\u4E0D\u8981\u5199\u9886\u57DF\u89C4\u5219\n- \u9886\u57DF\u5C42\u4E0D\u8981\u4F9D\u8D56 Express/NestJS \u5177\u4F53\u7C7B\u578B\n- \u4E25\u683C\u6A21\u5F0F \\`\"strict\": true\\`\n- \u4F7F\u7528 pino/winston \u800C\u975E console.log\n\n**Go**\uFF1A\n- handler \u4E2D\u4E0D\u8981\u5199\u6838\u5FC3\u4E1A\u52A1\u89C4\u5219\n- \u9886\u57DF\u5C42\u4E0D\u5BFC\u5165 database/sql \u5177\u4F53\u9A71\u52A8\n- \u4F7F\u7528 go modules\n\n**Rust**\uFF1A\n- handler \u95ED\u5305\u4E0D\u8981\u5806\u53E0\u9886\u57DF\u89C4\u5219\n- \u9886\u57DF\u5C42\u4E0D\u8981\u4F9D\u8D56 axum/sqlx \u5177\u4F53\u7C7B\u578B\n- \u907F\u514D unwrap()/expect() \u5904\u7406\u53EF\u9884\u671F\u5931\u8D25\n\n**C++**\uFF1A\n- handler \u4E2D\u4E0D\u8981\u5199\u6838\u5FC3\u4E1A\u52A1\u89C4\u5219\n- \u9886\u57DF\u5C42\u4E0D\u4F9D\u8D56\u5177\u4F53 HTTP \u6846\u67B6\uFF08drogon/pistache\uFF09\u6216\u6570\u636E\u5E93\u9A71\u52A8\u7C7B\u578B\n- \u4F7F\u7528 RAII \u7BA1\u7406\u8D44\u6E90\uFF0C\u907F\u514D\u88F8\u6307\u9488\u548C\u624B\u52A8 new/delete\n- \u5934\u6587\u4EF6\u4F7F\u7528 #pragma once \u6216 include guard\n- \u4F18\u5148\u4F7F\u7528\u667A\u80FD\u6307\u9488\uFF08std::unique_ptr / std::shared_ptr\uFF09\n\n### \u5305/\u6A21\u5757\u547D\u540D\u89C4\u8303\n\n- **Java**: UpperCamelCase \u7C7B\u540D\uFF0ClowerCamelCase \u65B9\u6CD5\u540D\uFF0C\u5168\u5C0F\u5199\u5305\u540D\n- **Python**: snake_case \u6587\u4EF6\u540D\u548C\u65B9\u6CD5\u540D\uFF0CPascalCase \u7C7B\u540D\n- **Node.js**: PascalCase \u7C7B\u540D\uFF0CcamelCase \u65B9\u6CD5\u540D\uFF0Ckebab-case \u6587\u4EF6\u540D\n- **Go**: PascalCase \u5BFC\u51FA\uFF0CcamelCase \u672A\u5BFC\u51FA\uFF0C\u5168\u5C0F\u5199\u5305\u540D\n- **Rust**: snake_case \u51FD\u6570/\u6A21\u5757/\u53D8\u91CF\uFF0CPascalCase \u7C7B\u578B/trait/enum\n- **C++**: PascalCase \u7C7B\u540D\uFF0Csnake_case \u51FD\u6570/\u53D8\u91CF/\u6587\u4EF6\u540D\uFF0C\u5168\u5C0F\u5199\u547D\u540D\u7A7A\u95F4\n\n---\n\n## \u4F9D\u8D56\u5B89\u88C5\u89C4\u5219\n\n- \\`install_dependencies\\` \u4EC5\u5728\u4EE5\u4E0B\u60C5\u51B5\u5F00\u653E\uFF1A\n 1. \u6B65\u9AA4\u6587\u5B57\u660E\u786E\u8981\u6C42\u4F9D\u8D56\u5B89\u88C5\n 2. \u5F53\u524D\u4E3A dev \u4EFB\u52A1\u7684\u6700\u540E\u4E00\u4E2A\u672A\u5B8C\u6210\u6B65\u9AA4\uFF08\u6536\u5C3E\u6784\u5EFA\uFF09\n- \u5176\u4F59\u6B65\u9AA4\u53EA\u7528\u811A\u624B\u67B6 + \u6587\u4EF6\u5199\u5165\n- Code Review \u53EF\u4EE5\u8C03\u7528\u6784\u5EFA\u5DE5\u5177\u505A\u6821\u9A8C\n\n---\n\n## \u8F93\u51FA\u6587\u4EF6\n\n### \u4EA7\u54C1\u4EE3\u7801\n\\`\\`\\`\nbackend/\n ... (DDD \u56DB\u5C42\u76EE\u5F55\u7ED3\u6784)\n\\`\\`\\`\n\n### \u96C6\u6210\u6D4B\u8BD5\n\\`\\`\\`\nintegration-tests/{slug}/\n ... (\u96C6\u6210\u6D4B\u8BD5\u5DE5\u7A0B)\n\\`\\`\\`\n\n### \u4EE3\u7801\u8BC4\u5BA1\u62A5\u544A\n\\`\\`\\`\ndocs/sparrow/design/{slug}/code_review.md\n\\`\\`\\`\n\n---\n\n## \u8D28\u91CF\u68C0\u67E5\u6E05\u5355\n\n\u6BCF\u4E2A\u4EFB\u52A1\u5B8C\u6210\u540E\uFF1A\n- [ ] \u78C1\u76D8\u6587\u4EF6\u5DF2\u751F\u6210\n- [ ] \u6D4B\u8BD5\u53EF\u4EE5\u901A\u8FC7\n- [ ] \u4EE3\u7801\u7B26\u5408\u5BF9\u5E94\u8BED\u8A00\u7F16\u7801\u89C4\u8303\n- [ ] DDD \u56DB\u5C42\u4F9D\u8D56\u65B9\u5411\u6B63\u786E\uFF08\u5916\u5C42\u4F9D\u8D56\u5185\u5C42\uFF09\n- [ ] \u9886\u57DF\u5C42\u4E0D\u4F9D\u8D56\u6846\u67B6/\u6570\u636E\u5E93\u5177\u4F53\u7C7B\u578B\n- [ ] **\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\n\n\u5168\u90E8\u4EFB\u52A1\u5B8C\u6210\u540E\uFF1A\n- [ ] \u5B8C\u6574\u6784\u5EFA\u901A\u8FC7\n- [ ] \u6240\u6709\u6D4B\u8BD5\u901A\u8FC7\n- [ ] Code Review \u5B8C\u6210\n- [ ] plan.md \u6240\u6709\u6B65\u9AA4\u6807\u8BB0\u4E3A \\`- [x]\\`\n- [ ] **\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\n- [ ] **\u975E\u9886\u57DF\u5C42\u4EE3\u7801\u4E0E model.md \u52A8\u6001\u6A21\u578B\u5B8C\u5168\u5BF9\u9F50**\uFF08Command/Query\u3001AppService\u3001Port\u3001Adapter\uFF09\n- [ ] **API \u5C42\u63A5\u53E3\u4E0E api.md \u4E2D\u5B9A\u4E49\u7684\u5951\u7EA6\u4E00\u81F4**\n\n---\n\n## \u5B8C\u6210\u540E\u7684\u4E0B\u4E00\u6B65\n\n\uD83C\uDF89 \u5F53\u524D\u9650\u754C\u4E0A\u4E0B\u6587 \\`{slug}\\` \u5DF2\u5168\u90E8\u5B8C\u6210\uFF01\n\n\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\n**sparrow-design \u2192 sparrow-model \u2192 sparrow-plan \u2192 sparrow-apply**\n\n\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\n`;\n\nexport function register(): void {\n registerSkillTemplate('sparrow-apply', () => APPLY_BODY);\n}\n", "/**\n * Skills registry \u2014 imports all skill templates to trigger registration.\n * Each skill module calls registerSkillTemplate() on import.\n */\n\nimport { register as registerExplore } from './explore.js';\nimport { register as registerArch } from './arch.js';\nimport { register as registerDesign } from './design.js';\nimport { register as registerModel } from './model.js';\nimport { register as registerPlan } from './plan.js';\nimport { register as registerApply } from './apply.js';\n\n/**\n * Initialize all skill templates. Must be called before generating skill files.\n */\nexport function initializeSkills(): void {\n registerExplore();\n registerArch();\n registerDesign();\n registerModel();\n registerPlan();\n registerApply();\n}\n", "/**\n * Interactive terminal UI for Sparrow CLI.\n *\n * Uses @inquirer/prompts for checkbox, input, and confirm interactions.\n * Provides the welcome page rendering with ASCII art sparrow logo.\n */\n\nimport { checkbox, input, confirm } from '@inquirer/prompts';\nimport type { ToolDefinition } from './config.js';\nimport { SUPPORTED_TOOLS } from './config.js';\n\n// \u2500\u2500\u2500 Color constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Dark green for sparrow logo \u2014 #2E7D32 */\nconst GREEN = '\\x1b[38;2;46;125;50m';\nconst CYAN = '\\x1b[36m';\nconst YELLOW = '\\x1b[33m';\nconst RED = '\\x1b[31m';\nconst DIM = '\\x1b[2m';\nconst RESET = '\\x1b[0m';\n\n// \u2500\u2500\u2500 Welcome Page \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Render the welcome page with ASCII art sparrow logo in dark green.\n * The logo features a small sparrow silhouette on the left side.\n */\nexport function renderWelcomePage(): void {\n const lines: string[] = [\n '',\n `${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}`,\n `${CYAN}\u2551${RESET} ${CYAN}\u2551${RESET}`,\n `${CYAN}\u2551${RESET} ${CYAN}\u2551${RESET}`,\n `${CYAN}\u2551${RESET} ${GREEN} ___ _ __ __ _ _ __ _ ____ _____ __ ${RESET} ${CYAN}\u2551${RESET}`,\n `${CYAN}\u2551${RESET} ${GREEN} / __| '_ \\\\ / _\\` | '__| '_ \\\\ \\\\ /\\\\ / / _ \\\\/ _| ${RESET} ${CYAN}\u2551${RESET}`,\n `${CYAN}\u2551${RESET} ${GREEN} \\\\__ \\\\ |_) | (_| | | | | | \\\\ V V / __/ (_| ${RESET} ${CYAN}\u2551${RESET}`,\n `${CYAN}\u2551${RESET} ${GREEN} |___/ .__/ \\\\__,_|_| |_| |_|\\\\_/\\\\_/ \\\\___|\\\\__| ${RESET} ${CYAN}\u2551${RESET}`,\n `${CYAN}\u2551${RESET} ${GREEN} |_| ${RESET} ${CYAN}\u2551${RESET}`,\n `${CYAN}\u2551${RESET} ${CYAN}\u2551${RESET}`,\n `${CYAN}\u2551${RESET} ${GREEN}Spec-Driven DDD Framework for AI Coding Assistants${RESET} ${CYAN}\u2551${RESET}`,\n `${CYAN}\u2551${RESET} ${DIM}From business requirements to production code${RESET} ${CYAN}\u2551${RESET}`,\n `${CYAN}\u2551${RESET} ${CYAN}\u2551${RESET}`,\n `${CYAN}\u2551${RESET} ${DIM}Pipeline:${RESET} explore \u2192 arch \u2192 design \u2192 model \u2192 plan \u2192 apply ${CYAN}\u2551${RESET}`,\n `${CYAN}\u2551${RESET} ${CYAN}\u2551${RESET}`,\n `${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}`,\n '',\n ];\n\n for (const line of lines) {\n console.log(line);\n }\n}\n\n// \u2500\u2500\u2500 Prompts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Prompt user for a single-line text input.\n */\nexport async function promptInput(\n message: string,\n defaultValue?: string\n): Promise<string> {\n return input({\n message,\n default: defaultValue,\n });\n}\n\n/**\n * Multi-select tool selection using checkbox UI.\n * Detected tools are pre-selected.\n */\nexport async function promptToolSelection(\n detectedTools: ToolDefinition[]\n): Promise<string[]> {\n const detectedIds = new Set(detectedTools.map((t) => t.id));\n\n const choices = SUPPORTED_TOOLS.map((tool) => {\n const isDetected = detectedIds.has(tool.id);\n return {\n name: `${tool.name}${isDetected ? ' (detected)' : ''}`,\n value: tool.id,\n checked: isDetected,\n };\n });\n\n const selected = await checkbox({\n message: 'Select AI coding tools for this project:',\n choices,\n pageSize: 10,\n });\n\n return selected;\n}\n\n/**\n * Simple yes/no confirmation.\n */\nexport async function promptConfirm(\n message: string,\n defaultValue: boolean = true\n): Promise<boolean> {\n return confirm({\n message,\n default: defaultValue,\n });\n}\n\n// \u2500\u2500\u2500 Styled Messages \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Display a styled colored message.\n */\nexport function printMessage(\n type: 'success' | 'error' | 'info' | 'warning',\n text: string\n): void {\n const icons: Record<string, string> = {\n success: '\u2705',\n error: '\u274C',\n info: '\u2139\uFE0F',\n warning: '\u26A0\uFE0F',\n };\n\n const colors: Record<string, string> = {\n success: GREEN,\n error: RED,\n info: CYAN,\n warning: YELLOW,\n };\n\n console.log(`${icons[type]} ${colors[type]}${text}${RESET}`);\n}\n"],
|
|
5
|
+
"mappings": ";;;;AAUA,SAAS,eAAe;AACxB,SAAS,SAAS,gBAAgB;;;ACJlC,SAAS,kBAAkB;AAC3B,SAAS,QAAAA,aAAY;;;ACad,IAAM,kBAAoC;AAAA,EAC/C;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,gBAAgB,CAAC,WAAW,yBAAyB,6BAA6B;AAAA,EACpF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,gBAAgB,CAAC,aAAa,uBAAuB;AAAA,EACvD;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,gBAAgB,CAAC,WAAW,gBAAgB,eAAe;AAAA,EAC7D;AACF;AAYO,SAAS,sBAAgC;AAC9C,SAAO,gBAAgB,IAAI,CAAC,MAAM,EAAE,EAAE;AACxC;AAuBO,IAAM,SAA4B;AAAA,EACvC;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,OAAO;AAAA,IACP,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,OAAO;AAAA,IACP,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,OAAO;AAAA,IACP,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,OAAO;AAAA,IACP,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,OAAO;AAAA,IACP,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,IACP,OAAO;AAAA,IACP,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AACF;AAYO,SAAS,mBAAsC;AACpD,SAAO,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACrD;;;ACtJA,SAAS,WAAW,qBAAqB;AACzC,SAAS,MAAM,eAAe;;;ACGvB,IAAM,gBAAoC;AAAA,EAC/C,QAAQ;AAAA,EAER,aAAa,SAAyB;AACpC,WAAO,kBAAkB,OAAO;AAAA,EAClC;AAAA,EAEA,eAAe,SAAyB;AAEtC,WAAO,4BAA4B,OAAO;AAAA,EAC5C;AAAA,EAEA,YAAY,SAAiC;AAC3C,UAAM,cAAc;AAAA,MAClB;AAAA,MACA,SAAS,QAAQ,EAAE;AAAA,MACnB,gBAAgB,QAAQ,WAAW;AAAA,MACnC,aAAa,QAAQ,QAAQ;AAAA,MAC7B,UAAU,QAAQ,KAAK,KAAK,IAAI,CAAC;AAAA,MACjC;AAAA,IACF,EAAE,KAAK,IAAI;AAEX,WAAO,GAAG,WAAW;AAAA;AAAA,EAAO,QAAQ,IAAI;AAAA,EAC1C;AAAA,EAEA,cAAc,SAAiC;AAE7C,UAAM,cAAc;AAAA,MAClB;AAAA,MACA,SAAS,QAAQ,EAAE;AAAA,MACnB,gBAAgB,QAAQ,WAAW;AAAA,MACnC,aAAa,QAAQ,QAAQ;AAAA,MAC7B,UAAU,QAAQ,KAAK,KAAK,IAAI,CAAC;AAAA,MACjC;AAAA,IACF,EAAE,KAAK,IAAI;AAEX,WAAO,GAAG,WAAW;AAAA;AAAA,EAAO,QAAQ,IAAI;AAAA,EAC1C;AACF;;;ACrCO,IAAM,kBAAsC;AAAA,EACjD,QAAQ;AAAA,EAER,aAAa,SAAyB;AACpC,WAAO,oBAAoB,OAAO;AAAA,EACpC;AAAA,EAEA,eAAe,SAAyB;AAEtC,WAAO,sBAAsB,OAAO;AAAA,EACtC;AAAA,EAEA,YAAY,SAAiC;AAC3C,UAAM,cAAc;AAAA,MAClB;AAAA,MACA,SAAS,QAAQ,EAAE;AAAA,MACnB,gBAAgB,QAAQ,WAAW;AAAA,MACnC,aAAa,QAAQ,QAAQ;AAAA,MAC7B,UAAU,QAAQ,KAAK,KAAK,IAAI,CAAC;AAAA,MACjC;AAAA,IACF,EAAE,KAAK,IAAI;AAEX,WAAO,GAAG,WAAW;AAAA;AAAA,EAAO,QAAQ,IAAI;AAAA,EAC1C;AAAA,EAEA,cAAc,SAAiC;AAC7C,UAAM,cAAc;AAAA,MAClB;AAAA,MACA,SAAS,QAAQ,EAAE;AAAA,MACnB,gBAAgB,QAAQ,WAAW;AAAA,MACnC,aAAa,QAAQ,QAAQ;AAAA,MAC7B,UAAU,QAAQ,KAAK,KAAK,IAAI,CAAC;AAAA,MACjC;AAAA,IACF,EAAE,KAAK,IAAI;AAEX,WAAO,GAAG,WAAW;AAAA;AAAA,EAAO,QAAQ,IAAI;AAAA,EAC1C;AACF;;;ACtCO,IAAM,gBAAoC;AAAA,EAC/C,QAAQ;AAAA,EAER,aAAa,SAAyB;AACpC,WAAO,kBAAkB,OAAO;AAAA,EAClC;AAAA,EAEA,eAAe,SAAyB;AACtC,WAAO,oBAAoB,OAAO;AAAA,EACpC;AAAA,EAEA,YAAY,SAAiC;AAC3C,UAAM,cAAc;AAAA,MAClB;AAAA,MACA,SAAS,QAAQ,EAAE;AAAA,MACnB,gBAAgB,QAAQ,WAAW;AAAA,MACnC,aAAa,QAAQ,QAAQ;AAAA,MAC7B,UAAU,QAAQ,KAAK,KAAK,IAAI,CAAC;AAAA,MACjC;AAAA,IACF,EAAE,KAAK,IAAI;AAEX,WAAO,GAAG,WAAW;AAAA;AAAA,EAAO,QAAQ,IAAI;AAAA,EAC1C;AAAA,EAEA,cAAc,SAAiC;AAC7C,UAAM,cAAc;AAAA,MAClB;AAAA,MACA,SAAS,QAAQ,EAAE;AAAA,MACnB,gBAAgB,QAAQ,WAAW;AAAA,MACnC,aAAa,QAAQ,QAAQ;AAAA,MAC7B,UAAU,QAAQ,KAAK,KAAK,IAAI,CAAC;AAAA,MACjC;AAAA,IACF,EAAE,KAAK,IAAI;AAEX,WAAO,GAAG,WAAW;AAAA;AAAA,EAAO,QAAQ,IAAI;AAAA,EAC1C;AACF;;;ACpCA,IAAM,YAAY,oBAAI,IAAgC;AAGtD,IAAM,YAAkC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF;AAEA,WAAW,WAAW,WAAW;AAC/B,MAAI,UAAU,IAAI,QAAQ,MAAM,GAAG;AACjC,UAAM,IAAI,MAAM,iCAAiC,QAAQ,MAAM,EAAE;AAAA,EACnE;AACA,YAAU,IAAI,QAAQ,QAAQ,OAAO;AACvC;AAMO,SAAS,WAAW,QAAoC;AAC7D,QAAM,UAAU,UAAU,IAAI,MAAM;AACpC,MAAI,CAAC,SAAS;AACZ,UAAM,YAAY,MAAM,KAAK,UAAU,KAAK,CAAC,EAAE,KAAK,IAAI;AACxD,UAAM,IAAI;AAAA,MACR,mCAAmC,MAAM,uBAAuB,SAAS;AAAA,IAC3E;AAAA,EACF;AACA,SAAO;AACT;;;ACxBO,SAAS,yBACd,aACA,gBACA,SACQ;AACR,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,KAAK,GAAG,EAAE,MAAM,GAAG,EAAE;AAClE,QAAM,WAAW,QAAQ,KAAK,IAAI;AAElC,SAAO,+BAAgB,WAAW;AAAA;AAAA;AAAA;AAAA,kCAI3B,GAAG;AAAA,8BACG,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAQhB,WAAW;AAAA,+BACb,GAAG;AAAA,2BACG,cAAc;AAAA,+BACpB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CnB;;;AL3DA,IAAM,wBAAwB,oBAAI,IAA6B;AAKxD,SAAS,sBAAsB,SAAiB,YAAmC;AACxF,wBAAsB,IAAI,SAAS,UAAU;AAC/C;AAYO,SAAS,qBAAqB,OAAwC;AAC3E,QAAM,aAAa,sBAAsB,IAAI,MAAM,EAAE;AACrD,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,qCAAqC,MAAM,EAAE,EAAE;AAAA,EACjE;AAEA,QAAM,OAAO,WAAW;AAExB,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,MAAM,MAAM;AAAA,IACZ,aAAa,MAAM;AAAA,IACnB,UAAU,MAAM;AAAA,IAChB,MAAM,CAAC,WAAW,OAAO,MAAM,UAAU,YAAY,kBAAkB,YAAY;AAAA,IACnF;AAAA,EACF;AACF;AASO,SAAS,mBACd,aACA,SACuC;AACvC,QAAM,SAAS,iBAAiB;AAChC,QAAM,UAAiD,CAAC;AAExD,aAAW,UAAU,SAAS;AAC5B,UAAM,UAAU,WAAW,MAAM;AACjC,UAAM,eAAyB,CAAC;AAEhC,eAAW,SAAS,QAAQ;AAC1B,YAAM,UAAU,qBAAqB,KAAK;AAG1C,YAAM,YAAY,KAAK,aAAa,QAAQ,aAAa,MAAM,EAAE,CAAC;AAClE,gBAAU,KAAK,WAAW,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,oBAAc,WAAW,QAAQ,YAAY,OAAO,GAAG,OAAO;AAC9D,mBAAa,KAAK,QAAQ,aAAa,MAAM,EAAE,CAAC;AAGhD,YAAM,cAAc,KAAK,aAAa,QAAQ,eAAe,MAAM,EAAE,CAAC;AACtE,gBAAU,KAAK,aAAa,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACtD,oBAAc,aAAa,QAAQ,cAAc,OAAO,GAAG,OAAO;AAClE,mBAAa,KAAK,QAAQ,eAAe,MAAM,EAAE,CAAC;AAAA,IACpD;AAEA,YAAQ,KAAK,EAAE,QAAQ,OAAO,aAAa,CAAC;AAAA,EAC9C;AAEA,SAAO;AACT;AAMO,IAAM,cAAc;AAKpB,SAAS,sBACd,aACA,SACA,SACA,aACQ;AACR,QAAM,SAAS;AAAA,IACb;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAEA,QAAM,aAAa,KAAK,aAAa,WAAW;AAChD,YAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AACzC,QAAM,aAAa,KAAK,YAAY,cAAc;AAClD,gBAAc,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,MAAM,OAAO;AACzE,SAAO;AACT;AAMO,SAAS,kBACd,aACA,aACA,gBACA,SACQ;AACR,QAAM,SAAS,KAAK,aAAa,QAAQ,WAAW,YAAY;AAChE,YAAU,QAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAM,UAAU,yBAAyB,aAAa,gBAAgB,OAAO;AAC7E,gBAAc,QAAQ,SAAS,OAAO;AACtC,SAAO;AACT;;;AM3IA,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+Td,SAAS,WAAiB;AAC/B,wBAAsB,mBAAmB,MAAM,YAAY;AAC7D;;;AChUA,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsXX,SAASC,YAAiB;AAC/B,wBAAsB,gBAAgB,MAAM,SAAS;AACvD;;;ACzXA,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmbb,SAASC,YAAiB;AAC/B,wBAAsB,kBAAkB,MAAM,WAAW;AAC3D;;;ACtbA,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuYZ,SAASC,YAAiB;AAC/B,wBAAsB,iBAAiB,MAAM,UAAU;AACzD;;;ACzYA,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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",
|
|
6
|
+
"names": ["join", "register", "register", "register", "register", "register", "register", "join"]
|
|
7
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sparrow-ddd",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Sparrow — spec-driven DDD framework for AI coding assistants. Generate structured skills that guide AI agents through domain-driven design, from business requirements to production code.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"sparrow": "./bin/sparrow.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"bin/",
|
|
11
|
+
"dist/",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "node build.js",
|
|
17
|
+
"dev": "node --import tsx src/cli/index.ts",
|
|
18
|
+
"clean": "rm -rf dist bin/sparrow.js",
|
|
19
|
+
"prepublishOnly": "npm run build",
|
|
20
|
+
"typecheck": "tsc --noEmit"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"ddd",
|
|
24
|
+
"domain-driven-design",
|
|
25
|
+
"spec-driven-development",
|
|
26
|
+
"ai-coding",
|
|
27
|
+
"claude-code",
|
|
28
|
+
"opencode",
|
|
29
|
+
"cursor",
|
|
30
|
+
"architecture",
|
|
31
|
+
"code-generation"
|
|
32
|
+
],
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "https://github.com/agiledon/sparrow"
|
|
36
|
+
},
|
|
37
|
+
"author": "agiledon",
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=18.0.0"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@inquirer/prompts": "^7.0.0",
|
|
44
|
+
"commander": "^13.1.0",
|
|
45
|
+
"js-yaml": "^4.1.0"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@types/node": "^22.0.0",
|
|
49
|
+
"@types/js-yaml": "^4.0.9",
|
|
50
|
+
"esbuild": "^0.25.0",
|
|
51
|
+
"tsx": "^4.19.0",
|
|
52
|
+
"typescript": "^5.7.0"
|
|
53
|
+
}
|
|
54
|
+
}
|