@zhuan-ai/zhuanspec 2.0.0 → 2.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.zh.md +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/commands/artifact-workflow.js +22 -2
- package/dist/commands/validate.d.ts +5 -0
- package/dist/commands/validate.js +65 -3
- package/dist/core/skill-discovery.d.ts +2 -2
- package/dist/core/skill-discovery.js +16 -3
- package/dist/core/task-graph/index.d.ts +2 -0
- package/dist/core/task-graph/index.js +2 -0
- package/dist/core/task-graph/mermaid-renderer.d.ts +22 -0
- package/dist/core/task-graph/mermaid-renderer.js +128 -0
- package/dist/core/templates/agents-template.d.ts +1 -1
- package/dist/core/templates/agents-template.js +23 -0
- package/dist/core/templates/skill-templates.js +42 -0
- package/dist/core/templates/slash-command-templates.js +25 -2
- package/dist/core/templates/tasks-template.d.ts +23 -0
- package/dist/core/templates/tasks-template.js +79 -0
- package/dist/core/templates/tdd-tasks-template.d.ts +24 -0
- package/dist/core/templates/tdd-tasks-template.js +116 -0
- package/dist/core/validation/strict-rules.d.ts +60 -0
- package/dist/core/validation/strict-rules.js +287 -0
- package/dist/core/validation/types.d.ts +10 -0
- package/dist/core/validation/validator.d.ts +5 -0
- package/dist/core/validation/validator.js +103 -1
- package/package.json +22 -20
package/README.zh.md
CHANGED
|
@@ -415,7 +415,7 @@ npm install -g ./distributions/fission-ai-zhuanspec-1.0.0.tgz
|
|
|
415
415
|
|
|
416
416
|
1. **升级包**
|
|
417
417
|
```bash
|
|
418
|
-
npm install -g @
|
|
418
|
+
npm install -g @zhuan-ai/zhuanspec@latest
|
|
419
419
|
```
|
|
420
420
|
2. **刷新代理说明**
|
|
421
421
|
- 在每个项目内运行 `zhuanspec update` 以重新生成 AI 指导并确保最新的斜杠命令处于活动状态。
|
package/dist/cli/index.js
CHANGED
|
@@ -227,7 +227,7 @@ skillsCmd
|
|
|
227
227
|
.option('--json', 'Output as JSON for programmatic use')
|
|
228
228
|
.action(async (options) => {
|
|
229
229
|
try {
|
|
230
|
-
const skills = discoverSkills();
|
|
230
|
+
const skills = discoverSkills(process.cwd());
|
|
231
231
|
console.log(formatSkillsList(skills, !!options?.json));
|
|
232
232
|
}
|
|
233
233
|
catch (error) {
|
|
@@ -13,7 +13,7 @@ import { createChange, validateChangeName } from '../utils/change-utils.js';
|
|
|
13
13
|
import { discoverSkills } from '../core/skill-discovery.js';
|
|
14
14
|
import { getNewChangeSkillTemplate, getContinueChangeSkillTemplate, getApplyChangeSkillTemplate, getFfChangeSkillTemplate, getSyncSpecsSkillTemplate, getArchiveChangeSkillTemplate, getProposeChangeSkillTemplate, getExploreSkillTemplate, getVerifySkillTemplate, getOpsxNewCommandTemplate, getOpsxContinueCommandTemplate, getOpsxApplyCommandTemplate, getOpsxFfCommandTemplate, getOpsxSyncCommandTemplate, getOpsxArchiveCommandTemplate, getOpsxProposeCommandTemplate, getOpsxExploreCommandTemplate, getOpsxVerifyCommandTemplate } from '../core/templates/skill-templates.js';
|
|
15
15
|
import { FileSystemUtils } from '../utils/file-system.js';
|
|
16
|
-
import { parseTasks, generateExecutionPlan, renderExecutionPlanXml, hasDependsAnnotations, } from '../core/task-graph/index.js';
|
|
16
|
+
import { parseTasks, generateExecutionPlan, renderExecutionPlanXml, renderMermaidDiagram, hasDependsAnnotations, } from '../core/task-graph/index.js';
|
|
17
17
|
const DEFAULT_SCHEMA = 'spec-driven';
|
|
18
18
|
/**
|
|
19
19
|
* Checks if color output is disabled via NO_COLOR env or --no-color flag.
|
|
@@ -177,7 +177,7 @@ async function instructionsCommand(artifactId, options) {
|
|
|
177
177
|
let discoveredSkillsJson;
|
|
178
178
|
if (artifactId === 'tasks' || artifactId === 'proposal') {
|
|
179
179
|
try {
|
|
180
|
-
const skills =
|
|
180
|
+
const skills = discoverSkills(projectRoot);
|
|
181
181
|
if (skills.length > 0) {
|
|
182
182
|
discoveredSkillsJson = JSON.stringify(skills.map((s) => ({ name: s.name, description: s.description })), null, 2);
|
|
183
183
|
}
|
|
@@ -427,6 +427,26 @@ async function generateApplyInstructions(projectRoot, changeName, schemaName) {
|
|
|
427
427
|
if (hasDependencies && !allTasksComplete) {
|
|
428
428
|
const executionPlan = generateExecutionPlan(parsedTasks);
|
|
429
429
|
executionPlanXml = renderExecutionPlanXml(executionPlan);
|
|
430
|
+
// Generate Mermaid diagram and embed in tasks.md
|
|
431
|
+
if (executionPlan && !executionPlan.hasCycle) {
|
|
432
|
+
const mermaidSection = renderMermaidDiagram(executionPlan, parsedTasks);
|
|
433
|
+
if (mermaidSection) {
|
|
434
|
+
// Read current tasks.md content
|
|
435
|
+
let currentTasksContent = tasksContent;
|
|
436
|
+
// Check if tasks.md already has Workflow Diagram section
|
|
437
|
+
const workflowDiagramRegex = /## Workflow Diagram[\s\S]*?(?=\n## |$)/;
|
|
438
|
+
if (workflowDiagramRegex.test(currentTasksContent)) {
|
|
439
|
+
// Replace existing Workflow Diagram section
|
|
440
|
+
currentTasksContent = currentTasksContent.replace(workflowDiagramRegex, mermaidSection);
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
// Append to file end
|
|
444
|
+
currentTasksContent = currentTasksContent.trimEnd() + '\n\n' + mermaidSection;
|
|
445
|
+
}
|
|
446
|
+
// Write back to tasks.md
|
|
447
|
+
fs.writeFileSync(tracksPath, currentTasksContent, 'utf-8');
|
|
448
|
+
}
|
|
449
|
+
}
|
|
430
450
|
}
|
|
431
451
|
}
|
|
432
452
|
}
|
|
@@ -27,6 +27,11 @@ export declare class ValidateCommand {
|
|
|
27
27
|
* Print execution plan summary for tasks with dependencies.
|
|
28
28
|
*/
|
|
29
29
|
private printExecutionPlanSummary;
|
|
30
|
+
/**
|
|
31
|
+
* Write Mermaid diagram to tasks.md file.
|
|
32
|
+
* Replaces existing "## Workflow Diagram" section or appends at end.
|
|
33
|
+
*/
|
|
34
|
+
private writeMermaidDiagramToTasks;
|
|
30
35
|
private runBulkValidation;
|
|
31
36
|
}
|
|
32
37
|
export {};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import ora from 'ora';
|
|
2
2
|
import path from 'path';
|
|
3
|
+
import chalk from 'chalk';
|
|
3
4
|
import { promises as fs } from 'fs';
|
|
4
5
|
import { Validator } from '../core/validation/validator.js';
|
|
5
6
|
import { isInteractive, resolveNoInteractive } from '../utils/interactive.js';
|
|
@@ -111,8 +112,12 @@ export class ValidateCommand {
|
|
|
111
112
|
report.issues.push(...taskReport.issues);
|
|
112
113
|
report.valid = report.valid && taskReport.valid;
|
|
113
114
|
}
|
|
115
|
+
// Write Mermaid diagram to tasks.md if generated
|
|
116
|
+
if (report.mermaidDiagram) {
|
|
117
|
+
await this.writeMermaidDiagramToTasks(changeDir, report.mermaidDiagram);
|
|
118
|
+
}
|
|
114
119
|
const durationMs = Date.now() - start;
|
|
115
|
-
this.printReport('change', id, report, durationMs, opts.json, taskReport);
|
|
120
|
+
this.printReport('change', id, report, durationMs, opts.json, taskReport, { strict: opts.strict });
|
|
116
121
|
// Non-zero exit if invalid (keeps enriched output test semantics)
|
|
117
122
|
process.exitCode = report.valid ? 0 : 1;
|
|
118
123
|
return;
|
|
@@ -121,10 +126,10 @@ export class ValidateCommand {
|
|
|
121
126
|
const start = Date.now();
|
|
122
127
|
const report = await validator.validateSpec(file);
|
|
123
128
|
const durationMs = Date.now() - start;
|
|
124
|
-
this.printReport('spec', id, report, durationMs, opts.json);
|
|
129
|
+
this.printReport('spec', id, report, durationMs, opts.json, undefined, { strict: opts.strict });
|
|
125
130
|
process.exitCode = report.valid ? 0 : 1;
|
|
126
131
|
}
|
|
127
|
-
printReport(type, id, report, durationMs, json, taskReport) {
|
|
132
|
+
printReport(type, id, report, durationMs, json, taskReport, opts) {
|
|
128
133
|
if (json) {
|
|
129
134
|
const out = {
|
|
130
135
|
items: [{ id, type, valid: report.valid, issues: report.issues, durationMs }],
|
|
@@ -135,6 +140,14 @@ export class ValidateCommand {
|
|
|
135
140
|
if (taskReport?.hasDependencies && taskReport.executionPlan) {
|
|
136
141
|
out.executionPlan = taskReport.executionPlan;
|
|
137
142
|
}
|
|
143
|
+
// Add strict checks to JSON output if available
|
|
144
|
+
if (report.strictChecks) {
|
|
145
|
+
out.strictChecks = report.strictChecks;
|
|
146
|
+
}
|
|
147
|
+
// Add mermaid diagram flag to JSON output if generated
|
|
148
|
+
if (report.mermaidDiagram) {
|
|
149
|
+
out.workflowDiagramGenerated = true;
|
|
150
|
+
}
|
|
138
151
|
console.log(JSON.stringify(out, null, 2));
|
|
139
152
|
return;
|
|
140
153
|
}
|
|
@@ -144,6 +157,10 @@ export class ValidateCommand {
|
|
|
144
157
|
if (taskReport?.hasDependencies && taskReport.executionPlan && !taskReport.executionPlan.hasCycle) {
|
|
145
158
|
this.printExecutionPlanSummary(taskReport.executionPlan);
|
|
146
159
|
}
|
|
160
|
+
// Print Mermaid diagram generated message
|
|
161
|
+
if (report.mermaidDiagram) {
|
|
162
|
+
console.log(' Workflow diagram generated');
|
|
163
|
+
}
|
|
147
164
|
}
|
|
148
165
|
else {
|
|
149
166
|
console.error(`${type === 'change' ? 'Change' : 'Specification'} '${id}' has issues`);
|
|
@@ -154,6 +171,21 @@ export class ValidateCommand {
|
|
|
154
171
|
}
|
|
155
172
|
this.printNextSteps(type);
|
|
156
173
|
}
|
|
174
|
+
// Print strict mode checks summary if available
|
|
175
|
+
if (opts?.strict && report.strictChecks && report.strictChecks.length > 0) {
|
|
176
|
+
console.log('');
|
|
177
|
+
console.log('Strict Mode Checks:');
|
|
178
|
+
for (const check of report.strictChecks) {
|
|
179
|
+
if (check.passed) {
|
|
180
|
+
console.log(` ${chalk.green('✓')} ${check.ruleName}`);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
const firstError = check.errors[0] || check.warnings[0] || '';
|
|
184
|
+
const errorSuffix = firstError ? ` — ${firstError}` : '';
|
|
185
|
+
console.log(` ${chalk.red('✗')} ${check.ruleName}${errorSuffix}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
157
189
|
}
|
|
158
190
|
printNextSteps(type) {
|
|
159
191
|
const bullets = [];
|
|
@@ -243,6 +275,36 @@ export class ValidateCommand {
|
|
|
243
275
|
console.log(` Wave ${wave.wave}: [${taskIds}]${parallelLabel}`);
|
|
244
276
|
}
|
|
245
277
|
}
|
|
278
|
+
/**
|
|
279
|
+
* Write Mermaid diagram to tasks.md file.
|
|
280
|
+
* Replaces existing "## Workflow Diagram" section or appends at end.
|
|
281
|
+
*/
|
|
282
|
+
async writeMermaidDiagramToTasks(changeDir, mermaidDiagram) {
|
|
283
|
+
const tasksFile = path.join(changeDir, 'tasks.md');
|
|
284
|
+
let content;
|
|
285
|
+
try {
|
|
286
|
+
content = await fs.readFile(tasksFile, 'utf-8');
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
// tasks.md doesn't exist, nothing to write to
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
// Pattern to match existing "## Workflow Diagram" section
|
|
293
|
+
const workflowSectionPattern = /^## Workflow Diagram[\s\S]*?(?=^## |\z)/gm;
|
|
294
|
+
// Check if section exists
|
|
295
|
+
const hasExistingSection = workflowSectionPattern.test(content);
|
|
296
|
+
workflowSectionPattern.lastIndex = 0; // Reset regex state
|
|
297
|
+
let newContent;
|
|
298
|
+
if (hasExistingSection) {
|
|
299
|
+
// Replace existing section
|
|
300
|
+
newContent = content.replace(workflowSectionPattern, mermaidDiagram + '\n\n');
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
// Append at end
|
|
304
|
+
newContent = content.trimEnd() + '\n\n' + mermaidDiagram + '\n';
|
|
305
|
+
}
|
|
306
|
+
await fs.writeFile(tasksFile, newContent, 'utf-8');
|
|
307
|
+
}
|
|
246
308
|
async runBulkValidation(scope, opts) {
|
|
247
309
|
const spinner = !opts.json && !opts.noInteractive ? ora('Validating...').start() : undefined;
|
|
248
310
|
const [changeIds, specIds] = await Promise.all([
|
|
@@ -13,10 +13,10 @@ export interface DiscoveredSkill {
|
|
|
13
13
|
* Discover available skills by scanning priority paths.
|
|
14
14
|
* Uses short-circuit strategy: once a non-empty directory is found, stops scanning.
|
|
15
15
|
*
|
|
16
|
-
* @param
|
|
16
|
+
* @param projectRoot - Project root path for scanning project-local skills directory
|
|
17
17
|
* @returns Array of discovered skills
|
|
18
18
|
*/
|
|
19
|
-
export declare function discoverSkills(
|
|
19
|
+
export declare function discoverSkills(projectRoot?: string): DiscoveredSkill[];
|
|
20
20
|
/**
|
|
21
21
|
* Format discovered skills for display.
|
|
22
22
|
*/
|
|
@@ -73,15 +73,28 @@ function findSkillFiles(dir) {
|
|
|
73
73
|
}
|
|
74
74
|
return results;
|
|
75
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Build the list of paths to scan for skills.
|
|
78
|
+
* Project-local skills directory is scanned first if projectRoot is provided.
|
|
79
|
+
*/
|
|
80
|
+
function buildScanPaths(projectRoot) {
|
|
81
|
+
const paths = [];
|
|
82
|
+
if (projectRoot) {
|
|
83
|
+
paths.push(path.join(projectRoot, 'skills'));
|
|
84
|
+
}
|
|
85
|
+
paths.push(...SCAN_PRIORITY);
|
|
86
|
+
return paths;
|
|
87
|
+
}
|
|
76
88
|
/**
|
|
77
89
|
* Discover available skills by scanning priority paths.
|
|
78
90
|
* Uses short-circuit strategy: once a non-empty directory is found, stops scanning.
|
|
79
91
|
*
|
|
80
|
-
* @param
|
|
92
|
+
* @param projectRoot - Project root path for scanning project-local skills directory
|
|
81
93
|
* @returns Array of discovered skills
|
|
82
94
|
*/
|
|
83
|
-
export function discoverSkills(
|
|
84
|
-
|
|
95
|
+
export function discoverSkills(projectRoot) {
|
|
96
|
+
const scanPaths = buildScanPaths(projectRoot);
|
|
97
|
+
for (const scanPath of scanPaths) {
|
|
85
98
|
const resolved = resolvePath(scanPath);
|
|
86
99
|
// Check if directory exists
|
|
87
100
|
try {
|
|
@@ -8,4 +8,6 @@ export { parseTasks } from './task-parser.js';
|
|
|
8
8
|
export { TaskGraph, type ValidationResult } from './task-graph.js';
|
|
9
9
|
export { generateExecutionPlan } from './execution-planner.js';
|
|
10
10
|
export { renderExecutionPlanXml, hasDependsAnnotations } from './xml-renderer.js';
|
|
11
|
+
export { renderMermaidDiagram } from './mermaid-renderer.js';
|
|
12
|
+
export type { MermaidRenderOptions } from './mermaid-renderer.js';
|
|
11
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -11,4 +11,6 @@ export { TaskGraph } from './task-graph.js';
|
|
|
11
11
|
export { generateExecutionPlan } from './execution-planner.js';
|
|
12
12
|
// XML Renderer
|
|
13
13
|
export { renderExecutionPlanXml, hasDependsAnnotations } from './xml-renderer.js';
|
|
14
|
+
// Mermaid Renderer
|
|
15
|
+
export { renderMermaidDiagram } from './mermaid-renderer.js';
|
|
14
16
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mermaid Renderer for Execution Plan
|
|
3
|
+
*
|
|
4
|
+
* Renders ExecutionPlan to Mermaid flowchart format for visualization in tasks.md.
|
|
5
|
+
*/
|
|
6
|
+
import type { ExecutionPlan, ParsedTask } from './types.js';
|
|
7
|
+
export interface MermaidRenderOptions {
|
|
8
|
+
/** Maximum parallelism threshold. Default: 3 */
|
|
9
|
+
maxParallelism?: number;
|
|
10
|
+
/** Whether to show @skill annotations in node labels. Default: true */
|
|
11
|
+
showSkills?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Renders an ExecutionPlan to Mermaid flowchart format.
|
|
15
|
+
*
|
|
16
|
+
* @param plan - The execution plan to render
|
|
17
|
+
* @param tasks - The parsed tasks (used for task details)
|
|
18
|
+
* @param options - Render options
|
|
19
|
+
* @returns Complete markdown section with Mermaid diagram
|
|
20
|
+
*/
|
|
21
|
+
export declare function renderMermaidDiagram(plan: ExecutionPlan, tasks: ParsedTask[], options?: MermaidRenderOptions): string;
|
|
22
|
+
//# sourceMappingURL=mermaid-renderer.d.ts.map
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mermaid Renderer for Execution Plan
|
|
3
|
+
*
|
|
4
|
+
* Renders ExecutionPlan to Mermaid flowchart format for visualization in tasks.md.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Escapes special Mermaid characters in a string.
|
|
8
|
+
* Mermaid uses quotes, brackets, and other characters that need escaping.
|
|
9
|
+
*/
|
|
10
|
+
function escapeMermaid(str) {
|
|
11
|
+
return str
|
|
12
|
+
.replace(/"/g, '#quot;')
|
|
13
|
+
.replace(/\[/g, '#91;')
|
|
14
|
+
.replace(/\]/g, '#93;')
|
|
15
|
+
.replace(/\(/g, '#40;')
|
|
16
|
+
.replace(/\)/g, '#41;')
|
|
17
|
+
.replace(/</g, '#lt;')
|
|
18
|
+
.replace(/>/g, '#gt;')
|
|
19
|
+
.replace(/\{/g, '#123;')
|
|
20
|
+
.replace(/\}/g, '#125;')
|
|
21
|
+
.replace(/\|/g, '#124;');
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Converts a task ID to a valid Mermaid node ID.
|
|
25
|
+
* Mermaid node IDs cannot contain dots or hyphens.
|
|
26
|
+
*
|
|
27
|
+
* Example: "1.1" -> "T1_1", "2.3" -> "T2_3"
|
|
28
|
+
*/
|
|
29
|
+
function toNodeId(taskId) {
|
|
30
|
+
return 'T' + taskId.replace(/\./g, '_').replace(/-/g, '_');
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Truncates a string to a maximum length, appending "..." if truncated.
|
|
34
|
+
*/
|
|
35
|
+
function truncate(str, maxLength) {
|
|
36
|
+
if (str.length <= maxLength) {
|
|
37
|
+
return str;
|
|
38
|
+
}
|
|
39
|
+
return str.slice(0, maxLength) + '...';
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Generates the wave subtitle based on task count and max parallelism.
|
|
43
|
+
*/
|
|
44
|
+
function getWaveSubtitle(taskCount, maxParallelism) {
|
|
45
|
+
if (taskCount === 1) {
|
|
46
|
+
return '串行';
|
|
47
|
+
}
|
|
48
|
+
if (taskCount <= maxParallelism) {
|
|
49
|
+
return `并行度: ${taskCount}`;
|
|
50
|
+
}
|
|
51
|
+
// Calculate batch count: ceil(taskCount / maxParallelism)
|
|
52
|
+
const batchCount = Math.ceil(taskCount / maxParallelism);
|
|
53
|
+
return `并行度: ${taskCount}, 建议分批: ${batchCount}批`;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Renders a single task node label.
|
|
57
|
+
*/
|
|
58
|
+
function renderNodeLabel(task, showSkills) {
|
|
59
|
+
const truncatedDesc = truncate(task.description, 30);
|
|
60
|
+
let label = `${task.id} ${truncatedDesc}`;
|
|
61
|
+
if (showSkills && task.skills.length > 0) {
|
|
62
|
+
// Show first skill
|
|
63
|
+
label += `\\n@skill:${task.skills[0]}`;
|
|
64
|
+
}
|
|
65
|
+
return escapeMermaid(label);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Renders an ExecutionPlan to Mermaid flowchart format.
|
|
69
|
+
*
|
|
70
|
+
* @param plan - The execution plan to render
|
|
71
|
+
* @param tasks - The parsed tasks (used for task details)
|
|
72
|
+
* @param options - Render options
|
|
73
|
+
* @returns Complete markdown section with Mermaid diagram
|
|
74
|
+
*/
|
|
75
|
+
export function renderMermaidDiagram(plan, tasks, options) {
|
|
76
|
+
const maxParallelism = options?.maxParallelism ?? 3;
|
|
77
|
+
const showSkills = options?.showSkills ?? true;
|
|
78
|
+
// Handle error cases - return empty string for cycle
|
|
79
|
+
if (plan.hasCycle) {
|
|
80
|
+
return '';
|
|
81
|
+
}
|
|
82
|
+
// Handle empty plan (all tasks complete or no tasks)
|
|
83
|
+
if (plan.waves.length === 0) {
|
|
84
|
+
return '';
|
|
85
|
+
}
|
|
86
|
+
// Build task map for quick lookup
|
|
87
|
+
const taskMap = new Map();
|
|
88
|
+
for (const task of tasks) {
|
|
89
|
+
taskMap.set(task.id, task);
|
|
90
|
+
}
|
|
91
|
+
const lines = [];
|
|
92
|
+
// Markdown header with auto-generated notice
|
|
93
|
+
lines.push('## Workflow Diagram');
|
|
94
|
+
lines.push('');
|
|
95
|
+
lines.push('<!-- Auto-generated by zhuanspec validate. DO NOT edit manually. -->');
|
|
96
|
+
lines.push('');
|
|
97
|
+
lines.push('```mermaid');
|
|
98
|
+
lines.push('graph TD');
|
|
99
|
+
// Render each wave as a subgraph
|
|
100
|
+
for (const wave of plan.waves) {
|
|
101
|
+
const subtitle = getWaveSubtitle(wave.tasks.length, maxParallelism);
|
|
102
|
+
lines.push(` subgraph Wave${wave.wave}["Wave ${wave.wave} (${subtitle})"]`);
|
|
103
|
+
for (const task of wave.tasks) {
|
|
104
|
+
const nodeId = toNodeId(task.id);
|
|
105
|
+
const label = renderNodeLabel(task, showSkills);
|
|
106
|
+
lines.push(` ${nodeId}["${label}"]`);
|
|
107
|
+
}
|
|
108
|
+
lines.push(' end');
|
|
109
|
+
}
|
|
110
|
+
// Render dependency arrows after all subgraphs
|
|
111
|
+
// Arrow direction: from dependency -> to dependent (被依赖者 -> 依赖者)
|
|
112
|
+
for (const wave of plan.waves) {
|
|
113
|
+
for (const task of wave.tasks) {
|
|
114
|
+
for (const depId of task.depends) {
|
|
115
|
+
// Check if dependency exists in the plan (might be completed already)
|
|
116
|
+
const depTask = taskMap.get(depId);
|
|
117
|
+
if (depTask && !depTask.completed) {
|
|
118
|
+
const fromNode = toNodeId(depId);
|
|
119
|
+
const toNode = toNodeId(task.id);
|
|
120
|
+
lines.push(` ${fromNode} --> ${toNode}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
lines.push('```');
|
|
126
|
+
return lines.join('\n');
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=mermaid-renderer.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const agentsTemplate = "# ZhuanSpec \u4F7F\u7528\u8BF4\u660E\n\n\u9762\u5411\u4F7F\u7528 ZhuanSpec \u8FDB\u884C\u89C4\u8303\u9A71\u52A8\u5F00\u53D1\u7684 AI \u7F16\u7A0B\u52A9\u624B\u7684\u8BF4\u660E\u6587\u6863\u3002\n\n## \u5FEB\u901F\u68C0\u67E5\u6E05\u5355\n\n- \u641C\u7D22\u73B0\u6709\u5DE5\u4F5C\uFF1A`zhuanspec spec list --long`\u3001`zhuanspec list`\uFF08\u4EC5\u4F7F\u7528 `rg` \u8FDB\u884C\u5168\u6587\u641C\u7D22\uFF09\n- \u786E\u5B9A\u8303\u56F4\uFF1A\u65B0\u529F\u80FD vs \u4FEE\u6539\u73B0\u6709\u529F\u80FD\n- \u9009\u62E9\u552F\u4E00\u7684 `change-id`\uFF1Akebab-case \u683C\u5F0F\uFF0C\u52A8\u8BCD\u5F00\u5934\uFF08`add-`\u3001`update-`\u3001`remove-`\u3001`refactor-`\uFF09\n- \u642D\u5EFA\u7ED3\u6784\uFF1A`proposal.md`\u3001`tasks.md`\u3001`design.md`\uFF08\u4EC5\u5728\u9700\u8981\u65F6\uFF09\uFF0C\u4EE5\u53CA\u6BCF\u4E2A\u53D7\u5F71\u54CD\u529F\u80FD\u7684\u89C4\u8303\u589E\u91CF\n- \u7F16\u5199\u589E\u91CF\uFF1A\u4F7F\u7528 `## ADDED|MODIFIED|REMOVED|RENAMED Requirements`\uFF1B\u6BCF\u4E2A\u8981\u6C42\u81F3\u5C11\u5305\u542B\u4E00\u4E2A `#### Scenario:`\n- \u9A8C\u8BC1\uFF1A\u8FD0\u884C `zhuanspec validate [change-id] --strict` \u5E76\u4FEE\u590D\u95EE\u9898\n- \u8BF7\u6C42\u6279\u51C6\uFF1A\u5728\u63D0\u6848\u83B7\u5F97\u6279\u51C6\u4E4B\u524D\u4E0D\u8981\u5F00\u59CB\u5B9E\u65BD\n\n## \u4E09\u9636\u6BB5\u5DE5\u4F5C\u6D41\n\n### \u9636\u6BB5 1\uFF1A\u521B\u5EFA\u53D8\u66F4\n\u5728\u4EE5\u4E0B\u60C5\u51B5\u4E0B\u521B\u5EFA\u63D0\u6848\uFF1A\n- \u6DFB\u52A0\u529F\u80FD\u6216\u7279\u6027\n- \u8FDB\u884C\u7834\u574F\u6027\u66F4\u6539\uFF08API\u3001schema\uFF09\n- \u66F4\u6539\u67B6\u6784\u6216\u6A21\u5F0F\n- \u4F18\u5316\u6027\u80FD\uFF08\u6539\u53D8\u884C\u4E3A\uFF09\n- \u66F4\u65B0\u5B89\u5168\u6A21\u5F0F\n\n\u89E6\u53D1\u8BCD\u793A\u4F8B\uFF1A\n- \"\u5E2E\u6211\u521B\u5EFA\u4E00\u4E2A\u53D8\u66F4\u63D0\u6848\"\n- \"\u5E2E\u6211\u89C4\u5212\u4E00\u4E2A\u53D8\u66F4\"\n- \"\u5E2E\u6211\u521B\u5EFA\u4E00\u4E2A\u63D0\u6848\"\n- \"\u6211\u60F3\u521B\u5EFA\u4E00\u4E2A\u89C4\u8303\u63D0\u6848\"\n- \"\u6211\u60F3\u521B\u5EFA\u4E00\u4E2A\u89C4\u8303\"\n\n\u5BBD\u677E\u5339\u914D\u6307\u5BFC\uFF1A\n- \u5305\u542B\u4EE5\u4E0B\u4E4B\u4E00\uFF1A`proposal`\u3001`change`\u3001`spec`\n- \u4E0E\u4EE5\u4E0B\u4E4B\u4E00\u7EC4\u5408\uFF1A`create`\u3001`plan`\u3001`make`\u3001`start`\u3001`help`\n\n\u8DF3\u8FC7\u63D0\u6848\u7684\u60C5\u51B5\uFF1A\n- Bug \u4FEE\u590D\uFF08\u6062\u590D\u9884\u671F\u884C\u4E3A\uFF09\n- \u62FC\u5199\u9519\u8BEF\u3001\u683C\u5F0F\u3001\u6CE8\u91CA\n- \u4F9D\u8D56\u66F4\u65B0\uFF08\u975E\u7834\u574F\u6027\uFF09\n- \u914D\u7F6E\u66F4\u6539\n- \u73B0\u6709\u884C\u4E3A\u7684\u6D4B\u8BD5\n\n**\u5DE5\u4F5C\u6D41**\n0. \u5BA1\u67E5 `zhuanspec/project.md`\u3001`zhuanspec list` \u548C `zhuanspec list --specs` \u4EE5\u4E86\u89E3\u5F53\u524D\u4E0A\u4E0B\u6587\u3002\n1. **\u5F3A\u5236\u6F84\u6E05\u68C0\u67E5\uFF08\u5FC5\u987B\u9996\u5148\u6267\u884C\uFF09**\uFF1A\u5206\u6790\u7528\u6237\u8BF7\u6C42\uFF0C\u8BC6\u522B\u6240\u6709\u4E0D\u786E\u5B9A\u6216\u6A21\u7CCA\u7684\u65B9\u9762\uFF08\u8303\u56F4\u3001\u6280\u672F\u9009\u62E9\u3001\u5B9E\u73B0\u7EC6\u8282\u3001\u6570\u636E\u83B7\u53D6\u6765\u6E90\u3001\u670D\u52A1\u5206\u5C42\u3001\u4F9D\u8D56\u5173\u7CFB\u3001\u4F18\u5148\u7EA7\u3001\u9A8C\u6536\u6807\u51C6\u7B49......\uFF09\u3002\u5982\u679C\u53D1\u73B0\u4EFB\u4F55\u6A21\u7CCA\u4E4B\u5904\uFF0C\u5FC5\u987B\u505C\u6B62\u5E76\u4F7F\u7528**\u9009\u9879\u5F0F\u4EA4\u4E92**\uFF08\u5982 `AskQuestion` \u5DE5\u5177\uFF09\u63D0\u95EE\uFF0C\u83B7\u5F97\u660E\u786E\u7B54\u590D\u540E\u624D\u80FD\u7EE7\u7EED\u3002\u4E25\u7981\u5728\u4E0D\u786E\u5B9A\u7684\u60C5\u51B5\u4E0B\u81EA\u884C\u63A8\u6D4B\u6216\u521B\u5EFA\u63D0\u6848\uFF0C\u4E25\u7981\u8981\u6C42\u7528\u6237\u624B\u52A8\u8F93\u5165\u5927\u6BB5\u6587\u5B57\u3002\n2. \u9009\u62E9\u4E00\u4E2A\u552F\u4E00\u7684\u52A8\u8BCD\u5F00\u5934\u7684 `change-id`\uFF0C\u5E76\u5728 `zhuanspec/changes/<id>/` \u4E0B\u642D\u5EFA `proposal.md`\u3001`tasks.md`\u3001\u53EF\u9009\u7684 `design.md` \u548C\u89C4\u8303\u589E\u91CF\u3002\n3. \u4F7F\u7528 `## ADDED|MODIFIED|REMOVED Requirements` \u8D77\u8349\u89C4\u8303\u589E\u91CF\uFF0C\u6BCF\u4E2A\u8981\u6C42\u81F3\u5C11\u5305\u542B\u4E00\u4E2A `#### Scenario:`\u3002\n4. \u8FD0\u884C `zhuanspec validate <id> --strict` \u5E76\u5728\u5206\u4EAB\u63D0\u6848\u4E4B\u524D\u89E3\u51B3\u6240\u6709\u95EE\u9898\u3002\n\n### \u9636\u6BB5 2\uFF1A\u5B9E\u65BD\u53D8\u66F4\n\u5C06\u8FD9\u4E9B\u6B65\u9AA4\u4F5C\u4E3A\u5F85\u529E\u4E8B\u9879\u8DDF\u8E2A\uFF0C\u9010\u4E00\u5B8C\u6210\u3002\n1. **\u9605\u8BFB proposal.md** - \u4E86\u89E3\u8981\u6784\u5EFA\u7684\u5185\u5BB9\n2. **\u9605\u8BFB design.md**\uFF08\u5982\u679C\u5B58\u5728\uFF09 - \u5BA1\u67E5\u6280\u672F\u51B3\u7B56\n3. **\u9605\u8BFB tasks.md** - \u83B7\u53D6\u5B9E\u65BD\u6E05\u5355\n4. **\u6309\u987A\u5E8F\u5B9E\u65BD\u4EFB\u52A1** - \u6309\u987A\u5E8F\u5B8C\u6210\u3002\u5982\u679C\u4EFB\u52A1\u6807\u6CE8\u4E86 `@skill:<skill-name>`\uFF0C\u76F4\u63A5\u8C03\u7528\u5BF9\u5E94 skill\n5. **\u786E\u8BA4\u5B8C\u6210** - \u5728\u66F4\u65B0\u72B6\u6001\u4E4B\u524D\u786E\u4FDD `tasks.md` \u4E2D\u7684\u6BCF\u4E2A\u9879\u76EE\u90FD\u5DF2\u5B8C\u6210\n6. **\u66F4\u65B0\u6E05\u5355** - \u6240\u6709\u5DE5\u4F5C\u5B8C\u6210\u540E\uFF0C\u5C06\u6BCF\u4E2A\u4EFB\u52A1\u8BBE\u7F6E\u4E3A `- [x]`\uFF0C\u4EE5\u4FBF\u5217\u8868\u53CD\u6620\u5B9E\u9645\u60C5\u51B5\n7. **\u4EE3\u7801\u5BA1\u67E5**\uFF08\u53EF\u9009\uFF09 - \u57FA\u4E8E\u751F\u6210\u7684\u4E0A\u4E0B\u6587\u6587\u4EF6\u5BA1\u67E5\u5DF2\u5B9E\u65BD\u7684\u4EE3\u7801\uFF0C\u68C0\u67E5\uFF1A\n - \u4EE3\u7801\u89C4\u8303\u548C\u7EA6\u5B9A\u5408\u89C4\u6027\n - \u903B\u8F91\u6B63\u786E\u6027\n - \u6027\u80FD\u95EE\u9898\u548C\u6F5C\u5728\u74F6\u9888\n - \u5B89\u5168\u6027\u95EE\u9898\n - \u6700\u4F73\u5B9E\u8DF5\u9075\u5FAA\u60C5\u51B5\n - \u5BF9\u4E8E Java \u4EE3\u7801\uFF1A\u7279\u522B\u5173\u6CE8 Java \u7279\u5B9A\u7684\u6A21\u5F0F\u3001\u7EA6\u5B9A\u548C\u6F5C\u5728\u95EE\u9898\n - \u6B64\u6B65\u9AA4\u662F\u53EF\u9009\u7684\uFF0C\u5982\u679C\u8DF3\u8FC7\u4E0D\u4F1A\u963B\u585E\u5DE5\u4F5C\u6D41\n - \u5982\u679C\u53D1\u73B0\u95EE\u9898\uFF0C\u5E94\u5728\u5F52\u6863\u4E4B\u524D\u89E3\u51B3\n8. **\u6279\u51C6\u95E8\u69DB** - \u5728\u63D0\u6848\u7ECF\u8FC7\u5BA1\u67E5\u548C\u6279\u51C6\u4E4B\u524D\u4E0D\u8981\u5F00\u59CB\u5B9E\u65BD\n\n### \u9636\u6BB5 3\uFF1A\u5F52\u6863\u53D8\u66F4\n\u90E8\u7F72\u540E\uFF0C\u521B\u5EFA\u5355\u72EC\u7684 PR\uFF1A\n- \u5C06 `changes/[name]/` \u2192 `changes/archive/YYYY-MM-DD-[name]/`\n- \u5982\u679C\u529F\u80FD\u5DF2\u66F4\u6539\uFF0C\u66F4\u65B0 `specs/`\n- \u5BF9\u4E8E\u4EC5\u5DE5\u5177\u7C7B\u7684\u53D8\u66F4\uFF0C\u4F7F\u7528 `zhuanspec archive <change-id> --skip-specs --yes`\uFF08\u59CB\u7EC8\u663E\u5F0F\u4F20\u9012\u53D8\u66F4 ID\uFF09\n- \u8FD0\u884C `zhuanspec validate --strict` \u4EE5\u786E\u8BA4\u5F52\u6863\u7684\u53D8\u66F4\u901A\u8FC7\u68C0\u67E5\n\n## \u6267\u884C\u4EFB\u4F55\u4EFB\u52A1\u4E4B\u524D\n\n**\u4E0A\u4E0B\u6587\u68C0\u67E5\u6E05\u5355\uFF1A**\n- [ ] \u5728 `specs/[capability]/spec.md` \u4E2D\u9605\u8BFB\u76F8\u5173\u89C4\u8303\n- [ ] \u68C0\u67E5 `changes/` \u4E2D\u7684\u5F85\u5904\u7406\u53D8\u66F4\u662F\u5426\u5B58\u5728\u51B2\u7A81\n- [ ] \u9605\u8BFB `zhuanspec/project.md` \u4E86\u89E3\u7EA6\u5B9A\n- [ ] \u8FD0\u884C `zhuanspec list` \u67E5\u770B\u6D3B\u52A8\u53D8\u66F4\n- [ ] \u8FD0\u884C `zhuanspec list --specs` \u67E5\u770B\u73B0\u6709\u529F\u80FD\n\n**\u521B\u5EFA\u89C4\u8303\u4E4B\u524D\uFF1A**\n- \u59CB\u7EC8\u68C0\u67E5\u529F\u80FD\u662F\u5426\u5DF2\u5B58\u5728\n- \u4F18\u5148\u4FEE\u6539\u73B0\u6709\u89C4\u8303\u800C\u4E0D\u662F\u521B\u5EFA\u91CD\u590D\u9879\n- \u4F7F\u7528 `zhuanspec show [spec]` \u5BA1\u67E5\u5F53\u524D\u72B6\u6001\n- **\u5F3A\u5236\u6F84\u6E05\u8981\u6C42**\uFF1A\u5982\u679C\u8BF7\u6C42\u6709\u4EFB\u4F55\u4E0D\u660E\u786E\u3001\u6A21\u7CCA\u6216\u4E0D\u786E\u5B9A\u7684\u65B9\u9762\uFF0C\u5FC5\u987B\u505C\u6B62\u5E76\u4F7F\u7528**\u9009\u9879\u5F0F\u4EA4\u4E92**\u63D0\u95EE\u3002\u4E25\u7981\u5728\u4E0D\u786E\u5B9A\u7684\u60C5\u51B5\u4E0B\u81EA\u884C\u63A8\u6D4B\u3001\u5047\u8BBE\u6216\u7EE7\u7EED\u521B\u5EFA\u6587\u4EF6\u3002\u4E25\u7981\u8981\u6C42\u7528\u6237\u624B\u52A8\u8F93\u5165\u5927\u6BB5\u6587\u5B57\u56DE\u7B54\u3002\n\n## \u5F3A\u5236\u6F84\u6E05\u5DE5\u4F5C\u6D41\n\n\u5728\u521B\u5EFA\u4EFB\u4F55\u63D0\u6848\u6587\u4EF6\u4E4B\u524D\uFF0C\u5FC5\u987B\u6267\u884C\u5F3A\u5236\u6F84\u6E05\u68C0\u67E5\u3002\u8FD9\u662F\u4E0D\u53EF\u8DF3\u8FC7\u7684\u6B65\u9AA4\u3002\n\n**\u91CD\u8981\u539F\u5219\uFF1A\u5148\u67E5\u9605\u540E\u8BE2\u95EE\uFF0C\u907F\u514D\u8FC7\u5EA6\u8BE2\u95EE**\n\n\u5728\u8BE2\u95EE\u4E4B\u524D\uFF0C\u5FC5\u987B\u5148\u67E5\u9605\u4EE5\u4E0B\u6765\u6E90\uFF0C\u53EA\u6709\u5728\u786E\u5B9E\u65E0\u6CD5\u4ECE\u8FD9\u4E9B\u6765\u6E90\u786E\u5B9A\u65F6\u624D\u8BE2\u95EE\uFF1A\n- \u73B0\u6709\u89C4\u8303\uFF08`zhuanspec/specs/`\uFF09\n- \u9879\u76EE\u7EA6\u5B9A\uFF08`zhuanspec/project.md`\uFF09\n- \u4EE3\u7801\u5E93\u7ED3\u6784\u548C\u73B0\u6709\u6A21\u5F0F\n- \u4E0A\u4E0B\u6587\u6587\u4EF6\u548C\u76F8\u5173\u53D8\u66F4\n\n### \u4F55\u65F6\u9700\u8981\u6F84\u6E05\n\n\u5728\u4EE5\u4E0B\u60C5\u51B5\u4E0B\uFF0C**\u4E14\u65E0\u6CD5\u4ECE\u73B0\u6709\u89C4\u8303\u3001\u9879\u76EE\u7EA6\u5B9A\u3001\u4EE3\u7801\u5E93\u7ED3\u6784\u4E2D\u786E\u5B9A\u65F6**\uFF0C\u5FC5\u987B\u505C\u6B62\u5E76\u63D0\u95EE\uFF08\u5305\u62EC\u4F46\u4E0D\u9650\u4E8E\uFF09\uFF1A\n- **\u8303\u56F4\u4E0D\u660E\u786E**\uFF1A\u7528\u6237\u8BF7\u6C42\u7684\u8303\u56F4\u8FB9\u754C\u4E0D\u6E05\u695A\uFF08\u4F8B\u5982\uFF1A\"\u6539\u8FDB\u6027\u80FD\"\u3001\"\u4F18\u5316\u4EE3\u7801\"\uFF09\n- **\u6280\u672F\u9009\u62E9\u4E0D\u660E\u786E**\uFF1A\u6709\u591A\u79CD\u5B9E\u73B0\u65B9\u5F0F\uFF0C\u4F46\u7528\u6237\u672A\u6307\u5B9A\u504F\u597D\uFF0C\u4E14\u65E0\u6CD5\u4ECE\u73B0\u6709\u4EE3\u7801\u6A21\u5F0F\u4E2D\u786E\u5B9A\uFF08\u4F8B\u5982\uFF1A\u4F7F\u7528\u54EA\u79CD\u6570\u636E\u5E93\u3001\u54EA\u79CD\u6846\u67B6\uFF09\n- **\u4F18\u5148\u7EA7\u4E0D\u660E\u786E**\uFF1A\u591A\u4E2A\u9700\u6C42\u4F46\u672A\u8BF4\u660E\u4F18\u5148\u7EA7\u6216\u987A\u5E8F\n- **\u9A8C\u6536\u6807\u51C6\u4E0D\u660E\u786E**\uFF1A\u4E0D\u6E05\u695A\u5982\u4F55\u5224\u65AD\u5B8C\u6210\u6216\u6210\u529F\n- **\u5B9E\u73B0\u7EC6\u8282\u4E0D\u660E\u786E**\uFF1A\u4E0D\u6E05\u695A\u5982\u4F55\u5B9E\u73B0\u6216\u5B9E\u73B0\u7EC6\u8282\u4E0D\u660E\u786E\uFF0C\u4E14\u65E0\u6CD5\u4ECE\u4EE3\u7801\u5E93\u5206\u6790\u4E2D\u786E\u5B9A\uFF08\u4F8B\u5982\uFF1A\u5982\u4F55\u83B7\u53D6\u6570\u636E\u3001\u5982\u4F55\u5904\u7406\u9519\u8BEF\u3001\u5982\u4F55\u4F18\u5316\u6027\u80FD\uFF09\n- **\u4EE3\u7801\u6539\u52A8\u4F4D\u7F6E\u4E0D\u660E\u786E**\uFF1A\u4E0D\u6E05\u695A\u9700\u8981\u4FEE\u6539\u54EA\u4E9B\u6587\u4EF6\u3001\u5728\u54EA\u4E9B\u4F4D\u7F6E\u8FDB\u884C\u4FEE\u6539\uFF0C\u4E14\u65E0\u6CD5\u4ECE\u4EE3\u7801\u5E93\u7ED3\u6784\u5206\u6790\u4E2D\u786E\u5B9A\n- **\u4EE3\u7801\u5206\u5C42\u67B6\u6784\u4E0D\u660E\u786E**\uFF1A\u5982\u679C\u6D89\u53CA\u670D\u52A1\u5206\u5C42\uFF08\u5982 4 \u5C42\u67B6\u6784\u30013 \u5C42\u67B6\u6784\u7B49\uFF09\uFF0C\u4E0D\u6E05\u695A\u5404\u5C42\u7684\u804C\u8D23\u548C\u6539\u52A8\u4F4D\u7F6E\uFF0C\u4E14\u65E0\u6CD5\u4ECE\u73B0\u6709\u4EE3\u7801\u7ED3\u6784\u6216\u89C4\u8303\u4E2D\u786E\u5B9A\n- **\u6570\u636E\u83B7\u53D6\u6765\u6E90\u4E0D\u660E\u786E**\uFF1A\u4E0D\u6E05\u695A\u4ECE\u54EA\u91CC\u83B7\u53D6\u6570\u636E\uFF0C\u4E14\u65E0\u6CD5\u4ECE\u73B0\u6709\u4EE3\u7801\u6216\u89C4\u8303\u4E2D\u786E\u5B9A\uFF08\u4F8B\u5982\uFF1A\u4ECE\u6570\u636E\u5E93\u3001API\u3001\u6587\u4EF6\u3001\u5916\u90E8\u670D\u52A1\u3001\u5386\u53F2\u903B\u8F91\u590D\u7528\uFF09\n- **\u670D\u52A1\u5206\u5C42\u4E0D\u660E\u786E**\uFF1A\u4E0D\u6E05\u695A\u670D\u52A1\u5206\u5C42\uFF0C\u4E14\u65E0\u6CD5\u4ECE\u73B0\u6709\u4EE3\u7801\u7ED3\u6784\u6216\u89C4\u8303\u4E2D\u786E\u5B9A\uFF08\u4F8B\u5982\uFF1A\u524D\u7AEF\u3001\u540E\u7AEF\u3001\u6570\u636E\u5E93\u3001API\u3001\u670D\u52A1\u30014\u5C42\u67B6\u6784\u30013\u5C42\u67B6\u6784\u30012\u5C42\u67B6\u6784\u3001\u9886\u57DF\u6A21\u578B\uFF09\n- **\u4F9D\u8D56\u5173\u7CFB\u4E0D\u660E\u786E**\uFF1A\u4E0D\u6E05\u695A\u4F9D\u8D56\u5173\u7CFB\uFF0C\u4E14\u65E0\u6CD5\u4ECE\u4EE3\u7801\u5E93\u5206\u6790\u4E2D\u786E\u5B9A\uFF08\u4F8B\u5982\uFF1A\u4F9D\u8D56\u54EA\u4E9B\u670D\u52A1\u3001\u4F9D\u8D56\u54EA\u4E9B\u5E93\u3001\u4F9D\u8D56\u54EA\u4E9B\u7EC4\u4EF6\uFF09\n- **\u4E0A\u4E0B\u6587\u4FE1\u606F\u7F3A\u5931**\uFF1A\u7F3A\u5C11\u5FC5\u8981\u7684\u80CC\u666F\u4FE1\u606F\u6765\u7406\u89E3\u9700\u6C42\uFF0C\u4E14\u65E0\u6CD5\u4ECE\u73B0\u6709\u89C4\u8303\u6216\u4EE3\u7801\u4E2D\u83B7\u53D6\n- **\u6B67\u4E49\u6027\u8868\u8FF0**\uFF1A\u7528\u6237\u8BF7\u6C42\u53EF\u4EE5\u7528\u591A\u79CD\u65B9\u5F0F\u7406\u89E3\uFF0C\u4E14\u65E0\u6CD5\u4ECE\u4E0A\u4E0B\u6587\u786E\u5B9A\n- **\u5176\u4ED6\u4E0D\u660E\u786E**\uFF1A\u5176\u4ED6\u4E0D\u660E\u786E\u7684\u60C5\u51B5\uFF0C\u4E14\u65E0\u6CD5\u4ECE\u73B0\u6709\u6765\u6E90\u786E\u5B9A\n\n### \u4F55\u65F6\u4E0D\u9700\u8981\u6F84\u6E05\n\n\u5728\u4EE5\u4E0B\u60C5\u51B5\u4E0B\uFF0C**\u4E0D\u5E94\u8BE2\u95EE**\uFF0C\u5E94\u76F4\u63A5\u4F7F\u7528\u4ECE\u73B0\u6709\u6765\u6E90\u83B7\u53D6\u7684\u4FE1\u606F\uFF1A\n- **\u4FE1\u606F\u5DF2\u660E\u786E**\uFF1A\u7528\u6237\u8BF7\u6C42\u4E2D\u5DF2\u7ECF\u660E\u786E\u8BF4\u660E\u4E86\u76F8\u5173\u4FE1\u606F\n- **\u53EF\u4ECE\u89C4\u8303\u83B7\u53D6**\uFF1A\u4FE1\u606F\u53EF\u4EE5\u4ECE\u73B0\u6709\u89C4\u8303\uFF08`zhuanspec/specs/`\uFF09\u4E2D\u83B7\u53D6\n- **\u53EF\u4ECE\u9879\u76EE\u7EA6\u5B9A\u83B7\u53D6**\uFF1A\u4FE1\u606F\u53EF\u4EE5\u4ECE\u9879\u76EE\u7EA6\u5B9A\uFF08`zhuanspec/project.md`\uFF09\u4E2D\u83B7\u53D6\n- **\u53EF\u4ECE\u4EE3\u7801\u5E93\u5206\u6790\u83B7\u53D6**\uFF1A\u4FE1\u606F\u53EF\u4EE5\u901A\u8FC7\u5206\u6790\u4EE3\u7801\u5E93\u7ED3\u6784\u3001\u73B0\u6709\u6A21\u5F0F\u3001\u76F8\u5173\u6587\u4EF6\u83B7\u53D6\n- **\u53EF\u4ECE\u4E0A\u4E0B\u6587\u83B7\u53D6**\uFF1A\u4FE1\u606F\u53EF\u4EE5\u4ECE\u4E0A\u4E0B\u6587\u6587\u4EF6\u3001\u76F8\u5173\u53D8\u66F4\u3001\u5386\u53F2\u8BB0\u5F55\u4E2D\u83B7\u53D6\n- **\u7B26\u5408\u5E38\u89C1\u6A21\u5F0F**\uFF1A\u5B9E\u73B0\u65B9\u5F0F\u7B26\u5408\u9879\u76EE\u4E2D\u7684\u5E38\u89C1\u6A21\u5F0F\u6216\u6700\u4F73\u5B9E\u8DF5\uFF0C\u65E0\u9700\u7279\u522B\u8BE2\u95EE\n\n**\u539F\u5219**\uFF1A\u5982\u679C\u53EF\u4EE5\u901A\u8FC7\u67E5\u9605\u73B0\u6709\u6765\u6E90\u786E\u5B9A\u4FE1\u606F\uFF0C\u5C31\u4E0D\u8981\u8BE2\u95EE\u7528\u6237\uFF0C\u4EE5\u63D0\u9AD8\u6548\u7387\u3002\n\n### \u6F84\u6E05\u95EE\u9898\u683C\u5F0F\n\n**\u5FC5\u987B\u4F7F\u7528\u9009\u9879\u5F0F\u4EA4\u4E92\uFF0C\u4E25\u7981\u8981\u6C42\u7528\u6237\u624B\u52A8\u8F93\u5165\u6587\u5B57\u56DE\u7B54\u3002**\n\n\u4F7F\u7528\u7F16\u8F91\u5668\u63D0\u4F9B\u7684\u7ED3\u6784\u5316\u95EE\u7B54\u5DE5\u5177\uFF08\u5982 Cursor \u7684 `AskQuestion` \u5DE5\u5177\u3001Claude Code \u7684\u4EA4\u4E92\u5F0F\u9009\u62E9\u7B49\uFF09\u5411\u7528\u6237\u63D0\u95EE\uFF0C\u5C06\u6BCF\u4E2A\u6F84\u6E05\u95EE\u9898\u8F6C\u5316\u4E3A\u5E26\u9884\u8BBE\u9009\u9879\u7684\u9009\u62E9\u9898\uFF1A\n\n**\u683C\u5F0F\u8981\u6C42\uFF1A**\n- \u6BCF\u4E2A\u95EE\u9898\u63D0\u4F9B 2-5 \u4E2A\u9884\u8BBE\u9009\u9879\n- \u6BCF\u4E2A\u95EE\u9898\u672B\u5C3E\u5305\u542B\u4E00\u4E2A\"\u5176\u4ED6\"\u9009\u9879\uFF0C\u4EE5\u8986\u76D6\u672A\u5217\u51FA\u7684\u60C5\u51B5\n- \u5141\u8BB8\u7528\u6237\u591A\u9009\uFF08\u5F53\u95EE\u9898\u53EF\u80FD\u6709\u591A\u4E2A\u7B54\u6848\u65F6\u8BBE\u7F6E `allow_multiple: true`\uFF09\n- \u9009\u9879\u6587\u672C\u8981\u7B80\u6D01\u660E\u4E86\uFF0C\u5FC5\u8981\u65F6\u9644\u5E26\u7B80\u77ED\u8BF4\u660E\n- \u5982\u679C\u6709\u591A\u4E2A\u72EC\u7ACB\u7684\u6F84\u6E05\u95EE\u9898\uFF0C\u5408\u5E76\u5230\u540C\u4E00\u6B21\u95EE\u7B54\u4EA4\u4E92\u4E2D\uFF08\u4E00\u6B21\u6027\u5C55\u793A\u591A\u4E2A\u95EE\u9898\uFF09\n\n**\u6807\u51C6\u683C\u5F0F\u6A21\u677F\uFF1A**\n\n```\n\u4F7F\u7528 AskQuestion \u5DE5\u5177\u63D0\u95EE\uFF0C\u7ED3\u6784\u5982\u4E0B\uFF1A\n\n\u95EE\u9898 1: \"\u5173\u4E8E [\u4E0D\u786E\u5B9A\u7684\u65B9\u9762]\uFF1A[\u5177\u4F53\u95EE\u9898]\"\n\u9009\u9879\uFF1A\n A) [\u9009\u98791 - \u7B80\u77ED\u8BF4\u660E]\n B) [\u9009\u98792 - \u7B80\u77ED\u8BF4\u660E]\n C) [\u9009\u98793 - \u7B80\u77ED\u8BF4\u660E]\n D) \u5176\u4ED6\uFF08\u8BF7\u5728\u540E\u7EED\u8865\u5145\u8BF4\u660E\uFF09\n\n\u95EE\u9898 2: \"\u5173\u4E8E [\u53E6\u4E00\u4E2A\u65B9\u9762]\uFF1A[\u5177\u4F53\u95EE\u9898]\"\n\u9009\u9879\uFF1A\n A) [\u9009\u98791]\n B) [\u9009\u98792]\n C) \u5176\u4ED6\n```\n\n**\u5DE5\u5177\u8C03\u7528\u793A\u4F8B\uFF08Cursor AskQuestion\uFF09\uFF1A**\n```json\n{\n \"questions\": [\n {\n \"id\": \"scope\",\n \"prompt\": \"\u5173\u4E8E\u6539\u8FDB\u8303\u56F4\uFF1A\u60A8\u5E0C\u671B\u6539\u8FDB\u54EA\u4E9B\u65B9\u9762\uFF1F\",\n \"options\": [\n {\"id\": \"security\", \"label\": \"\u5B89\u5168\u6027\uFF08\u5982\u53CC\u56E0\u7D20\u8BA4\u8BC1\uFF09\"},\n {\"id\": \"ux\", \"label\": \"\u7528\u6237\u4F53\u9A8C\uFF08\u5982\u7B80\u5316\u6D41\u7A0B\uFF09\"},\n {\"id\": \"performance\", \"label\": \"\u6027\u80FD\uFF08\u5982\u54CD\u5E94\u65F6\u95F4\u4F18\u5316\uFF09\"},\n {\"id\": \"other\", \"label\": \"\u5176\u4ED6\"}\n ],\n \"allow_multiple\": true\n },\n {\n \"id\": \"priority\",\n \"prompt\": \"\u5982\u679C\u6709\u591A\u4E2A\u6539\u8FDB\u70B9\uFF0C\u4F18\u5148\u7EA7\u5982\u4F55\uFF1F\",\n \"options\": [\n {\"id\": \"security_first\", \"label\": \"\u5B89\u5168\u6027\u4F18\u5148\"},\n {\"id\": \"ux_first\", \"label\": \"\u7528\u6237\u4F53\u9A8C\u4F18\u5148\"},\n {\"id\": \"all_equal\", \"label\": \"\u540C\u7B49\u91CD\u8981\uFF0C\u4E00\u8D77\u505A\"}\n ]\n }\n ]\n}\n```\n\n**\u539F\u5219\uFF1A**\n- \u6C38\u8FDC\u4E0D\u8981\u8BA9\u7528\u6237\u4ECE\u96F6\u5F00\u59CB\u8F93\u5165\u7B54\u6848\uFF0C\u603B\u662F\u63D0\u4F9B\u53EF\u9009\u7684\u9009\u9879\n- \u9009\u9879\u5E94\u8986\u76D6\u6700\u5E38\u89C1\u7684\u7B54\u6848\u573A\u666F\n- \"\u5176\u4ED6\"\u9009\u9879\u4F5C\u4E3A\u515C\u5E95\uFF0C\u786E\u4FDD\u4E0D\u9057\u6F0F\u7279\u6B8A\u60C5\u51B5\n- \u7528\u6237\u9009\u62E9\"\u5176\u4ED6\"\u540E\uFF0C\u518D\u9488\u5BF9\u6027\u5730\u8FFD\u95EE\u7EC6\u8282\n\n### \u7981\u6B62\u884C\u4E3A\n\n\u5728\u9047\u5230\u6A21\u7CCA\u9700\u6C42\u65F6\uFF0C**\u4E25\u7981**\u4EE5\u4E0B\u884C\u4E3A\uFF1A\n- \u274C \u81EA\u884C\u63A8\u6D4B\u7528\u6237\u610F\u56FE\n- \u274C \u57FA\u4E8E\"\u6700\u4F73\u731C\u6D4B\"\u521B\u5EFA\u63D0\u6848\n- \u274C \u5047\u8BBE\u7528\u6237\u60F3\u8981\u4EC0\u4E48\n- \u274C \u8DF3\u8FC7\u6F84\u6E05\u76F4\u63A5\u521B\u5EFA\u6587\u4EF6\n- \u274C \u4F7F\u7528\u6A21\u7CCA\u7684\u8868\u8FF0\u6765\u63A9\u76D6\u4E0D\u786E\u5B9A\u6027\n- \u274C \u8981\u6C42\u7528\u6237\u624B\u52A8\u8F93\u5165\u5927\u6BB5\u6587\u5B57\u6765\u56DE\u7B54\u6F84\u6E05\u95EE\u9898\uFF08\u5FC5\u987B\u4F7F\u7528\u9009\u9879\u5F0F\u4EA4\u4E92\uFF09\n\n### \u6F84\u6E05\u6D41\u7A0B\n\n1. **\u67E5\u9605\u73B0\u6709\u6765\u6E90**\uFF1A\u9996\u5148\u67E5\u9605\u73B0\u6709\u89C4\u8303\u3001\u9879\u76EE\u7EA6\u5B9A\u3001\u4EE3\u7801\u5E93\u7ED3\u6784\u3001\u4E0A\u4E0B\u6587\u6587\u4EF6\u7B49\uFF0C\u5C1D\u8BD5\u4ECE\u8FD9\u4E9B\u6765\u6E90\u83B7\u53D6\u6240\u9700\u4FE1\u606F\n2. **\u8BC6\u522B\u6A21\u7CCA\u70B9**\uFF1A\u4ED4\u7EC6\u5206\u6790\u7528\u6237\u8BF7\u6C42\uFF0C\u5217\u51FA\u6240\u6709\u4E0D\u786E\u5B9A\u7684\u65B9\u9762\uFF0C**\u4F46\u6392\u9664\u90A3\u4E9B\u53EF\u4EE5\u4ECE\u73B0\u6709\u6765\u6E90\u786E\u5B9A\u7684\u65B9\u9762**\n3. **\u5224\u65AD\u662F\u5426\u9700\u8981\u8BE2\u95EE**\uFF1A\u5BF9\u4E8E\u6BCF\u4E2A\u4E0D\u786E\u5B9A\u7684\u65B9\u9762\uFF0C\u5224\u65AD\u662F\u5426\u53EF\u4EE5\u4ECE\u73B0\u6709\u6765\u6E90\u786E\u5B9A\uFF1A\n - \u5982\u679C\u53EF\u4EE5\u786E\u5B9A\uFF0C\u5219\u4F7F\u7528\u4ECE\u73B0\u6709\u6765\u6E90\u83B7\u53D6\u7684\u4FE1\u606F\uFF0C\u4E0D\u8BE2\u95EE\n - \u5982\u679C\u65E0\u6CD5\u786E\u5B9A\uFF0C\u5219\u6807\u8BB0\u4E3A\u9700\u8981\u8BE2\u95EE\n4. **\u6784\u9020\u9009\u9879\u5F0F\u95EE\u9898**\uFF1A\u5C06\u6240\u6709\u9700\u8981\u8BE2\u95EE\u7684\u6A21\u7CCA\u70B9\u8F6C\u5316\u4E3A\u5E26\u9884\u8BBE\u9009\u9879\u7684\u9009\u62E9\u9898\uFF0C\u5C3D\u91CF\u5408\u5E76\u5230\u4E00\u6B21\u4EA4\u4E92\u4E2D\n5. **\u4F7F\u7528\u5DE5\u5177\u63D0\u95EE**\uFF1A\u8C03\u7528\u7F16\u8F91\u5668\u7684\u7ED3\u6784\u5316\u95EE\u7B54\u5DE5\u5177\uFF08\u5982 `AskQuestion`\uFF09\u4E00\u6B21\u6027\u5C55\u793A\u6240\u6709\u95EE\u9898\u548C\u9009\u9879\uFF0C\u7B49\u5F85\u7528\u6237\u9009\u62E9\n6. **\u7B49\u5F85\u7528\u6237\u9009\u62E9**\uFF1A\u5FC5\u987B\u7B49\u5F85\u7528\u6237\u9009\u62E9\u7B54\u6848\uFF0C\u4E0D\u80FD\u7EE7\u7EED\n7. **\u5904\u7406\"\u5176\u4ED6\"\u9009\u9879**\uFF1A\u5982\u679C\u7528\u6237\u9009\u62E9\u4E86\"\u5176\u4ED6\"\uFF0C\u518D\u9488\u5BF9\u8BE5\u95EE\u9898\u8FFD\u95EE\u5177\u4F53\u7EC6\u8282\uFF08\u4ECD\u4F18\u5148\u4F7F\u7528\u9009\u9879\u5F0F\uFF0C\u5982\u786E\u5B9E\u65E0\u6CD5\u9884\u8BBE\u5219\u5141\u8BB8\u7B80\u77ED\u6587\u5B57\u8F93\u5165\uFF09\n8. **\u786E\u8BA4\u7406\u89E3**\uFF1A\u5728\u5F00\u59CB\u521B\u5EFA\u6587\u4EF6\u524D\uFF0C\u7B80\u8981\u603B\u7ED3\u7406\u89E3\u4EE5\u786E\u4FDD\u51C6\u786E\n9. **\u5F00\u59CB\u521B\u5EFA**\uFF1A\u53EA\u6709\u5728\u6240\u6709\u5FC5\u8981\u7684\u6A21\u7CCA\u70B9\u90FD\u660E\u786E\u540E\uFF0C\u624D\u80FD\u5F00\u59CB\u521B\u5EFA\u63D0\u6848\u6587\u4EF6\n\n### \u793A\u4F8B\n\n**\u7528\u6237\u8BF7\u6C42**\uFF1A\"\u6539\u8FDB\u767B\u5F55\u529F\u80FD\"\n\n**\u5206\u6790\u8FC7\u7A0B**\uFF1A\n1. \u9996\u5148\u67E5\u9605\u73B0\u6709\u89C4\u8303\uFF08`zhuanspec/specs/`\uFF09\u4E2D\u662F\u5426\u6709\u767B\u5F55\u76F8\u5173\u7684\u89C4\u8303\n2. \u67E5\u9605\u9879\u76EE\u7EA6\u5B9A\uFF08`zhuanspec/project.md`\uFF09\u4E86\u89E3\u9879\u76EE\u67B6\u6784\u548C\u7EA6\u5B9A\n3. \u5206\u6790\u4EE3\u7801\u5E93\u7ED3\u6784\uFF0C\u4E86\u89E3\u73B0\u6709\u7684\u767B\u5F55\u5B9E\u73B0\u65B9\u5F0F\n4. \u5982\u679C\u4ECE\u8FD9\u4E9B\u6765\u6E90\u65E0\u6CD5\u786E\u5B9A\u6539\u8FDB\u8303\u56F4\uFF0C\u5219\u4F7F\u7528\u9009\u9879\u5F0F\u4EA4\u4E92\u8BE2\u95EE\n\n**\u5FC5\u987B\u4F7F\u7528\u9009\u9879\u5F0F\u4EA4\u4E92\u63D0\u95EE**\uFF08\u4EC5\u5728\u65E0\u6CD5\u4ECE\u73B0\u6709\u6765\u6E90\u786E\u5B9A\u65F6\uFF09\uFF1A\n\n```json\n{\n \"questions\": [\n {\n \"id\": \"improvement_scope\",\n \"prompt\": \"\u60A8\u5E0C\u671B\u6539\u8FDB\u767B\u5F55\u529F\u80FD\u7684\u54EA\u4E9B\u65B9\u9762\uFF1F\",\n \"options\": [\n {\"id\": \"security\", \"label\": \"\u5B89\u5168\u6027\uFF08\u5982\u6DFB\u52A0\u53CC\u56E0\u7D20\u8BA4\u8BC1\uFF09\"},\n {\"id\": \"ux\", \"label\": \"\u7528\u6237\u4F53\u9A8C\uFF08\u5982\u7B80\u5316\u767B\u5F55\u6D41\u7A0B\uFF09\"},\n {\"id\": \"performance\", \"label\": \"\u6027\u80FD\uFF08\u5982\u4F18\u5316\u767B\u5F55\u54CD\u5E94\u65F6\u95F4\uFF09\"},\n {\"id\": \"other\", \"label\": \"\u5176\u4ED6\"}\n ],\n \"allow_multiple\": true\n },\n {\n \"id\": \"tech_preference\",\n \"prompt\": \"\u60A8\u6709\u7279\u5B9A\u7684\u6280\u672F\u504F\u597D\u5417\uFF1F\",\n \"options\": [\n {\"id\": \"jwt\", \"label\": \"JWT Token \u8BA4\u8BC1\"},\n {\"id\": \"session\", \"label\": \"Session \u8BA4\u8BC1\"},\n {\"id\": \"oauth\", \"label\": \"OAuth \u7B2C\u4E09\u65B9\u96C6\u6210\"},\n {\"id\": \"no_preference\", \"label\": \"\u65E0\u504F\u597D\uFF0C\u7531\u4F60\u63A8\u8350\"},\n {\"id\": \"other\", \"label\": \"\u5176\u4ED6\"}\n ]\n },\n {\n \"id\": \"priority\",\n \"prompt\": \"\u5982\u679C\u6709\u591A\u4E2A\u6539\u8FDB\u70B9\uFF0C\u4F18\u5148\u7EA7\u5982\u4F55\uFF1F\",\n \"options\": [\n {\"id\": \"security_first\", \"label\": \"\u5B89\u5168\u6027\u4F18\u5148\"},\n {\"id\": \"ux_first\", \"label\": \"\u7528\u6237\u4F53\u9A8C\u4F18\u5148\"},\n {\"id\": \"perf_first\", \"label\": \"\u6027\u80FD\u4F18\u5148\"},\n {\"id\": \"all_equal\", \"label\": \"\u540C\u7B49\u91CD\u8981\uFF0C\u4E00\u8D77\u505A\"}\n ]\n }\n ]\n}\n```\n\n**\u5B9E\u73B0\u7EC6\u8282\u76F8\u5173\u793A\u4F8B**\uFF08\u4EC5\u5728\u65E0\u6CD5\u4ECE\u4EE3\u7801\u5E93\u5206\u6790\u786E\u5B9A\u65F6\u8BE2\u95EE\uFF09\uFF1A\n\n**\u7528\u6237\u8BF7\u6C42**\uFF1A\"\u91CD\u6784\u7528\u6237\u8BA4\u8BC1\u670D\u52A1\"\n\n**\u5982\u679C\u65E0\u6CD5\u4ECE\u4EE3\u7801\u5E93\u5206\u6790\u786E\u5B9A\uFF0C\u4F7F\u7528\u9009\u9879\u5F0F\u4EA4\u4E92\u63D0\u95EE**\uFF1A\n\n```json\n{\n \"questions\": [\n {\n \"id\": \"change_scope\",\n \"prompt\": \"\u91CD\u6784\u6D89\u53CA\u54EA\u4E9B\u6539\u52A8\uFF1F\",\n \"options\": [\n {\"id\": \"modify_existing\", \"label\": \"\u4FEE\u6539\u73B0\u6709\u8BA4\u8BC1\u670D\u52A1\u7C7B\"},\n {\"id\": \"new_service\", \"label\": \"\u521B\u5EFA\u65B0\u7684\u670D\u52A1\u5C42\"},\n {\"id\": \"both\", \"label\": \"\u4E24\u8005\u90FD\u6D89\u53CA\"},\n {\"id\": \"other\", \"label\": \"\u5176\u4ED6\"}\n ]\n },\n {\n \"id\": \"layer_scope\",\n \"prompt\": \"\u6539\u52A8\u5E94\u8BE5\u5728\u54EA\u4E9B\u5C42\u8FDB\u884C\uFF1F\",\n \"options\": [\n {\"id\": \"controller\", \"label\": \"Controller \u5C42\"},\n {\"id\": \"service\", \"label\": \"Service \u5C42\"},\n {\"id\": \"repository\", \"label\": \"Repository \u5C42\"},\n {\"id\": \"all\", \"label\": \"\u5168\u90E8\u5C42\"}\n ],\n \"allow_multiple\": true\n },\n {\n \"id\": \"refactor_strategy\",\n \"prompt\": \"\u91CD\u6784\u7B56\u7565\u504F\u597D\uFF1F\",\n \"options\": [\n {\"id\": \"incremental\", \"label\": \"\u6E10\u8FDB\u5F0F\u91CD\u6784\uFF08\u9010\u6B65\u66FF\u6362\uFF09\"},\n {\"id\": \"rewrite\", \"label\": \"\u5B8C\u5168\u91CD\u5199\"},\n {\"id\": \"strangler\", \"label\": \"\u7EDE\u6740\u8005\u6A21\u5F0F\uFF08\u65B0\u65E7\u5E76\u884C\u540E\u5207\u6362\uFF09\"},\n {\"id\": \"no_preference\", \"label\": \"\u65E0\u504F\u597D\uFF0C\u7531\u4F60\u63A8\u8350\"}\n ]\n }\n ]\n}\n```\n\n**\u6CE8\u610F**\uFF1A\u5982\u679C\u53EF\u4EE5\u4ECE\u73B0\u6709\u4EE3\u7801\u7ED3\u6784\u3001\u89C4\u8303\u6216\u9879\u76EE\u7EA6\u5B9A\u4E2D\u786E\u5B9A\u8FD9\u4E9B\u4FE1\u606F\uFF0C\u5219\u4E0D\u5E94\u8BE2\u95EE\uFF0C\u76F4\u63A5\u4F7F\u7528\u4ECE\u73B0\u6709\u6765\u6E90\u83B7\u53D6\u7684\u4FE1\u606F\u3002\n\n### \u641C\u7D22\u6307\u5BFC\n- \u679A\u4E3E\u89C4\u8303\uFF1A`zhuanspec spec list --long`\uFF08\u6216\u4F7F\u7528 `--json` \u7528\u4E8E\u811A\u672C\uFF09\n- \u679A\u4E3E\u53D8\u66F4\uFF1A`zhuanspec list`\uFF08\u6216 `zhuanspec change list --json` - \u5DF2\u5F03\u7528\u4F46\u53EF\u7528\uFF09\n- \u663E\u793A\u8BE6\u7EC6\u4FE1\u606F\uFF1A\n - \u89C4\u8303\uFF1A`zhuanspec show <spec-id> --type spec`\uFF08\u4F7F\u7528 `--json` \u8FDB\u884C\u8FC7\u6EE4\uFF09\n - \u53D8\u66F4\uFF1A`zhuanspec show <change-id> --json --deltas-only`\n- \u5168\u6587\u641C\u7D22\uFF08\u4F7F\u7528 ripgrep\uFF09\uFF1A`rg -n \"Requirement:|Scenario:\" zhuanspec/specs`\n\n## \u5FEB\u901F\u5F00\u59CB\n\n### CLI \u547D\u4EE4\n\n```bash\n# \u57FA\u672C\u547D\u4EE4\nzhuanspec list # \u5217\u51FA\u6D3B\u52A8\u53D8\u66F4\nzhuanspec list --specs # \u5217\u51FA\u89C4\u8303\nzhuanspec show [item] # \u663E\u793A\u53D8\u66F4\u6216\u89C4\u8303\nzhuanspec validate [item] # \u9A8C\u8BC1\u53D8\u66F4\u6216\u89C4\u8303\nzhuanspec archive <change-id> [--yes|-y] # \u90E8\u7F72\u540E\u5F52\u6863\uFF08\u6DFB\u52A0 --yes \u7528\u4E8E\u975E\u4EA4\u4E92\u5F0F\u8FD0\u884C\uFF09\n\n# \u9879\u76EE\u7BA1\u7406\nzhuanspec init [path] # \u521D\u59CB\u5316 ZhuanSpec\nzhuanspec update [path] # \u66F4\u65B0\u8BF4\u660E\u6587\u4EF6\n\n# \u4EA4\u4E92\u6A21\u5F0F\nzhuanspec show # \u63D0\u793A\u9009\u62E9\nzhuanspec validate # \u6279\u91CF\u9A8C\u8BC1\u6A21\u5F0F\n\n# \u8C03\u8BD5\nzhuanspec show [change] --json --deltas-only\nzhuanspec validate [change] --strict\n```\n\n### \u547D\u4EE4\u6807\u5FD7\n\n- `--json` - \u673A\u5668\u53EF\u8BFB\u8F93\u51FA\n- `--type change|spec` - \u6D88\u9664\u9879\u76EE\u6B67\u4E49\n- `--strict` - \u5168\u9762\u9A8C\u8BC1\n- `--no-interactive` - \u7981\u7528\u63D0\u793A\n- `--skip-specs` - \u5F52\u6863\u65F6\u4E0D\u66F4\u65B0\u89C4\u8303\n- `--yes`/`-y` - \u8DF3\u8FC7\u786E\u8BA4\u63D0\u793A\uFF08\u975E\u4EA4\u4E92\u5F0F\u5F52\u6863\uFF09\n\n## \u76EE\u5F55\u7ED3\u6784\n\n```\nzhuanspec/\n\u251C\u2500\u2500 project.md # \u9879\u76EE\u7EA6\u5B9A\n\u251C\u2500\u2500 specs/ # \u5F53\u524D\u771F\u5B9E\u72B6\u6001 - \u5DF2\u6784\u5EFA\u7684\u5185\u5BB9\n\u2502 \u2514\u2500\u2500 [capability]/ # \u5355\u4E00\u805A\u7126\u7684\u529F\u80FD\n\u2502 \u251C\u2500\u2500 spec.md # \u8981\u6C42\u548C\u573A\u666F\n\u2502 \u2514\u2500\u2500 design.md # \u6280\u672F\u6A21\u5F0F\n\u251C\u2500\u2500 changes/ # \u63D0\u6848 - \u5E94\u8BE5\u66F4\u6539\u7684\u5185\u5BB9\n\u2502 \u251C\u2500\u2500 [change-name]/\n\u2502 \u2502 \u251C\u2500\u2500 proposal.md # \u539F\u56E0\u3001\u5185\u5BB9\u3001\u5F71\u54CD\n\u2502 \u2502 \u251C\u2500\u2500 tasks.md # \u5B9E\u65BD\u6E05\u5355\n\u2502 \u2502 \u251C\u2500\u2500 design.md # \u6280\u672F\u51B3\u7B56\uFF08\u53EF\u9009\uFF1B\u89C1\u6807\u51C6\uFF09\n\u2502 \u2502 \u2514\u2500\u2500 specs/ # \u589E\u91CF\u53D8\u66F4\n\u2502 \u2502 \u2514\u2500\u2500 [capability]/\n\u2502 \u2502 \u2514\u2500\u2500 spec.md # ADDED/MODIFIED/REMOVED\n\u2502 \u2514\u2500\u2500 archive/ # \u5DF2\u5B8C\u6210\u7684\u53D8\u66F4\n```\n\n## \u521B\u5EFA\u53D8\u66F4\u63D0\u6848\n\n### \u51B3\u7B56\u6811\n\n```\n\u65B0\u8BF7\u6C42\uFF1F\n\u251C\u2500 \u4FEE\u590D\u6062\u590D\u89C4\u8303\u884C\u4E3A\u7684 Bug\uFF1F \u2192 \u76F4\u63A5\u4FEE\u590D\n\u251C\u2500 \u62FC\u5199\u9519\u8BEF/\u683C\u5F0F/\u6CE8\u91CA\uFF1F \u2192 \u76F4\u63A5\u4FEE\u590D\n\u251C\u2500 \u65B0\u529F\u80FD/\u80FD\u529B\uFF1F \u2192 \u521B\u5EFA\u63D0\u6848\n\u251C\u2500 \u7834\u574F\u6027\u66F4\u6539\uFF1F \u2192 \u521B\u5EFA\u63D0\u6848\n\u251C\u2500 \u67B6\u6784\u66F4\u6539\uFF1F \u2192 \u521B\u5EFA\u63D0\u6848\n\u2514\u2500 \u4E0D\u660E\u786E\uFF1F \u2192 \u521B\u5EFA\u63D0\u6848\uFF08\u66F4\u5B89\u5168\uFF09\n```\n\n### \u63D0\u6848\u7ED3\u6784\n\n1. **\u521B\u5EFA\u76EE\u5F55\uFF1A** `changes/[change-id]/`\uFF08kebab-case\uFF0C\u52A8\u8BCD\u5F00\u5934\uFF0C\u552F\u4E00\uFF09\n\n2. **\u7F16\u5199 proposal.md\uFF1A**\n```markdown\n# Change: [\u53D8\u66F4\u7684\u7B80\u8981\u63CF\u8FF0]\n\n## Why\n[\u5173\u4E8E\u95EE\u9898/\u673A\u4F1A\u7684 1-2 \u53E5\u8BDD]\n\n## What Changes\n- [\u53D8\u66F4\u7684\u8981\u70B9\u5217\u8868]\n- [\u7528 **BREAKING** \u6807\u8BB0\u7834\u574F\u6027\u66F4\u6539]\n\n## Impact\n- Affected specs: [\u5217\u51FA\u529F\u80FD]\n- Affected code: [\u5173\u952E\u6587\u4EF6/\u7CFB\u7EDF]\n```\n\n3. **\u521B\u5EFA\u89C4\u8303\u589E\u91CF\uFF1A** `specs/[capability]/spec.md`\n```markdown\n## ADDED Requirements\n### Requirement: New Feature\nThe system SHALL provide...\n\n#### Scenario: Success case\n- **WHEN** user performs action\n- **THEN** expected result\n\n## MODIFIED Requirements\n### Requirement: Existing Feature\n[\u5B8C\u6574\u7684\u4FEE\u6539\u540E\u8981\u6C42]\n\n## REMOVED Requirements\n### Requirement: Old Feature\n**Reason**: [\u79FB\u9664\u539F\u56E0]\n**Migration**: [\u5982\u4F55\u5904\u7406]\n```\n\u5982\u679C\u591A\u4E2A\u529F\u80FD\u53D7\u5230\u5F71\u54CD\uFF0C\u5728 `changes/[change-id]/specs/<capability>/spec.md` \u4E0B\u521B\u5EFA\u591A\u4E2A\u589E\u91CF\u6587\u4EF6\u2014\u2014\u6BCF\u4E2A\u529F\u80FD\u4E00\u4E2A\u3002\n\n4. **\u521B\u5EFA tasks.md\uFF1A**\n\n\u5148\u8FD0\u884C `zhuanspec skills list --json` \u53D1\u73B0\u5F53\u524D\u73AF\u5883\u4E2D\u53EF\u7528\u7684 skill \u53CA\u5176 description\uFF0C\u7136\u540E\u57FA\u4E8E\u8BED\u4E49\u5339\u914D\u5728\u4EFB\u52A1\u4E2D\u6807\u6CE8\u771F\u5B9E skill \u540D\u79F0\uFF1A\n\n```markdown\n## 1. Implementation\n- [ ] 1.1 Create database schema @skill:java-db-schema-standards\n- [ ] 1.2 Implement RPC interface @skill:java-scf-rpc-usage-skill\n- [ ] 1.3 Add frontend component @skill:kf-fe-frontend-dev\n- [ ] 1.4 Write tests @skill:generate-mockito-unit-test-skill\n```\n> **@skill \u6807\u7B7E**\uFF1A\u521B\u5EFA tasks.md \u524D\uFF0C\u8FD0\u884C `zhuanspec skills list --json` \u53D1\u73B0\u53EF\u7528 skill \u53CA\u5176 description\u3002\u57FA\u4E8E skill description \u8FDB\u884C\u8BED\u4E49\u5339\u914D\uFF1A\n> - \u4ED4\u7EC6\u9605\u8BFB\u6BCF\u4E2A skill \u7684 description\uFF0C\u7406\u89E3\u5176\u5177\u4F53\u529F\u80FD\u548C\u9002\u7528\u573A\u666F\n> - \u53EA\u6709\u5F53\u4EFB\u52A1\u529F\u80FD\u4E0E skill description \u660E\u786E\u5339\u914D\u65F6\u624D\u6807\u6CE8\n> - \u7B80\u5355\u7684\u4EE3\u7801\u4FEE\u6539\uFF08\u5982\u589E\u5220\u679A\u4E3E\u503C\uFF09\u5E94\u5339\u914D\u901A\u7528\u7F16\u7801\u89C4\u8303 skill\uFF0C\u800C\u975E\u67B6\u6784\u7EA7 skill\n> - \u907F\u514D\u4EC5\u56E0\u6587\u4EF6\u540D\u6216\u8DEF\u5F84\u5173\u952E\u8BCD\u800C\u9519\u8BEF\u5339\u914D\n> - \u4F7F\u7528\u771F\u5B9E skill \u540D\u79F0\u6807\u6CE8\uFF0C\u652F\u6301\u591A\u4E2A skill\uFF08`@skill:name1,name2`\uFF09\n> - Apply \u9636\u6BB5 AI \u6839\u636E\u6807\u7B7E\u76F4\u63A5\u8C03\u7528\u5BF9\u5E94 skill\u3002\u65E0\u53EF\u7528 skill \u65F6\u53EF\u7701\u7565\u3002\n\n5. **\u5728\u9700\u8981\u65F6\u521B\u5EFA design.md\uFF1A**\n\u5982\u679C\u4EE5\u4E0B\u4EFB\u4F55\u60C5\u51B5\u9002\u7528\uFF0C\u5219\u521B\u5EFA `design.md`\uFF1B\u5426\u5219\u7701\u7565\uFF1A\n- \u6A2A\u5207\u53D8\u66F4\uFF08\u591A\u4E2A\u670D\u52A1/\u6A21\u5757\uFF09\u6216\u65B0\u7684\u67B6\u6784\u6A21\u5F0F\n- \u65B0\u7684\u5916\u90E8\u4F9D\u8D56\u6216\u91CD\u8981\u7684\u6570\u636E\u6A21\u578B\u66F4\u6539\n- \u5B89\u5168\u6027\u3001\u6027\u80FD\u6216\u8FC1\u79FB\u590D\u6742\u6027\n- \u5728\u7F16\u7801\u4E4B\u524D\u4ECE\u6280\u672F\u51B3\u7B56\u4E2D\u53D7\u76CA\u7684\u6A21\u7CCA\u6027\n\n\u6700\u5C0F `design.md` \u9AA8\u67B6\uFF1A\n```markdown\n## Context\n[\u80CC\u666F\u3001\u7EA6\u675F\u3001\u5229\u76CA\u76F8\u5173\u8005]\n\n## Goals / Non-Goals\n- Goals: [...]\n- Non-Goals: [...]\n\n## Decisions\n- Decision: [\u5185\u5BB9\u548C\u539F\u56E0]\n- Alternatives considered: [\u9009\u9879 + \u7406\u7531]\n\n## Risks / Trade-offs\n- [\u98CE\u9669] \u2192 \u7F13\u89E3\u63AA\u65BD\n\n## Migration Plan\n[\u6B65\u9AA4\u3001\u56DE\u6EDA]\n\n## Open Questions\n- [...]\n```\n\n## \u89C4\u8303\u6587\u4EF6\u683C\u5F0F\n\n### \u5173\u952E\uFF1A\u573A\u666F\u683C\u5F0F\n\n**\u6B63\u786E**\uFF08\u4F7F\u7528 #### \u6807\u9898\uFF09\uFF1A\n```markdown\n#### Scenario: User login success\n- **WHEN** valid credentials provided\n- **THEN** return JWT token\n```\n\n**\u9519\u8BEF**\uFF08\u4E0D\u8981\u4F7F\u7528\u9879\u76EE\u7B26\u53F7\u6216\u7C97\u4F53\uFF09\uFF1A\n```markdown\n- **Scenario: User login** \u274C\n**Scenario**: User login \u274C\n### Scenario: User login \u274C\n```\n\n\u6BCF\u4E2A\u8981\u6C42\u5FC5\u987B\u81F3\u5C11\u6709\u4E00\u4E2A\u573A\u666F\u3002\n\n### \u8981\u6C42\u63AA\u8F9E\n- \u5BF9\u89C4\u8303\u6027\u8981\u6C42\u4F7F\u7528 SHALL/MUST\uFF08\u9664\u975E\u6709\u610F\u975E\u89C4\u8303\u6027\uFF0C\u5426\u5219\u907F\u514D\u4F7F\u7528 should/may\uFF09\n\n### \u589E\u91CF\u64CD\u4F5C\n\n- `## ADDED Requirements` - \u65B0\u529F\u80FD\n- `## MODIFIED Requirements` - \u66F4\u6539\u7684\u884C\u4E3A\n- `## REMOVED Requirements` - \u5DF2\u5F03\u7528\u7684\u529F\u80FD\n- `## RENAMED Requirements` - \u540D\u79F0\u66F4\u6539\n\n\u6807\u9898\u4F7F\u7528 `trim(header)` \u5339\u914D - \u5FFD\u7565\u7A7A\u767D\u3002\n\n#### \u4F55\u65F6\u4F7F\u7528 ADDED vs MODIFIED\n- ADDED\uFF1A\u5F15\u5165\u4E00\u4E2A\u65B0\u7684\u529F\u80FD\u6216\u5B50\u529F\u80FD\uFF0C\u53EF\u4EE5\u72EC\u7ACB\u4F5C\u4E3A\u8981\u6C42\u3002\u5F53\u66F4\u6539\u662F\u6B63\u4EA4\u7684\uFF08\u4F8B\u5982\uFF0C\u6DFB\u52A0\"\u659C\u6760\u547D\u4EE4\u914D\u7F6E\"\uFF09\u800C\u4E0D\u662F\u6539\u53D8\u73B0\u6709\u8981\u6C42\u7684\u8BED\u4E49\u65F6\uFF0C\u4F18\u5148\u4F7F\u7528 ADDED\u3002\n- MODIFIED\uFF1A\u66F4\u6539\u73B0\u6709\u8981\u6C42\u7684\u884C\u4E3A\u3001\u8303\u56F4\u6216\u9A8C\u6536\u6807\u51C6\u3002\u59CB\u7EC8\u7C98\u8D34\u5B8C\u6574\u7684\u3001\u66F4\u65B0\u7684\u8981\u6C42\u5185\u5BB9\uFF08\u6807\u9898 + \u6240\u6709\u573A\u666F\uFF09\u3002\u5F52\u6863\u5668\u5C06\u7528\u60A8\u5728\u6B64\u5904\u63D0\u4F9B\u7684\u5185\u5BB9\u66FF\u6362\u6574\u4E2A\u8981\u6C42\uFF1B\u90E8\u5206\u589E\u91CF\u5C06\u4E22\u5931\u5148\u524D\u7684\u8BE6\u7EC6\u4FE1\u606F\u3002\n- RENAMED\uFF1A\u4EC5\u5728\u540D\u79F0\u66F4\u6539\u65F6\u4F7F\u7528\u3002\u5982\u679C\u60A8\u8FD8\u66F4\u6539\u884C\u4E3A\uFF0C\u8BF7\u4F7F\u7528 RENAMED\uFF08\u540D\u79F0\uFF09\u52A0\u4E0A MODIFIED\uFF08\u5185\u5BB9\uFF09\uFF0C\u5F15\u7528\u65B0\u540D\u79F0\u3002\n\n\u5E38\u89C1\u9677\u9631\uFF1A\u4F7F\u7528 MODIFIED \u6DFB\u52A0\u65B0\u5173\u6CE8\u70B9\u800C\u4E0D\u5305\u542B\u5148\u524D\u7684\u6587\u672C\u3002\u8FD9\u4F1A\u5728\u5F52\u6863\u65F6\u5BFC\u81F4\u8BE6\u7EC6\u4FE1\u606F\u4E22\u5931\u3002\u5982\u679C\u60A8\u6CA1\u6709\u660E\u786E\u66F4\u6539\u73B0\u6709\u8981\u6C42\uFF0C\u8BF7\u5728 ADDED \u4E0B\u6DFB\u52A0\u65B0\u8981\u6C42\u3002\n\n\u6B63\u786E\u7F16\u5199 MODIFIED \u8981\u6C42\uFF1A\n1) \u5728 `zhuanspec/specs/<capability>/spec.md` \u4E2D\u627E\u5230\u73B0\u6709\u8981\u6C42\u3002\n2) \u590D\u5236\u6574\u4E2A\u8981\u6C42\u5757\uFF08\u4ECE `### Requirement: ...` \u5230\u5176\u573A\u666F\uFF09\u3002\n3) \u5C06\u5176\u7C98\u8D34\u5230 `## MODIFIED Requirements` \u4E0B\u5E76\u7F16\u8F91\u4EE5\u53CD\u6620\u65B0\u884C\u4E3A\u3002\n4) \u786E\u4FDD\u6807\u9898\u6587\u672C\u5B8C\u5168\u5339\u914D\uFF08\u5FFD\u7565\u7A7A\u767D\uFF09\u5E76\u81F3\u5C11\u4FDD\u7559\u4E00\u4E2A `#### Scenario:`\u3002\n\nRENAMED \u793A\u4F8B\uFF1A\n```markdown\n## RENAMED Requirements\n- FROM: `### Requirement: Login`\n- TO: `### Requirement: User Authentication`\n```\n\n## \u6545\u969C\u6392\u9664\n\n### \u5E38\u89C1\u9519\u8BEF\n\n**\"\u53D8\u66F4\u5FC5\u987B\u81F3\u5C11\u6709\u4E00\u4E2A\u589E\u91CF\"**\n- \u68C0\u67E5 `changes/[name]/specs/` \u662F\u5426\u5B58\u5728 .md \u6587\u4EF6\n- \u9A8C\u8BC1\u6587\u4EF6\u5177\u6709\u64CD\u4F5C\u524D\u7F00\uFF08## ADDED Requirements\uFF09\n\n**\"\u8981\u6C42\u5FC5\u987B\u81F3\u5C11\u6709\u4E00\u4E2A\u573A\u666F\"**\n- \u68C0\u67E5\u573A\u666F\u662F\u5426\u4F7F\u7528 `#### Scenario:` \u683C\u5F0F\uFF084 \u4E2A\u4E95\u53F7\uFF09\n- \u4E0D\u8981\u5BF9\u573A\u666F\u6807\u9898\u4F7F\u7528\u9879\u76EE\u7B26\u53F7\u6216\u7C97\u4F53\n\n**\u9759\u9ED8\u573A\u666F\u89E3\u6790\u5931\u8D25**\n- \u9700\u8981\u7CBE\u786E\u683C\u5F0F\uFF1A`#### Scenario: Name`\n- \u4F7F\u7528\u4EE5\u4E0B\u547D\u4EE4\u8C03\u8BD5\uFF1A`zhuanspec show [change] --json --deltas-only`\n\n### \u9A8C\u8BC1\u63D0\u793A\n\n```bash\n# \u59CB\u7EC8\u4F7F\u7528\u4E25\u683C\u6A21\u5F0F\u8FDB\u884C\u5168\u9762\u68C0\u67E5\nzhuanspec validate [change] --strict\n\n# \u8C03\u8BD5\u589E\u91CF\u89E3\u6790\nzhuanspec show [change] --json | jq '.deltas'\n\n# \u68C0\u67E5\u7279\u5B9A\u8981\u6C42\nzhuanspec show [spec] --json -r 1\n```\n\n## \u7406\u60F3\u8DEF\u5F84\u811A\u672C\n\n```bash\n# 1) \u63A2\u7D22\u5F53\u524D\u72B6\u6001\nzhuanspec spec list --long\nzhuanspec list\n# \u53EF\u9009\u5168\u6587\u641C\u7D22\uFF1A\n# rg -n \"Requirement:|Scenario:\" zhuanspec/specs\n# rg -n \"^#|Requirement:\" zhuanspec/changes\n\n# 2) \u9009\u62E9\u53D8\u66F4 ID \u5E76\u642D\u5EFA\nCHANGE=add-two-factor-auth\nmkdir -p zhuanspec/changes/$CHANGE/{specs/auth}\nprintf \"## Why\\n...\\n\\n## What Changes\\n- ...\\n\\n## Impact\\n- ...\\n\" > zhuanspec/changes/$CHANGE/proposal.md\nprintf \"## 1. Implementation\\n- [ ] 1.1 ...\\n\" > zhuanspec/changes/$CHANGE/tasks.md\n\n# 3) \u6DFB\u52A0\u589E\u91CF\uFF08\u793A\u4F8B\uFF09\ncat > zhuanspec/changes/$CHANGE/specs/auth/spec.md << 'EOF'\n## ADDED Requirements\n### Requirement: \u53CC\u56E0\u7D20\u8BA4\u8BC1\n\u7528\u6237 MUST \u5728\u767B\u5F55\u65F6\u63D0\u4F9B\u7B2C\u4E8C\u4E2A\u8BA4\u8BC1\u56E0\u7D20\u3002\n\n#### Scenario: \u9700\u8981 OTP\n- **WHEN** \u63D0\u4F9B\u4E86\u6709\u6548\u51ED\u636E\n- **THEN** \u9700\u8981 OTP \u6311\u6218\nEOF\n\n# 4) \u9A8C\u8BC1\nzhuanspec validate $CHANGE --strict\n```\n\n## Multi-Capability Example\n\n```\nzhuanspec/changes/add-2fa-notify/\n\u251C\u2500\u2500 proposal.md\n\u251C\u2500\u2500 tasks.md\n\u2514\u2500\u2500 specs/\n \u251C\u2500\u2500 auth/\n \u2502 \u2514\u2500\u2500 spec.md # ADDED: \u53CC\u56E0\u7D20\u8BA4\u8BC1\n \u2514\u2500\u2500 notifications/\n \u2514\u2500\u2500 spec.md # ADDED: OTP \u90AE\u4EF6\u901A\u77E5\n```\n\nauth/spec.md\n```markdown\n## ADDED Requirements\n### Requirement: \u53CC\u56E0\u7D20\u8BA4\u8BC1\n...\n```\n\nnotifications/spec.md\n```markdown\n## ADDED Requirements\n### Requirement: OTP \u90AE\u4EF6\u901A\u77E5\n...\n```\n\n## \u6700\u4F73\u5B9E\u8DF5\n\n### \u7B80\u5355\u4F18\u5148\n- \u9ED8\u8BA4\u65B0\u589E\u4EE3\u7801 <100 \u884C\n- \u5355\u6587\u4EF6\u5B9E\u73B0\uFF0C\u76F4\u5230\u8BC1\u660E\u4E0D\u8DB3\n- \u907F\u514D\u6CA1\u6709\u660E\u786E\u7406\u7531\u7684\u6846\u67B6\n- \u9009\u62E9\u65E0\u804A\u4F46\u7ECF\u8FC7\u9A8C\u8BC1\u7684\u6A21\u5F0F\n\n### \u590D\u6742\u6027\u89E6\u53D1\u6761\u4EF6\n\u4EC5\u5728\u4EE5\u4E0B\u60C5\u51B5\u4E0B\u6DFB\u52A0\u590D\u6742\u6027\uFF1A\n- \u6027\u80FD\u6570\u636E\u8868\u660E\u5F53\u524D\u89E3\u51B3\u65B9\u6848\u592A\u6162\n- \u5177\u4F53\u7684\u89C4\u6A21\u8981\u6C42\uFF08>1000 \u7528\u6237\uFF0C>100MB \u6570\u636E\uFF09\n- \u591A\u4E2A\u7ECF\u8FC7\u9A8C\u8BC1\u7684\u7528\u4F8B\u9700\u8981\u62BD\u8C61\n\n### \u6E05\u6670\u7684\u5F15\u7528\n- \u4F7F\u7528 `file.ts:42` \u683C\u5F0F\u8868\u793A\u4EE3\u7801\u4F4D\u7F6E\n- \u5C06\u89C4\u8303\u5F15\u7528\u4E3A `specs/auth/spec.md`\n- \u94FE\u63A5\u76F8\u5173\u53D8\u66F4\u548C PR\n\n### \u529F\u80FD\u547D\u540D\n- \u4F7F\u7528\u52A8\u8BCD-\u540D\u8BCD\uFF1A`user-auth`\u3001`payment-capture`\n- \u6BCF\u4E2A\u529F\u80FD\u5355\u4E00\u76EE\u7684\n- 10 \u5206\u949F\u53EF\u7406\u89E3\u6027\u89C4\u5219\n- \u5982\u679C\u63CF\u8FF0\u9700\u8981\"AND\"\uFF0C\u5219\u62C6\u5206\n\n### \u53D8\u66F4 ID \u547D\u540D\n- \u4F7F\u7528 kebab-case\uFF0C\u7B80\u77ED\u4E14\u63CF\u8FF0\u6027\uFF1A`add-two-factor-auth`\n- \u4F18\u5148\u4F7F\u7528\u52A8\u8BCD\u5F00\u5934\u7684\u524D\u7F00\uFF1A`add-`\u3001`update-`\u3001`remove-`\u3001`refactor-`\n- \u786E\u4FDD\u552F\u4E00\u6027\uFF1B\u5982\u679C\u5DF2\u4F7F\u7528\uFF0C\u8FFD\u52A0 `-2`\u3001`-3` \u7B49\n\n## \u5DE5\u5177\u9009\u62E9\u6307\u5357\n\n| \u4EFB\u52A1 | \u5DE5\u5177 | \u539F\u56E0 |\n|------|------|-----|\n| \u6309\u6A21\u5F0F\u67E5\u627E\u6587\u4EF6 | Glob | \u5FEB\u901F\u6A21\u5F0F\u5339\u914D |\n| \u641C\u7D22\u4EE3\u7801\u5185\u5BB9 | Grep | \u4F18\u5316\u7684\u6B63\u5219\u8868\u8FBE\u5F0F\u641C\u7D22 |\n| \u8BFB\u53D6\u7279\u5B9A\u6587\u4EF6 | Read | \u76F4\u63A5\u6587\u4EF6\u8BBF\u95EE |\n| \u63A2\u7D22\u672A\u77E5\u8303\u56F4 | Task | \u591A\u6B65\u9AA4\u8C03\u67E5 |\n\n## \u9519\u8BEF\u6062\u590D\n\n### \u53D8\u66F4\u51B2\u7A81\n1. \u8FD0\u884C `zhuanspec list` \u67E5\u770B\u6D3B\u52A8\u53D8\u66F4\n2. \u68C0\u67E5\u91CD\u53E0\u7684\u89C4\u8303\n3. \u4E0E\u53D8\u66F4\u6240\u6709\u8005\u534F\u8C03\n4. \u8003\u8651\u5408\u5E76\u63D0\u6848\n\n### \u9A8C\u8BC1\u5931\u8D25\n1. \u4F7F\u7528 `--strict` \u6807\u5FD7\u8FD0\u884C\n2. \u68C0\u67E5 JSON \u8F93\u51FA\u4EE5\u83B7\u53D6\u8BE6\u7EC6\u4FE1\u606F\n3. \u9A8C\u8BC1\u89C4\u8303\u6587\u4EF6\u683C\u5F0F\n4. \u786E\u4FDD\u573A\u666F\u683C\u5F0F\u6B63\u786E\n\n### \u7F3A\u5C11\u4E0A\u4E0B\u6587\n1. \u9996\u5148\u9605\u8BFB project.md\n2. \u68C0\u67E5\u76F8\u5173\u89C4\u8303\n3. \u5BA1\u67E5\u6700\u8FD1\u7684\u5F52\u6863\n4. \u8BF7\u6C42\u6F84\u6E05\n\n## \u5FEB\u901F\u53C2\u8003\n\n### \u9636\u6BB5\u6307\u793A\u5668\n- `changes/` - \u5DF2\u63D0\u8BAE\uFF0C\u5C1A\u672A\u6784\u5EFA\n- `specs/` - \u5DF2\u6784\u5EFA\u5E76\u90E8\u7F72\n- `archive/` - \u5DF2\u5B8C\u6210\u7684\u53D8\u66F4\n\n### \u6587\u4EF6\u7528\u9014\n- `proposal.md` - \u539F\u56E0\u548C\u5185\u5BB9\n- `tasks.md` - \u5B9E\u65BD\u6B65\u9AA4\n- `design.md` - \u6280\u672F\u51B3\u7B56\n- `spec.md` - \u8981\u6C42\u548C\u884C\u4E3A\n\n### CLI \u8981\u70B9\n```bash\nzhuanspec list # \u6B63\u5728\u8FDB\u884C\u4EC0\u4E48\uFF1F\nzhuanspec show [item] # \u67E5\u770B\u8BE6\u7EC6\u4FE1\u606F\nzhuanspec validate --strict # \u662F\u5426\u6B63\u786E\uFF1F\nzhuanspec archive <change-id> [--yes|-y] # \u6807\u8BB0\u5B8C\u6210\uFF08\u6DFB\u52A0 --yes \u7528\u4E8E\u81EA\u52A8\u5316\uFF09\n```\n\n\u8BB0\u4F4F\uFF1A\u89C4\u8303\u662F\u771F\u76F8\u3002\u53D8\u66F4\u662F\u63D0\u6848\u3002\u4FDD\u6301\u5B83\u4EEC\u540C\u6B65\u3002\n";
|
|
1
|
+
export declare const agentsTemplate = "# ZhuanSpec \u4F7F\u7528\u8BF4\u660E\n\n\u9762\u5411\u4F7F\u7528 ZhuanSpec \u8FDB\u884C\u89C4\u8303\u9A71\u52A8\u5F00\u53D1\u7684 AI \u7F16\u7A0B\u52A9\u624B\u7684\u8BF4\u660E\u6587\u6863\u3002\n\n## \u5FEB\u901F\u68C0\u67E5\u6E05\u5355\n\n- \u641C\u7D22\u73B0\u6709\u5DE5\u4F5C\uFF1A`zhuanspec spec list --long`\u3001`zhuanspec list`\uFF08\u4EC5\u4F7F\u7528 `rg` \u8FDB\u884C\u5168\u6587\u641C\u7D22\uFF09\n- \u786E\u5B9A\u8303\u56F4\uFF1A\u65B0\u529F\u80FD vs \u4FEE\u6539\u73B0\u6709\u529F\u80FD\n- \u9009\u62E9\u552F\u4E00\u7684 `change-id`\uFF1Akebab-case \u683C\u5F0F\uFF0C\u52A8\u8BCD\u5F00\u5934\uFF08`add-`\u3001`update-`\u3001`remove-`\u3001`refactor-`\uFF09\n- \u642D\u5EFA\u7ED3\u6784\uFF1A`proposal.md`\u3001`tasks.md`\u3001`design.md`\uFF08\u4EC5\u5728\u9700\u8981\u65F6\uFF09\uFF0C\u4EE5\u53CA\u6BCF\u4E2A\u53D7\u5F71\u54CD\u529F\u80FD\u7684\u89C4\u8303\u589E\u91CF\n- \u7F16\u5199\u589E\u91CF\uFF1A\u4F7F\u7528 `## ADDED|MODIFIED|REMOVED|RENAMED Requirements`\uFF1B\u6BCF\u4E2A\u8981\u6C42\u81F3\u5C11\u5305\u542B\u4E00\u4E2A `#### Scenario:`\n- \u9A8C\u8BC1\uFF1A\u8FD0\u884C `zhuanspec validate [change-id] --strict` \u5E76\u4FEE\u590D\u95EE\u9898\n- \u8BF7\u6C42\u6279\u51C6\uFF1A\u5728\u63D0\u6848\u83B7\u5F97\u6279\u51C6\u4E4B\u524D\u4E0D\u8981\u5F00\u59CB\u5B9E\u65BD\n\n## \u4E09\u9636\u6BB5\u5DE5\u4F5C\u6D41\n\n### \u9636\u6BB5 1\uFF1A\u521B\u5EFA\u53D8\u66F4\n\u5728\u4EE5\u4E0B\u60C5\u51B5\u4E0B\u521B\u5EFA\u63D0\u6848\uFF1A\n- \u6DFB\u52A0\u529F\u80FD\u6216\u7279\u6027\n- \u8FDB\u884C\u7834\u574F\u6027\u66F4\u6539\uFF08API\u3001schema\uFF09\n- \u66F4\u6539\u67B6\u6784\u6216\u6A21\u5F0F\n- \u4F18\u5316\u6027\u80FD\uFF08\u6539\u53D8\u884C\u4E3A\uFF09\n- \u66F4\u65B0\u5B89\u5168\u6A21\u5F0F\n\n\u89E6\u53D1\u8BCD\u793A\u4F8B\uFF1A\n- \"\u5E2E\u6211\u521B\u5EFA\u4E00\u4E2A\u53D8\u66F4\u63D0\u6848\"\n- \"\u5E2E\u6211\u89C4\u5212\u4E00\u4E2A\u53D8\u66F4\"\n- \"\u5E2E\u6211\u521B\u5EFA\u4E00\u4E2A\u63D0\u6848\"\n- \"\u6211\u60F3\u521B\u5EFA\u4E00\u4E2A\u89C4\u8303\u63D0\u6848\"\n- \"\u6211\u60F3\u521B\u5EFA\u4E00\u4E2A\u89C4\u8303\"\n\n\u5BBD\u677E\u5339\u914D\u6307\u5BFC\uFF1A\n- \u5305\u542B\u4EE5\u4E0B\u4E4B\u4E00\uFF1A`proposal`\u3001`change`\u3001`spec`\n- \u4E0E\u4EE5\u4E0B\u4E4B\u4E00\u7EC4\u5408\uFF1A`create`\u3001`plan`\u3001`make`\u3001`start`\u3001`help`\n\n\u8DF3\u8FC7\u63D0\u6848\u7684\u60C5\u51B5\uFF1A\n- Bug \u4FEE\u590D\uFF08\u6062\u590D\u9884\u671F\u884C\u4E3A\uFF09\n- \u62FC\u5199\u9519\u8BEF\u3001\u683C\u5F0F\u3001\u6CE8\u91CA\n- \u4F9D\u8D56\u66F4\u65B0\uFF08\u975E\u7834\u574F\u6027\uFF09\n- \u914D\u7F6E\u66F4\u6539\n- \u73B0\u6709\u884C\u4E3A\u7684\u6D4B\u8BD5\n\n**\u5DE5\u4F5C\u6D41**\n0. \u5BA1\u67E5 `zhuanspec/project.md`\u3001`zhuanspec list` \u548C `zhuanspec list --specs` \u4EE5\u4E86\u89E3\u5F53\u524D\u4E0A\u4E0B\u6587\u3002\n1. **\u5F3A\u5236\u6F84\u6E05\u68C0\u67E5\uFF08\u5FC5\u987B\u9996\u5148\u6267\u884C\uFF09**\uFF1A\u5206\u6790\u7528\u6237\u8BF7\u6C42\uFF0C\u8BC6\u522B\u6240\u6709\u4E0D\u786E\u5B9A\u6216\u6A21\u7CCA\u7684\u65B9\u9762\uFF08\u8303\u56F4\u3001\u6280\u672F\u9009\u62E9\u3001\u5B9E\u73B0\u7EC6\u8282\u3001\u6570\u636E\u83B7\u53D6\u6765\u6E90\u3001\u670D\u52A1\u5206\u5C42\u3001\u4F9D\u8D56\u5173\u7CFB\u3001\u4F18\u5148\u7EA7\u3001\u9A8C\u6536\u6807\u51C6\u7B49......\uFF09\u3002\u5982\u679C\u53D1\u73B0\u4EFB\u4F55\u6A21\u7CCA\u4E4B\u5904\uFF0C\u5FC5\u987B\u505C\u6B62\u5E76\u4F7F\u7528**\u9009\u9879\u5F0F\u4EA4\u4E92**\uFF08\u5982 `AskQuestion` \u5DE5\u5177\uFF09\u63D0\u95EE\uFF0C\u83B7\u5F97\u660E\u786E\u7B54\u590D\u540E\u624D\u80FD\u7EE7\u7EED\u3002\u4E25\u7981\u5728\u4E0D\u786E\u5B9A\u7684\u60C5\u51B5\u4E0B\u81EA\u884C\u63A8\u6D4B\u6216\u521B\u5EFA\u63D0\u6848\uFF0C\u4E25\u7981\u8981\u6C42\u7528\u6237\u624B\u52A8\u8F93\u5165\u5927\u6BB5\u6587\u5B57\u3002\n\n \u26A0\uFE0F **CHECKPOINT [PRE-CLARIFICATION]**:\n You MUST record the pre-clarification result in tasks.md under \"## Pre-Clarification Log\":\n - If questions were asked: Record each question and the user's answer\n - If no clarification needed: Write \"Status: COMPLETED - No clarification needed\" with brief justification\n - This section MUST NOT be empty or contain only HTML comments\n - NEVER proceed to proposal writing without completing this checkpoint\n\n2. \u9009\u62E9\u4E00\u4E2A\u552F\u4E00\u7684\u52A8\u8BCD\u5F00\u5934\u7684 `change-id`\uFF0C\u5E76\u5728 `zhuanspec/changes/<id>/` \u4E0B\u642D\u5EFA `proposal.md`\u3001`tasks.md`\u3001\u53EF\u9009\u7684 `design.md` \u548C\u89C4\u8303\u589E\u91CF\u3002\n3. \u4F7F\u7528 `## ADDED|MODIFIED|REMOVED Requirements` \u8D77\u8349\u89C4\u8303\u589E\u91CF\uFF0C\u6BCF\u4E2A\u8981\u6C42\u81F3\u5C11\u5305\u542B\u4E00\u4E2A `#### Scenario:`\u3002\n4. \u8FD0\u884C `zhuanspec validate <id> --strict` \u5E76\u5728\u5206\u4EAB\u63D0\u6848\u4E4B\u524D\u89E3\u51B3\u6240\u6709\u95EE\u9898\u3002\n\n### \u9636\u6BB5 2\uFF1A\u5B9E\u65BD\u53D8\u66F4\n\u5C06\u8FD9\u4E9B\u6B65\u9AA4\u4F5C\u4E3A\u5F85\u529E\u4E8B\u9879\u8DDF\u8E2A\uFF0C\u9010\u4E00\u5B8C\u6210\u3002\n1. **\u9605\u8BFB proposal.md** - \u4E86\u89E3\u8981\u6784\u5EFA\u7684\u5185\u5BB9\n2. **\u9605\u8BFB design.md**\uFF08\u5982\u679C\u5B58\u5728\uFF09 - \u5BA1\u67E5\u6280\u672F\u51B3\u7B56\n3. **\u9605\u8BFB tasks.md** - \u83B7\u53D6\u5B9E\u65BD\u6E05\u5355\n4. **\u6309\u987A\u5E8F\u5B9E\u65BD\u4EFB\u52A1** - \u6309\u987A\u5E8F\u5B8C\u6210\u3002\u5982\u679C\u4EFB\u52A1\u6807\u6CE8\u4E86 `@skill:<skill-name>`\uFF0C\u76F4\u63A5\u8C03\u7528\u5BF9\u5E94 skill\n5. **\u786E\u8BA4\u5B8C\u6210** - \u5728\u66F4\u65B0\u72B6\u6001\u4E4B\u524D\u786E\u4FDD `tasks.md` \u4E2D\u7684\u6BCF\u4E2A\u9879\u76EE\u90FD\u5DF2\u5B8C\u6210\n6. **\u66F4\u65B0\u6E05\u5355** - \u6240\u6709\u5DE5\u4F5C\u5B8C\u6210\u540E\uFF0C\u5C06\u6BCF\u4E2A\u4EFB\u52A1\u8BBE\u7F6E\u4E3A `- [x]`\uFF0C\u4EE5\u4FBF\u5217\u8868\u53CD\u6620\u5B9E\u9645\u60C5\u51B5\n7. **\u4EE3\u7801\u5BA1\u67E5**\uFF08\u53EF\u9009\uFF09 - \u57FA\u4E8E\u751F\u6210\u7684\u4E0A\u4E0B\u6587\u6587\u4EF6\u5BA1\u67E5\u5DF2\u5B9E\u65BD\u7684\u4EE3\u7801\uFF0C\u68C0\u67E5\uFF1A\n - \u4EE3\u7801\u89C4\u8303\u548C\u7EA6\u5B9A\u5408\u89C4\u6027\n - \u903B\u8F91\u6B63\u786E\u6027\n - \u6027\u80FD\u95EE\u9898\u548C\u6F5C\u5728\u74F6\u9888\n - \u5B89\u5168\u6027\u95EE\u9898\n - \u6700\u4F73\u5B9E\u8DF5\u9075\u5FAA\u60C5\u51B5\n - \u5BF9\u4E8E Java \u4EE3\u7801\uFF1A\u7279\u522B\u5173\u6CE8 Java \u7279\u5B9A\u7684\u6A21\u5F0F\u3001\u7EA6\u5B9A\u548C\u6F5C\u5728\u95EE\u9898\n - \u6B64\u6B65\u9AA4\u662F\u53EF\u9009\u7684\uFF0C\u5982\u679C\u8DF3\u8FC7\u4E0D\u4F1A\u963B\u585E\u5DE5\u4F5C\u6D41\n - \u5982\u679C\u53D1\u73B0\u95EE\u9898\uFF0C\u5E94\u5728\u5F52\u6863\u4E4B\u524D\u89E3\u51B3\n8. **\u6279\u51C6\u95E8\u69DB** - \u5728\u63D0\u6848\u7ECF\u8FC7\u5BA1\u67E5\u548C\u6279\u51C6\u4E4B\u524D\u4E0D\u8981\u5F00\u59CB\u5B9E\u65BD\n\n### \u9636\u6BB5 3\uFF1A\u5F52\u6863\u53D8\u66F4\n\u90E8\u7F72\u540E\uFF0C\u521B\u5EFA\u5355\u72EC\u7684 PR\uFF1A\n- \u5C06 `changes/[name]/` \u2192 `changes/archive/YYYY-MM-DD-[name]/`\n- \u5982\u679C\u529F\u80FD\u5DF2\u66F4\u6539\uFF0C\u66F4\u65B0 `specs/`\n- \u5BF9\u4E8E\u4EC5\u5DE5\u5177\u7C7B\u7684\u53D8\u66F4\uFF0C\u4F7F\u7528 `zhuanspec archive <change-id> --skip-specs --yes`\uFF08\u59CB\u7EC8\u663E\u5F0F\u4F20\u9012\u53D8\u66F4 ID\uFF09\n- \u8FD0\u884C `zhuanspec validate --strict` \u4EE5\u786E\u8BA4\u5F52\u6863\u7684\u53D8\u66F4\u901A\u8FC7\u68C0\u67E5\n\n## \u6267\u884C\u4EFB\u4F55\u4EFB\u52A1\u4E4B\u524D\n\n**\u4E0A\u4E0B\u6587\u68C0\u67E5\u6E05\u5355\uFF1A**\n- [ ] \u5728 `specs/[capability]/spec.md` \u4E2D\u9605\u8BFB\u76F8\u5173\u89C4\u8303\n- [ ] \u68C0\u67E5 `changes/` \u4E2D\u7684\u5F85\u5904\u7406\u53D8\u66F4\u662F\u5426\u5B58\u5728\u51B2\u7A81\n- [ ] \u9605\u8BFB `zhuanspec/project.md` \u4E86\u89E3\u7EA6\u5B9A\n- [ ] \u8FD0\u884C `zhuanspec list` \u67E5\u770B\u6D3B\u52A8\u53D8\u66F4\n- [ ] \u8FD0\u884C `zhuanspec list --specs` \u67E5\u770B\u73B0\u6709\u529F\u80FD\n\n**\u521B\u5EFA\u89C4\u8303\u4E4B\u524D\uFF1A**\n- \u59CB\u7EC8\u68C0\u67E5\u529F\u80FD\u662F\u5426\u5DF2\u5B58\u5728\n- \u4F18\u5148\u4FEE\u6539\u73B0\u6709\u89C4\u8303\u800C\u4E0D\u662F\u521B\u5EFA\u91CD\u590D\u9879\n- \u4F7F\u7528 `zhuanspec show [spec]` \u5BA1\u67E5\u5F53\u524D\u72B6\u6001\n- **\u5F3A\u5236\u6F84\u6E05\u8981\u6C42**\uFF1A\u5982\u679C\u8BF7\u6C42\u6709\u4EFB\u4F55\u4E0D\u660E\u786E\u3001\u6A21\u7CCA\u6216\u4E0D\u786E\u5B9A\u7684\u65B9\u9762\uFF0C\u5FC5\u987B\u505C\u6B62\u5E76\u4F7F\u7528**\u9009\u9879\u5F0F\u4EA4\u4E92**\u63D0\u95EE\u3002\u4E25\u7981\u5728\u4E0D\u786E\u5B9A\u7684\u60C5\u51B5\u4E0B\u81EA\u884C\u63A8\u6D4B\u3001\u5047\u8BBE\u6216\u7EE7\u7EED\u521B\u5EFA\u6587\u4EF6\u3002\u4E25\u7981\u8981\u6C42\u7528\u6237\u624B\u52A8\u8F93\u5165\u5927\u6BB5\u6587\u5B57\u56DE\u7B54\u3002\n\n## \u5F3A\u5236\u6F84\u6E05\u5DE5\u4F5C\u6D41\n\n\u5728\u521B\u5EFA\u4EFB\u4F55\u63D0\u6848\u6587\u4EF6\u4E4B\u524D\uFF0C\u5FC5\u987B\u6267\u884C\u5F3A\u5236\u6F84\u6E05\u68C0\u67E5\u3002\u8FD9\u662F\u4E0D\u53EF\u8DF3\u8FC7\u7684\u6B65\u9AA4\u3002\n\n**\u91CD\u8981\u539F\u5219\uFF1A\u5148\u67E5\u9605\u540E\u8BE2\u95EE\uFF0C\u907F\u514D\u8FC7\u5EA6\u8BE2\u95EE**\n\n\u5728\u8BE2\u95EE\u4E4B\u524D\uFF0C\u5FC5\u987B\u5148\u67E5\u9605\u4EE5\u4E0B\u6765\u6E90\uFF0C\u53EA\u6709\u5728\u786E\u5B9E\u65E0\u6CD5\u4ECE\u8FD9\u4E9B\u6765\u6E90\u786E\u5B9A\u65F6\u624D\u8BE2\u95EE\uFF1A\n- \u73B0\u6709\u89C4\u8303\uFF08`zhuanspec/specs/`\uFF09\n- \u9879\u76EE\u7EA6\u5B9A\uFF08`zhuanspec/project.md`\uFF09\n- \u4EE3\u7801\u5E93\u7ED3\u6784\u548C\u73B0\u6709\u6A21\u5F0F\n- \u4E0A\u4E0B\u6587\u6587\u4EF6\u548C\u76F8\u5173\u53D8\u66F4\n\n### \u4F55\u65F6\u9700\u8981\u6F84\u6E05\n\n\u5728\u4EE5\u4E0B\u60C5\u51B5\u4E0B\uFF0C**\u4E14\u65E0\u6CD5\u4ECE\u73B0\u6709\u89C4\u8303\u3001\u9879\u76EE\u7EA6\u5B9A\u3001\u4EE3\u7801\u5E93\u7ED3\u6784\u4E2D\u786E\u5B9A\u65F6**\uFF0C\u5FC5\u987B\u505C\u6B62\u5E76\u63D0\u95EE\uFF08\u5305\u62EC\u4F46\u4E0D\u9650\u4E8E\uFF09\uFF1A\n- **\u8303\u56F4\u4E0D\u660E\u786E**\uFF1A\u7528\u6237\u8BF7\u6C42\u7684\u8303\u56F4\u8FB9\u754C\u4E0D\u6E05\u695A\uFF08\u4F8B\u5982\uFF1A\"\u6539\u8FDB\u6027\u80FD\"\u3001\"\u4F18\u5316\u4EE3\u7801\"\uFF09\n- **\u6280\u672F\u9009\u62E9\u4E0D\u660E\u786E**\uFF1A\u6709\u591A\u79CD\u5B9E\u73B0\u65B9\u5F0F\uFF0C\u4F46\u7528\u6237\u672A\u6307\u5B9A\u504F\u597D\uFF0C\u4E14\u65E0\u6CD5\u4ECE\u73B0\u6709\u4EE3\u7801\u6A21\u5F0F\u4E2D\u786E\u5B9A\uFF08\u4F8B\u5982\uFF1A\u4F7F\u7528\u54EA\u79CD\u6570\u636E\u5E93\u3001\u54EA\u79CD\u6846\u67B6\uFF09\n- **\u4F18\u5148\u7EA7\u4E0D\u660E\u786E**\uFF1A\u591A\u4E2A\u9700\u6C42\u4F46\u672A\u8BF4\u660E\u4F18\u5148\u7EA7\u6216\u987A\u5E8F\n- **\u9A8C\u6536\u6807\u51C6\u4E0D\u660E\u786E**\uFF1A\u4E0D\u6E05\u695A\u5982\u4F55\u5224\u65AD\u5B8C\u6210\u6216\u6210\u529F\n- **\u5B9E\u73B0\u7EC6\u8282\u4E0D\u660E\u786E**\uFF1A\u4E0D\u6E05\u695A\u5982\u4F55\u5B9E\u73B0\u6216\u5B9E\u73B0\u7EC6\u8282\u4E0D\u660E\u786E\uFF0C\u4E14\u65E0\u6CD5\u4ECE\u4EE3\u7801\u5E93\u5206\u6790\u4E2D\u786E\u5B9A\uFF08\u4F8B\u5982\uFF1A\u5982\u4F55\u83B7\u53D6\u6570\u636E\u3001\u5982\u4F55\u5904\u7406\u9519\u8BEF\u3001\u5982\u4F55\u4F18\u5316\u6027\u80FD\uFF09\n- **\u4EE3\u7801\u6539\u52A8\u4F4D\u7F6E\u4E0D\u660E\u786E**\uFF1A\u4E0D\u6E05\u695A\u9700\u8981\u4FEE\u6539\u54EA\u4E9B\u6587\u4EF6\u3001\u5728\u54EA\u4E9B\u4F4D\u7F6E\u8FDB\u884C\u4FEE\u6539\uFF0C\u4E14\u65E0\u6CD5\u4ECE\u4EE3\u7801\u5E93\u7ED3\u6784\u5206\u6790\u4E2D\u786E\u5B9A\n- **\u4EE3\u7801\u5206\u5C42\u67B6\u6784\u4E0D\u660E\u786E**\uFF1A\u5982\u679C\u6D89\u53CA\u670D\u52A1\u5206\u5C42\uFF08\u5982 4 \u5C42\u67B6\u6784\u30013 \u5C42\u67B6\u6784\u7B49\uFF09\uFF0C\u4E0D\u6E05\u695A\u5404\u5C42\u7684\u804C\u8D23\u548C\u6539\u52A8\u4F4D\u7F6E\uFF0C\u4E14\u65E0\u6CD5\u4ECE\u73B0\u6709\u4EE3\u7801\u7ED3\u6784\u6216\u89C4\u8303\u4E2D\u786E\u5B9A\n- **\u6570\u636E\u83B7\u53D6\u6765\u6E90\u4E0D\u660E\u786E**\uFF1A\u4E0D\u6E05\u695A\u4ECE\u54EA\u91CC\u83B7\u53D6\u6570\u636E\uFF0C\u4E14\u65E0\u6CD5\u4ECE\u73B0\u6709\u4EE3\u7801\u6216\u89C4\u8303\u4E2D\u786E\u5B9A\uFF08\u4F8B\u5982\uFF1A\u4ECE\u6570\u636E\u5E93\u3001API\u3001\u6587\u4EF6\u3001\u5916\u90E8\u670D\u52A1\u3001\u5386\u53F2\u903B\u8F91\u590D\u7528\uFF09\n- **\u670D\u52A1\u5206\u5C42\u4E0D\u660E\u786E**\uFF1A\u4E0D\u6E05\u695A\u670D\u52A1\u5206\u5C42\uFF0C\u4E14\u65E0\u6CD5\u4ECE\u73B0\u6709\u4EE3\u7801\u7ED3\u6784\u6216\u89C4\u8303\u4E2D\u786E\u5B9A\uFF08\u4F8B\u5982\uFF1A\u524D\u7AEF\u3001\u540E\u7AEF\u3001\u6570\u636E\u5E93\u3001API\u3001\u670D\u52A1\u30014\u5C42\u67B6\u6784\u30013\u5C42\u67B6\u6784\u30012\u5C42\u67B6\u6784\u3001\u9886\u57DF\u6A21\u578B\uFF09\n- **\u4F9D\u8D56\u5173\u7CFB\u4E0D\u660E\u786E**\uFF1A\u4E0D\u6E05\u695A\u4F9D\u8D56\u5173\u7CFB\uFF0C\u4E14\u65E0\u6CD5\u4ECE\u4EE3\u7801\u5E93\u5206\u6790\u4E2D\u786E\u5B9A\uFF08\u4F8B\u5982\uFF1A\u4F9D\u8D56\u54EA\u4E9B\u670D\u52A1\u3001\u4F9D\u8D56\u54EA\u4E9B\u5E93\u3001\u4F9D\u8D56\u54EA\u4E9B\u7EC4\u4EF6\uFF09\n- **\u4E0A\u4E0B\u6587\u4FE1\u606F\u7F3A\u5931**\uFF1A\u7F3A\u5C11\u5FC5\u8981\u7684\u80CC\u666F\u4FE1\u606F\u6765\u7406\u89E3\u9700\u6C42\uFF0C\u4E14\u65E0\u6CD5\u4ECE\u73B0\u6709\u89C4\u8303\u6216\u4EE3\u7801\u4E2D\u83B7\u53D6\n- **\u6B67\u4E49\u6027\u8868\u8FF0**\uFF1A\u7528\u6237\u8BF7\u6C42\u53EF\u4EE5\u7528\u591A\u79CD\u65B9\u5F0F\u7406\u89E3\uFF0C\u4E14\u65E0\u6CD5\u4ECE\u4E0A\u4E0B\u6587\u786E\u5B9A\n- **\u5176\u4ED6\u4E0D\u660E\u786E**\uFF1A\u5176\u4ED6\u4E0D\u660E\u786E\u7684\u60C5\u51B5\uFF0C\u4E14\u65E0\u6CD5\u4ECE\u73B0\u6709\u6765\u6E90\u786E\u5B9A\n\n### \u4F55\u65F6\u4E0D\u9700\u8981\u6F84\u6E05\n\n\u5728\u4EE5\u4E0B\u60C5\u51B5\u4E0B\uFF0C**\u4E0D\u5E94\u8BE2\u95EE**\uFF0C\u5E94\u76F4\u63A5\u4F7F\u7528\u4ECE\u73B0\u6709\u6765\u6E90\u83B7\u53D6\u7684\u4FE1\u606F\uFF1A\n- **\u4FE1\u606F\u5DF2\u660E\u786E**\uFF1A\u7528\u6237\u8BF7\u6C42\u4E2D\u5DF2\u7ECF\u660E\u786E\u8BF4\u660E\u4E86\u76F8\u5173\u4FE1\u606F\n- **\u53EF\u4ECE\u89C4\u8303\u83B7\u53D6**\uFF1A\u4FE1\u606F\u53EF\u4EE5\u4ECE\u73B0\u6709\u89C4\u8303\uFF08`zhuanspec/specs/`\uFF09\u4E2D\u83B7\u53D6\n- **\u53EF\u4ECE\u9879\u76EE\u7EA6\u5B9A\u83B7\u53D6**\uFF1A\u4FE1\u606F\u53EF\u4EE5\u4ECE\u9879\u76EE\u7EA6\u5B9A\uFF08`zhuanspec/project.md`\uFF09\u4E2D\u83B7\u53D6\n- **\u53EF\u4ECE\u4EE3\u7801\u5E93\u5206\u6790\u83B7\u53D6**\uFF1A\u4FE1\u606F\u53EF\u4EE5\u901A\u8FC7\u5206\u6790\u4EE3\u7801\u5E93\u7ED3\u6784\u3001\u73B0\u6709\u6A21\u5F0F\u3001\u76F8\u5173\u6587\u4EF6\u83B7\u53D6\n- **\u53EF\u4ECE\u4E0A\u4E0B\u6587\u83B7\u53D6**\uFF1A\u4FE1\u606F\u53EF\u4EE5\u4ECE\u4E0A\u4E0B\u6587\u6587\u4EF6\u3001\u76F8\u5173\u53D8\u66F4\u3001\u5386\u53F2\u8BB0\u5F55\u4E2D\u83B7\u53D6\n- **\u7B26\u5408\u5E38\u89C1\u6A21\u5F0F**\uFF1A\u5B9E\u73B0\u65B9\u5F0F\u7B26\u5408\u9879\u76EE\u4E2D\u7684\u5E38\u89C1\u6A21\u5F0F\u6216\u6700\u4F73\u5B9E\u8DF5\uFF0C\u65E0\u9700\u7279\u522B\u8BE2\u95EE\n\n**\u539F\u5219**\uFF1A\u5982\u679C\u53EF\u4EE5\u901A\u8FC7\u67E5\u9605\u73B0\u6709\u6765\u6E90\u786E\u5B9A\u4FE1\u606F\uFF0C\u5C31\u4E0D\u8981\u8BE2\u95EE\u7528\u6237\uFF0C\u4EE5\u63D0\u9AD8\u6548\u7387\u3002\n\n### \u6F84\u6E05\u95EE\u9898\u683C\u5F0F\n\n**\u5FC5\u987B\u4F7F\u7528\u9009\u9879\u5F0F\u4EA4\u4E92\uFF0C\u4E25\u7981\u8981\u6C42\u7528\u6237\u624B\u52A8\u8F93\u5165\u6587\u5B57\u56DE\u7B54\u3002**\n\n\u4F7F\u7528\u7F16\u8F91\u5668\u63D0\u4F9B\u7684\u7ED3\u6784\u5316\u95EE\u7B54\u5DE5\u5177\uFF08\u5982 Cursor \u7684 `AskQuestion` \u5DE5\u5177\u3001Claude Code \u7684\u4EA4\u4E92\u5F0F\u9009\u62E9\u7B49\uFF09\u5411\u7528\u6237\u63D0\u95EE\uFF0C\u5C06\u6BCF\u4E2A\u6F84\u6E05\u95EE\u9898\u8F6C\u5316\u4E3A\u5E26\u9884\u8BBE\u9009\u9879\u7684\u9009\u62E9\u9898\uFF1A\n\n**\u683C\u5F0F\u8981\u6C42\uFF1A**\n- \u6BCF\u4E2A\u95EE\u9898\u63D0\u4F9B 2-5 \u4E2A\u9884\u8BBE\u9009\u9879\n- \u6BCF\u4E2A\u95EE\u9898\u672B\u5C3E\u5305\u542B\u4E00\u4E2A\"\u5176\u4ED6\"\u9009\u9879\uFF0C\u4EE5\u8986\u76D6\u672A\u5217\u51FA\u7684\u60C5\u51B5\n- \u5141\u8BB8\u7528\u6237\u591A\u9009\uFF08\u5F53\u95EE\u9898\u53EF\u80FD\u6709\u591A\u4E2A\u7B54\u6848\u65F6\u8BBE\u7F6E `allow_multiple: true`\uFF09\n- \u9009\u9879\u6587\u672C\u8981\u7B80\u6D01\u660E\u4E86\uFF0C\u5FC5\u8981\u65F6\u9644\u5E26\u7B80\u77ED\u8BF4\u660E\n- \u5982\u679C\u6709\u591A\u4E2A\u72EC\u7ACB\u7684\u6F84\u6E05\u95EE\u9898\uFF0C\u5408\u5E76\u5230\u540C\u4E00\u6B21\u95EE\u7B54\u4EA4\u4E92\u4E2D\uFF08\u4E00\u6B21\u6027\u5C55\u793A\u591A\u4E2A\u95EE\u9898\uFF09\n\n**\u6807\u51C6\u683C\u5F0F\u6A21\u677F\uFF1A**\n\n```\n\u4F7F\u7528 AskQuestion \u5DE5\u5177\u63D0\u95EE\uFF0C\u7ED3\u6784\u5982\u4E0B\uFF1A\n\n\u95EE\u9898 1: \"\u5173\u4E8E [\u4E0D\u786E\u5B9A\u7684\u65B9\u9762]\uFF1A[\u5177\u4F53\u95EE\u9898]\"\n\u9009\u9879\uFF1A\n A) [\u9009\u98791 - \u7B80\u77ED\u8BF4\u660E]\n B) [\u9009\u98792 - \u7B80\u77ED\u8BF4\u660E]\n C) [\u9009\u98793 - \u7B80\u77ED\u8BF4\u660E]\n D) \u5176\u4ED6\uFF08\u8BF7\u5728\u540E\u7EED\u8865\u5145\u8BF4\u660E\uFF09\n\n\u95EE\u9898 2: \"\u5173\u4E8E [\u53E6\u4E00\u4E2A\u65B9\u9762]\uFF1A[\u5177\u4F53\u95EE\u9898]\"\n\u9009\u9879\uFF1A\n A) [\u9009\u98791]\n B) [\u9009\u98792]\n C) \u5176\u4ED6\n```\n\n**\u5DE5\u5177\u8C03\u7528\u793A\u4F8B\uFF08Cursor AskQuestion\uFF09\uFF1A**\n```json\n{\n \"questions\": [\n {\n \"id\": \"scope\",\n \"prompt\": \"\u5173\u4E8E\u6539\u8FDB\u8303\u56F4\uFF1A\u60A8\u5E0C\u671B\u6539\u8FDB\u54EA\u4E9B\u65B9\u9762\uFF1F\",\n \"options\": [\n {\"id\": \"security\", \"label\": \"\u5B89\u5168\u6027\uFF08\u5982\u53CC\u56E0\u7D20\u8BA4\u8BC1\uFF09\"},\n {\"id\": \"ux\", \"label\": \"\u7528\u6237\u4F53\u9A8C\uFF08\u5982\u7B80\u5316\u6D41\u7A0B\uFF09\"},\n {\"id\": \"performance\", \"label\": \"\u6027\u80FD\uFF08\u5982\u54CD\u5E94\u65F6\u95F4\u4F18\u5316\uFF09\"},\n {\"id\": \"other\", \"label\": \"\u5176\u4ED6\"}\n ],\n \"allow_multiple\": true\n },\n {\n \"id\": \"priority\",\n \"prompt\": \"\u5982\u679C\u6709\u591A\u4E2A\u6539\u8FDB\u70B9\uFF0C\u4F18\u5148\u7EA7\u5982\u4F55\uFF1F\",\n \"options\": [\n {\"id\": \"security_first\", \"label\": \"\u5B89\u5168\u6027\u4F18\u5148\"},\n {\"id\": \"ux_first\", \"label\": \"\u7528\u6237\u4F53\u9A8C\u4F18\u5148\"},\n {\"id\": \"all_equal\", \"label\": \"\u540C\u7B49\u91CD\u8981\uFF0C\u4E00\u8D77\u505A\"}\n ]\n }\n ]\n}\n```\n\n**\u539F\u5219\uFF1A**\n- \u6C38\u8FDC\u4E0D\u8981\u8BA9\u7528\u6237\u4ECE\u96F6\u5F00\u59CB\u8F93\u5165\u7B54\u6848\uFF0C\u603B\u662F\u63D0\u4F9B\u53EF\u9009\u7684\u9009\u9879\n- \u9009\u9879\u5E94\u8986\u76D6\u6700\u5E38\u89C1\u7684\u7B54\u6848\u573A\u666F\n- \"\u5176\u4ED6\"\u9009\u9879\u4F5C\u4E3A\u515C\u5E95\uFF0C\u786E\u4FDD\u4E0D\u9057\u6F0F\u7279\u6B8A\u60C5\u51B5\n- \u7528\u6237\u9009\u62E9\"\u5176\u4ED6\"\u540E\uFF0C\u518D\u9488\u5BF9\u6027\u5730\u8FFD\u95EE\u7EC6\u8282\n\n### \u7981\u6B62\u884C\u4E3A\n\n\u5728\u9047\u5230\u6A21\u7CCA\u9700\u6C42\u65F6\uFF0C**\u4E25\u7981**\u4EE5\u4E0B\u884C\u4E3A\uFF1A\n- \u274C \u81EA\u884C\u63A8\u6D4B\u7528\u6237\u610F\u56FE\n- \u274C \u57FA\u4E8E\"\u6700\u4F73\u731C\u6D4B\"\u521B\u5EFA\u63D0\u6848\n- \u274C \u5047\u8BBE\u7528\u6237\u60F3\u8981\u4EC0\u4E48\n- \u274C \u8DF3\u8FC7\u6F84\u6E05\u76F4\u63A5\u521B\u5EFA\u6587\u4EF6\n- \u274C \u4F7F\u7528\u6A21\u7CCA\u7684\u8868\u8FF0\u6765\u63A9\u76D6\u4E0D\u786E\u5B9A\u6027\n- \u274C \u8981\u6C42\u7528\u6237\u624B\u52A8\u8F93\u5165\u5927\u6BB5\u6587\u5B57\u6765\u56DE\u7B54\u6F84\u6E05\u95EE\u9898\uFF08\u5FC5\u987B\u4F7F\u7528\u9009\u9879\u5F0F\u4EA4\u4E92\uFF09\n\n### \u6F84\u6E05\u6D41\u7A0B\n\n1. **\u67E5\u9605\u73B0\u6709\u6765\u6E90**\uFF1A\u9996\u5148\u67E5\u9605\u73B0\u6709\u89C4\u8303\u3001\u9879\u76EE\u7EA6\u5B9A\u3001\u4EE3\u7801\u5E93\u7ED3\u6784\u3001\u4E0A\u4E0B\u6587\u6587\u4EF6\u7B49\uFF0C\u5C1D\u8BD5\u4ECE\u8FD9\u4E9B\u6765\u6E90\u83B7\u53D6\u6240\u9700\u4FE1\u606F\n2. **\u8BC6\u522B\u6A21\u7CCA\u70B9**\uFF1A\u4ED4\u7EC6\u5206\u6790\u7528\u6237\u8BF7\u6C42\uFF0C\u5217\u51FA\u6240\u6709\u4E0D\u786E\u5B9A\u7684\u65B9\u9762\uFF0C**\u4F46\u6392\u9664\u90A3\u4E9B\u53EF\u4EE5\u4ECE\u73B0\u6709\u6765\u6E90\u786E\u5B9A\u7684\u65B9\u9762**\n3. **\u5224\u65AD\u662F\u5426\u9700\u8981\u8BE2\u95EE**\uFF1A\u5BF9\u4E8E\u6BCF\u4E2A\u4E0D\u786E\u5B9A\u7684\u65B9\u9762\uFF0C\u5224\u65AD\u662F\u5426\u53EF\u4EE5\u4ECE\u73B0\u6709\u6765\u6E90\u786E\u5B9A\uFF1A\n - \u5982\u679C\u53EF\u4EE5\u786E\u5B9A\uFF0C\u5219\u4F7F\u7528\u4ECE\u73B0\u6709\u6765\u6E90\u83B7\u53D6\u7684\u4FE1\u606F\uFF0C\u4E0D\u8BE2\u95EE\n - \u5982\u679C\u65E0\u6CD5\u786E\u5B9A\uFF0C\u5219\u6807\u8BB0\u4E3A\u9700\u8981\u8BE2\u95EE\n4. **\u6784\u9020\u9009\u9879\u5F0F\u95EE\u9898**\uFF1A\u5C06\u6240\u6709\u9700\u8981\u8BE2\u95EE\u7684\u6A21\u7CCA\u70B9\u8F6C\u5316\u4E3A\u5E26\u9884\u8BBE\u9009\u9879\u7684\u9009\u62E9\u9898\uFF0C\u5C3D\u91CF\u5408\u5E76\u5230\u4E00\u6B21\u4EA4\u4E92\u4E2D\n5. **\u4F7F\u7528\u5DE5\u5177\u63D0\u95EE**\uFF1A\u8C03\u7528\u7F16\u8F91\u5668\u7684\u7ED3\u6784\u5316\u95EE\u7B54\u5DE5\u5177\uFF08\u5982 `AskQuestion`\uFF09\u4E00\u6B21\u6027\u5C55\u793A\u6240\u6709\u95EE\u9898\u548C\u9009\u9879\uFF0C\u7B49\u5F85\u7528\u6237\u9009\u62E9\n6. **\u7B49\u5F85\u7528\u6237\u9009\u62E9**\uFF1A\u5FC5\u987B\u7B49\u5F85\u7528\u6237\u9009\u62E9\u7B54\u6848\uFF0C\u4E0D\u80FD\u7EE7\u7EED\n7. **\u5904\u7406\"\u5176\u4ED6\"\u9009\u9879**\uFF1A\u5982\u679C\u7528\u6237\u9009\u62E9\u4E86\"\u5176\u4ED6\"\uFF0C\u518D\u9488\u5BF9\u8BE5\u95EE\u9898\u8FFD\u95EE\u5177\u4F53\u7EC6\u8282\uFF08\u4ECD\u4F18\u5148\u4F7F\u7528\u9009\u9879\u5F0F\uFF0C\u5982\u786E\u5B9E\u65E0\u6CD5\u9884\u8BBE\u5219\u5141\u8BB8\u7B80\u77ED\u6587\u5B57\u8F93\u5165\uFF09\n8. **\u786E\u8BA4\u7406\u89E3**\uFF1A\u5728\u5F00\u59CB\u521B\u5EFA\u6587\u4EF6\u524D\uFF0C\u7B80\u8981\u603B\u7ED3\u7406\u89E3\u4EE5\u786E\u4FDD\u51C6\u786E\n9. **\u5F00\u59CB\u521B\u5EFA**\uFF1A\u53EA\u6709\u5728\u6240\u6709\u5FC5\u8981\u7684\u6A21\u7CCA\u70B9\u90FD\u660E\u786E\u540E\uFF0C\u624D\u80FD\u5F00\u59CB\u521B\u5EFA\u63D0\u6848\u6587\u4EF6\n\n### \u793A\u4F8B\n\n**\u7528\u6237\u8BF7\u6C42**\uFF1A\"\u6539\u8FDB\u767B\u5F55\u529F\u80FD\"\n\n**\u5206\u6790\u8FC7\u7A0B**\uFF1A\n1. \u9996\u5148\u67E5\u9605\u73B0\u6709\u89C4\u8303\uFF08`zhuanspec/specs/`\uFF09\u4E2D\u662F\u5426\u6709\u767B\u5F55\u76F8\u5173\u7684\u89C4\u8303\n2. \u67E5\u9605\u9879\u76EE\u7EA6\u5B9A\uFF08`zhuanspec/project.md`\uFF09\u4E86\u89E3\u9879\u76EE\u67B6\u6784\u548C\u7EA6\u5B9A\n3. \u5206\u6790\u4EE3\u7801\u5E93\u7ED3\u6784\uFF0C\u4E86\u89E3\u73B0\u6709\u7684\u767B\u5F55\u5B9E\u73B0\u65B9\u5F0F\n4. \u5982\u679C\u4ECE\u8FD9\u4E9B\u6765\u6E90\u65E0\u6CD5\u786E\u5B9A\u6539\u8FDB\u8303\u56F4\uFF0C\u5219\u4F7F\u7528\u9009\u9879\u5F0F\u4EA4\u4E92\u8BE2\u95EE\n\n**\u5FC5\u987B\u4F7F\u7528\u9009\u9879\u5F0F\u4EA4\u4E92\u63D0\u95EE**\uFF08\u4EC5\u5728\u65E0\u6CD5\u4ECE\u73B0\u6709\u6765\u6E90\u786E\u5B9A\u65F6\uFF09\uFF1A\n\n```json\n{\n \"questions\": [\n {\n \"id\": \"improvement_scope\",\n \"prompt\": \"\u60A8\u5E0C\u671B\u6539\u8FDB\u767B\u5F55\u529F\u80FD\u7684\u54EA\u4E9B\u65B9\u9762\uFF1F\",\n \"options\": [\n {\"id\": \"security\", \"label\": \"\u5B89\u5168\u6027\uFF08\u5982\u6DFB\u52A0\u53CC\u56E0\u7D20\u8BA4\u8BC1\uFF09\"},\n {\"id\": \"ux\", \"label\": \"\u7528\u6237\u4F53\u9A8C\uFF08\u5982\u7B80\u5316\u767B\u5F55\u6D41\u7A0B\uFF09\"},\n {\"id\": \"performance\", \"label\": \"\u6027\u80FD\uFF08\u5982\u4F18\u5316\u767B\u5F55\u54CD\u5E94\u65F6\u95F4\uFF09\"},\n {\"id\": \"other\", \"label\": \"\u5176\u4ED6\"}\n ],\n \"allow_multiple\": true\n },\n {\n \"id\": \"tech_preference\",\n \"prompt\": \"\u60A8\u6709\u7279\u5B9A\u7684\u6280\u672F\u504F\u597D\u5417\uFF1F\",\n \"options\": [\n {\"id\": \"jwt\", \"label\": \"JWT Token \u8BA4\u8BC1\"},\n {\"id\": \"session\", \"label\": \"Session \u8BA4\u8BC1\"},\n {\"id\": \"oauth\", \"label\": \"OAuth \u7B2C\u4E09\u65B9\u96C6\u6210\"},\n {\"id\": \"no_preference\", \"label\": \"\u65E0\u504F\u597D\uFF0C\u7531\u4F60\u63A8\u8350\"},\n {\"id\": \"other\", \"label\": \"\u5176\u4ED6\"}\n ]\n },\n {\n \"id\": \"priority\",\n \"prompt\": \"\u5982\u679C\u6709\u591A\u4E2A\u6539\u8FDB\u70B9\uFF0C\u4F18\u5148\u7EA7\u5982\u4F55\uFF1F\",\n \"options\": [\n {\"id\": \"security_first\", \"label\": \"\u5B89\u5168\u6027\u4F18\u5148\"},\n {\"id\": \"ux_first\", \"label\": \"\u7528\u6237\u4F53\u9A8C\u4F18\u5148\"},\n {\"id\": \"perf_first\", \"label\": \"\u6027\u80FD\u4F18\u5148\"},\n {\"id\": \"all_equal\", \"label\": \"\u540C\u7B49\u91CD\u8981\uFF0C\u4E00\u8D77\u505A\"}\n ]\n }\n ]\n}\n```\n\n**\u5B9E\u73B0\u7EC6\u8282\u76F8\u5173\u793A\u4F8B**\uFF08\u4EC5\u5728\u65E0\u6CD5\u4ECE\u4EE3\u7801\u5E93\u5206\u6790\u786E\u5B9A\u65F6\u8BE2\u95EE\uFF09\uFF1A\n\n**\u7528\u6237\u8BF7\u6C42**\uFF1A\"\u91CD\u6784\u7528\u6237\u8BA4\u8BC1\u670D\u52A1\"\n\n**\u5982\u679C\u65E0\u6CD5\u4ECE\u4EE3\u7801\u5E93\u5206\u6790\u786E\u5B9A\uFF0C\u4F7F\u7528\u9009\u9879\u5F0F\u4EA4\u4E92\u63D0\u95EE**\uFF1A\n\n```json\n{\n \"questions\": [\n {\n \"id\": \"change_scope\",\n \"prompt\": \"\u91CD\u6784\u6D89\u53CA\u54EA\u4E9B\u6539\u52A8\uFF1F\",\n \"options\": [\n {\"id\": \"modify_existing\", \"label\": \"\u4FEE\u6539\u73B0\u6709\u8BA4\u8BC1\u670D\u52A1\u7C7B\"},\n {\"id\": \"new_service\", \"label\": \"\u521B\u5EFA\u65B0\u7684\u670D\u52A1\u5C42\"},\n {\"id\": \"both\", \"label\": \"\u4E24\u8005\u90FD\u6D89\u53CA\"},\n {\"id\": \"other\", \"label\": \"\u5176\u4ED6\"}\n ]\n },\n {\n \"id\": \"layer_scope\",\n \"prompt\": \"\u6539\u52A8\u5E94\u8BE5\u5728\u54EA\u4E9B\u5C42\u8FDB\u884C\uFF1F\",\n \"options\": [\n {\"id\": \"controller\", \"label\": \"Controller \u5C42\"},\n {\"id\": \"service\", \"label\": \"Service \u5C42\"},\n {\"id\": \"repository\", \"label\": \"Repository \u5C42\"},\n {\"id\": \"all\", \"label\": \"\u5168\u90E8\u5C42\"}\n ],\n \"allow_multiple\": true\n },\n {\n \"id\": \"refactor_strategy\",\n \"prompt\": \"\u91CD\u6784\u7B56\u7565\u504F\u597D\uFF1F\",\n \"options\": [\n {\"id\": \"incremental\", \"label\": \"\u6E10\u8FDB\u5F0F\u91CD\u6784\uFF08\u9010\u6B65\u66FF\u6362\uFF09\"},\n {\"id\": \"rewrite\", \"label\": \"\u5B8C\u5168\u91CD\u5199\"},\n {\"id\": \"strangler\", \"label\": \"\u7EDE\u6740\u8005\u6A21\u5F0F\uFF08\u65B0\u65E7\u5E76\u884C\u540E\u5207\u6362\uFF09\"},\n {\"id\": \"no_preference\", \"label\": \"\u65E0\u504F\u597D\uFF0C\u7531\u4F60\u63A8\u8350\"}\n ]\n }\n ]\n}\n```\n\n**\u6CE8\u610F**\uFF1A\u5982\u679C\u53EF\u4EE5\u4ECE\u73B0\u6709\u4EE3\u7801\u7ED3\u6784\u3001\u89C4\u8303\u6216\u9879\u76EE\u7EA6\u5B9A\u4E2D\u786E\u5B9A\u8FD9\u4E9B\u4FE1\u606F\uFF0C\u5219\u4E0D\u5E94\u8BE2\u95EE\uFF0C\u76F4\u63A5\u4F7F\u7528\u4ECE\u73B0\u6709\u6765\u6E90\u83B7\u53D6\u7684\u4FE1\u606F\u3002\n\n### \u641C\u7D22\u6307\u5BFC\n- \u679A\u4E3E\u89C4\u8303\uFF1A`zhuanspec spec list --long`\uFF08\u6216\u4F7F\u7528 `--json` \u7528\u4E8E\u811A\u672C\uFF09\n- \u679A\u4E3E\u53D8\u66F4\uFF1A`zhuanspec list`\uFF08\u6216 `zhuanspec change list --json` - \u5DF2\u5F03\u7528\u4F46\u53EF\u7528\uFF09\n- \u663E\u793A\u8BE6\u7EC6\u4FE1\u606F\uFF1A\n - \u89C4\u8303\uFF1A`zhuanspec show <spec-id> --type spec`\uFF08\u4F7F\u7528 `--json` \u8FDB\u884C\u8FC7\u6EE4\uFF09\n - \u53D8\u66F4\uFF1A`zhuanspec show <change-id> --json --deltas-only`\n- \u5168\u6587\u641C\u7D22\uFF08\u4F7F\u7528 ripgrep\uFF09\uFF1A`rg -n \"Requirement:|Scenario:\" zhuanspec/specs`\n\n## \u5FEB\u901F\u5F00\u59CB\n\n### CLI \u547D\u4EE4\n\n```bash\n# \u57FA\u672C\u547D\u4EE4\nzhuanspec list # \u5217\u51FA\u6D3B\u52A8\u53D8\u66F4\nzhuanspec list --specs # \u5217\u51FA\u89C4\u8303\nzhuanspec show [item] # \u663E\u793A\u53D8\u66F4\u6216\u89C4\u8303\nzhuanspec validate [item] # \u9A8C\u8BC1\u53D8\u66F4\u6216\u89C4\u8303\nzhuanspec archive <change-id> [--yes|-y] # \u90E8\u7F72\u540E\u5F52\u6863\uFF08\u6DFB\u52A0 --yes \u7528\u4E8E\u975E\u4EA4\u4E92\u5F0F\u8FD0\u884C\uFF09\n\n# \u9879\u76EE\u7BA1\u7406\nzhuanspec init [path] # \u521D\u59CB\u5316 ZhuanSpec\nzhuanspec update [path] # \u66F4\u65B0\u8BF4\u660E\u6587\u4EF6\n\n# \u4EA4\u4E92\u6A21\u5F0F\nzhuanspec show # \u63D0\u793A\u9009\u62E9\nzhuanspec validate # \u6279\u91CF\u9A8C\u8BC1\u6A21\u5F0F\n\n# \u8C03\u8BD5\nzhuanspec show [change] --json --deltas-only\nzhuanspec validate [change] --strict\n```\n\n### \u547D\u4EE4\u6807\u5FD7\n\n- `--json` - \u673A\u5668\u53EF\u8BFB\u8F93\u51FA\n- `--type change|spec` - \u6D88\u9664\u9879\u76EE\u6B67\u4E49\n- `--strict` - \u5168\u9762\u9A8C\u8BC1\n- `--no-interactive` - \u7981\u7528\u63D0\u793A\n- `--skip-specs` - \u5F52\u6863\u65F6\u4E0D\u66F4\u65B0\u89C4\u8303\n- `--yes`/`-y` - \u8DF3\u8FC7\u786E\u8BA4\u63D0\u793A\uFF08\u975E\u4EA4\u4E92\u5F0F\u5F52\u6863\uFF09\n\n## \u76EE\u5F55\u7ED3\u6784\n\n```\nzhuanspec/\n\u251C\u2500\u2500 project.md # \u9879\u76EE\u7EA6\u5B9A\n\u251C\u2500\u2500 specs/ # \u5F53\u524D\u771F\u5B9E\u72B6\u6001 - \u5DF2\u6784\u5EFA\u7684\u5185\u5BB9\n\u2502 \u2514\u2500\u2500 [capability]/ # \u5355\u4E00\u805A\u7126\u7684\u529F\u80FD\n\u2502 \u251C\u2500\u2500 spec.md # \u8981\u6C42\u548C\u573A\u666F\n\u2502 \u2514\u2500\u2500 design.md # \u6280\u672F\u6A21\u5F0F\n\u251C\u2500\u2500 changes/ # \u63D0\u6848 - \u5E94\u8BE5\u66F4\u6539\u7684\u5185\u5BB9\n\u2502 \u251C\u2500\u2500 [change-name]/\n\u2502 \u2502 \u251C\u2500\u2500 proposal.md # \u539F\u56E0\u3001\u5185\u5BB9\u3001\u5F71\u54CD\n\u2502 \u2502 \u251C\u2500\u2500 tasks.md # \u5B9E\u65BD\u6E05\u5355\n\u2502 \u2502 \u251C\u2500\u2500 design.md # \u6280\u672F\u51B3\u7B56\uFF08\u53EF\u9009\uFF1B\u89C1\u6807\u51C6\uFF09\n\u2502 \u2502 \u2514\u2500\u2500 specs/ # \u589E\u91CF\u53D8\u66F4\n\u2502 \u2502 \u2514\u2500\u2500 [capability]/\n\u2502 \u2502 \u2514\u2500\u2500 spec.md # ADDED/MODIFIED/REMOVED\n\u2502 \u2514\u2500\u2500 archive/ # \u5DF2\u5B8C\u6210\u7684\u53D8\u66F4\n```\n\n## \u521B\u5EFA\u53D8\u66F4\u63D0\u6848\n\n### \u51B3\u7B56\u6811\n\n```\n\u65B0\u8BF7\u6C42\uFF1F\n\u251C\u2500 \u4FEE\u590D\u6062\u590D\u89C4\u8303\u884C\u4E3A\u7684 Bug\uFF1F \u2192 \u76F4\u63A5\u4FEE\u590D\n\u251C\u2500 \u62FC\u5199\u9519\u8BEF/\u683C\u5F0F/\u6CE8\u91CA\uFF1F \u2192 \u76F4\u63A5\u4FEE\u590D\n\u251C\u2500 \u65B0\u529F\u80FD/\u80FD\u529B\uFF1F \u2192 \u521B\u5EFA\u63D0\u6848\n\u251C\u2500 \u7834\u574F\u6027\u66F4\u6539\uFF1F \u2192 \u521B\u5EFA\u63D0\u6848\n\u251C\u2500 \u67B6\u6784\u66F4\u6539\uFF1F \u2192 \u521B\u5EFA\u63D0\u6848\n\u2514\u2500 \u4E0D\u660E\u786E\uFF1F \u2192 \u521B\u5EFA\u63D0\u6848\uFF08\u66F4\u5B89\u5168\uFF09\n```\n\n### \u63D0\u6848\u7ED3\u6784\n\n1. **\u521B\u5EFA\u76EE\u5F55\uFF1A** `changes/[change-id]/`\uFF08kebab-case\uFF0C\u52A8\u8BCD\u5F00\u5934\uFF0C\u552F\u4E00\uFF09\n\n2. **\u7F16\u5199 proposal.md\uFF1A**\n```markdown\n# Change: [\u53D8\u66F4\u7684\u7B80\u8981\u63CF\u8FF0]\n\n## Why\n[\u5173\u4E8E\u95EE\u9898/\u673A\u4F1A\u7684 1-2 \u53E5\u8BDD]\n\n## What Changes\n- [\u53D8\u66F4\u7684\u8981\u70B9\u5217\u8868]\n- [\u7528 **BREAKING** \u6807\u8BB0\u7834\u574F\u6027\u66F4\u6539]\n\n## Impact\n- Affected specs: [\u5217\u51FA\u529F\u80FD]\n- Affected code: [\u5173\u952E\u6587\u4EF6/\u7CFB\u7EDF]\n```\n\n3. **\u521B\u5EFA\u89C4\u8303\u589E\u91CF\uFF1A** `specs/[capability]/spec.md`\n```markdown\n## ADDED Requirements\n### Requirement: New Feature\nThe system SHALL provide...\n\n#### Scenario: Success case\n- **WHEN** user performs action\n- **THEN** expected result\n\n## MODIFIED Requirements\n### Requirement: Existing Feature\n[\u5B8C\u6574\u7684\u4FEE\u6539\u540E\u8981\u6C42]\n\n## REMOVED Requirements\n### Requirement: Old Feature\n**Reason**: [\u79FB\u9664\u539F\u56E0]\n**Migration**: [\u5982\u4F55\u5904\u7406]\n```\n\u5982\u679C\u591A\u4E2A\u529F\u80FD\u53D7\u5230\u5F71\u54CD\uFF0C\u5728 `changes/[change-id]/specs/<capability>/spec.md` \u4E0B\u521B\u5EFA\u591A\u4E2A\u589E\u91CF\u6587\u4EF6\u2014\u2014\u6BCF\u4E2A\u529F\u80FD\u4E00\u4E2A\u3002\n\n4. **\u521B\u5EFA tasks.md\uFF1A**\n\n\u5148\u8FD0\u884C `zhuanspec skills list --json` \u53D1\u73B0\u5F53\u524D\u73AF\u5883\u4E2D\u53EF\u7528\u7684 skill \u53CA\u5176 description\uFF0C\u7136\u540E\u57FA\u4E8E\u8BED\u4E49\u5339\u914D\u5728\u4EFB\u52A1\u4E2D\u6807\u6CE8\u771F\u5B9E skill \u540D\u79F0\uFF1A\n\n```markdown\n## 1. Implementation\n- [ ] 1.1 Create database schema @skill:java-db-schema-standards\n- [ ] 1.2 Implement RPC interface @skill:java-scf-rpc-usage-skill\n- [ ] 1.3 Add frontend component @skill:kf-fe-frontend-dev\n- [ ] 1.4 Write tests @skill:generate-mockito-unit-test-skill\n```\n> **@skill \u6807\u7B7E**\uFF1A\u521B\u5EFA tasks.md \u524D\uFF0C\u8FD0\u884C `zhuanspec skills list --json` \u53D1\u73B0\u53EF\u7528 skill \u53CA\u5176 description\u3002\u57FA\u4E8E skill description \u8FDB\u884C\u8BED\u4E49\u5339\u914D\uFF1A\n> - \u4ED4\u7EC6\u9605\u8BFB\u6BCF\u4E2A skill \u7684 description\uFF0C\u7406\u89E3\u5176\u5177\u4F53\u529F\u80FD\u548C\u9002\u7528\u573A\u666F\n> - \u53EA\u6709\u5F53\u4EFB\u52A1\u529F\u80FD\u4E0E skill description \u660E\u786E\u5339\u914D\u65F6\u624D\u6807\u6CE8\n> - \u7B80\u5355\u7684\u4EE3\u7801\u4FEE\u6539\uFF08\u5982\u589E\u5220\u679A\u4E3E\u503C\uFF09\u5E94\u5339\u914D\u901A\u7528\u7F16\u7801\u89C4\u8303 skill\uFF0C\u800C\u975E\u67B6\u6784\u7EA7 skill\n> - \u907F\u514D\u4EC5\u56E0\u6587\u4EF6\u540D\u6216\u8DEF\u5F84\u5173\u952E\u8BCD\u800C\u9519\u8BEF\u5339\u914D\n> - \u4F7F\u7528\u771F\u5B9E skill \u540D\u79F0\u6807\u6CE8\uFF0C\u652F\u6301\u591A\u4E2A skill\uFF08`@skill:name1,name2`\uFF09\n> - Apply \u9636\u6BB5 AI \u6839\u636E\u6807\u7B7E\u76F4\u63A5\u8C03\u7528\u5BF9\u5E94 skill\u3002\u65E0\u53EF\u7528 skill \u65F6\u53EF\u7701\u7565\u3002\n\n\u26A0\uFE0F **CHECKPOINT [SKILL-TAGGING]**:\n1. You MUST run `zhuanspec skills list` first and record discovered skills in the Skill Mapping table\n2. Every task MUST have either @skill:real-skill-name or @skill:none\n3. If @skill:none, you MUST provide a justification (e.g., \"pure config change, no skill applies\")\n4. @skill names MUST match exactly the names returned by `zhuanspec skills list` \u2014 do NOT invent skill names\n5. The Skill Mapping table in tasks.md MUST NOT be empty\n6. validate --strict will verify all @skill names exist in the known skill list\n\n\u26A0\uFE0F **CHECKPOINT [TASK-ORDERING]**:\n1. Tasks in tasks.md MUST be organized under Wave headers (### Wave 1, ### Wave 2, etc.)\n2. Wave assignment must be computed from @depends relationships (Wave 1 = no deps, Wave N = depends on Wave N-1)\n3. No task may appear before a task it depends on\n4. You MUST add a \"## Dependency Analysis\" section at the end with \"Status: COMPLETED\"\n5. validate --strict will verify task ordering matches computed waves\n\n5. **\u5728\u9700\u8981\u65F6\u521B\u5EFA design.md\uFF1A**\n\u5982\u679C\u4EE5\u4E0B\u4EFB\u4F55\u60C5\u51B5\u9002\u7528\uFF0C\u5219\u521B\u5EFA `design.md`\uFF1B\u5426\u5219\u7701\u7565\uFF1A\n- \u6A2A\u5207\u53D8\u66F4\uFF08\u591A\u4E2A\u670D\u52A1/\u6A21\u5757\uFF09\u6216\u65B0\u7684\u67B6\u6784\u6A21\u5F0F\n- \u65B0\u7684\u5916\u90E8\u4F9D\u8D56\u6216\u91CD\u8981\u7684\u6570\u636E\u6A21\u578B\u66F4\u6539\n- \u5B89\u5168\u6027\u3001\u6027\u80FD\u6216\u8FC1\u79FB\u590D\u6742\u6027\n- \u5728\u7F16\u7801\u4E4B\u524D\u4ECE\u6280\u672F\u51B3\u7B56\u4E2D\u53D7\u76CA\u7684\u6A21\u7CCA\u6027\n\n\u6700\u5C0F `design.md` \u9AA8\u67B6\uFF1A\n```markdown\n## Context\n[\u80CC\u666F\u3001\u7EA6\u675F\u3001\u5229\u76CA\u76F8\u5173\u8005]\n\n## Goals / Non-Goals\n- Goals: [...]\n- Non-Goals: [...]\n\n## Decisions\n- Decision: [\u5185\u5BB9\u548C\u539F\u56E0]\n- Alternatives considered: [\u9009\u9879 + \u7406\u7531]\n\n## Risks / Trade-offs\n- [\u98CE\u9669] \u2192 \u7F13\u89E3\u63AA\u65BD\n\n## Migration Plan\n[\u6B65\u9AA4\u3001\u56DE\u6EDA]\n\n## Open Questions\n- [...]\n```\n\n## \u89C4\u8303\u6587\u4EF6\u683C\u5F0F\n\n### \u5173\u952E\uFF1A\u573A\u666F\u683C\u5F0F\n\n**\u6B63\u786E**\uFF08\u4F7F\u7528 #### \u6807\u9898\uFF09\uFF1A\n```markdown\n#### Scenario: User login success\n- **WHEN** valid credentials provided\n- **THEN** return JWT token\n```\n\n**\u9519\u8BEF**\uFF08\u4E0D\u8981\u4F7F\u7528\u9879\u76EE\u7B26\u53F7\u6216\u7C97\u4F53\uFF09\uFF1A\n```markdown\n- **Scenario: User login** \u274C\n**Scenario**: User login \u274C\n### Scenario: User login \u274C\n```\n\n\u6BCF\u4E2A\u8981\u6C42\u5FC5\u987B\u81F3\u5C11\u6709\u4E00\u4E2A\u573A\u666F\u3002\n\n### \u8981\u6C42\u63AA\u8F9E\n- \u5BF9\u89C4\u8303\u6027\u8981\u6C42\u4F7F\u7528 SHALL/MUST\uFF08\u9664\u975E\u6709\u610F\u975E\u89C4\u8303\u6027\uFF0C\u5426\u5219\u907F\u514D\u4F7F\u7528 should/may\uFF09\n\n### \u589E\u91CF\u64CD\u4F5C\n\n- `## ADDED Requirements` - \u65B0\u529F\u80FD\n- `## MODIFIED Requirements` - \u66F4\u6539\u7684\u884C\u4E3A\n- `## REMOVED Requirements` - \u5DF2\u5F03\u7528\u7684\u529F\u80FD\n- `## RENAMED Requirements` - \u540D\u79F0\u66F4\u6539\n\n\u6807\u9898\u4F7F\u7528 `trim(header)` \u5339\u914D - \u5FFD\u7565\u7A7A\u767D\u3002\n\n#### \u4F55\u65F6\u4F7F\u7528 ADDED vs MODIFIED\n- ADDED\uFF1A\u5F15\u5165\u4E00\u4E2A\u65B0\u7684\u529F\u80FD\u6216\u5B50\u529F\u80FD\uFF0C\u53EF\u4EE5\u72EC\u7ACB\u4F5C\u4E3A\u8981\u6C42\u3002\u5F53\u66F4\u6539\u662F\u6B63\u4EA4\u7684\uFF08\u4F8B\u5982\uFF0C\u6DFB\u52A0\"\u659C\u6760\u547D\u4EE4\u914D\u7F6E\"\uFF09\u800C\u4E0D\u662F\u6539\u53D8\u73B0\u6709\u8981\u6C42\u7684\u8BED\u4E49\u65F6\uFF0C\u4F18\u5148\u4F7F\u7528 ADDED\u3002\n- MODIFIED\uFF1A\u66F4\u6539\u73B0\u6709\u8981\u6C42\u7684\u884C\u4E3A\u3001\u8303\u56F4\u6216\u9A8C\u6536\u6807\u51C6\u3002\u59CB\u7EC8\u7C98\u8D34\u5B8C\u6574\u7684\u3001\u66F4\u65B0\u7684\u8981\u6C42\u5185\u5BB9\uFF08\u6807\u9898 + \u6240\u6709\u573A\u666F\uFF09\u3002\u5F52\u6863\u5668\u5C06\u7528\u60A8\u5728\u6B64\u5904\u63D0\u4F9B\u7684\u5185\u5BB9\u66FF\u6362\u6574\u4E2A\u8981\u6C42\uFF1B\u90E8\u5206\u589E\u91CF\u5C06\u4E22\u5931\u5148\u524D\u7684\u8BE6\u7EC6\u4FE1\u606F\u3002\n- RENAMED\uFF1A\u4EC5\u5728\u540D\u79F0\u66F4\u6539\u65F6\u4F7F\u7528\u3002\u5982\u679C\u60A8\u8FD8\u66F4\u6539\u884C\u4E3A\uFF0C\u8BF7\u4F7F\u7528 RENAMED\uFF08\u540D\u79F0\uFF09\u52A0\u4E0A MODIFIED\uFF08\u5185\u5BB9\uFF09\uFF0C\u5F15\u7528\u65B0\u540D\u79F0\u3002\n\n\u5E38\u89C1\u9677\u9631\uFF1A\u4F7F\u7528 MODIFIED \u6DFB\u52A0\u65B0\u5173\u6CE8\u70B9\u800C\u4E0D\u5305\u542B\u5148\u524D\u7684\u6587\u672C\u3002\u8FD9\u4F1A\u5728\u5F52\u6863\u65F6\u5BFC\u81F4\u8BE6\u7EC6\u4FE1\u606F\u4E22\u5931\u3002\u5982\u679C\u60A8\u6CA1\u6709\u660E\u786E\u66F4\u6539\u73B0\u6709\u8981\u6C42\uFF0C\u8BF7\u5728 ADDED \u4E0B\u6DFB\u52A0\u65B0\u8981\u6C42\u3002\n\n\u6B63\u786E\u7F16\u5199 MODIFIED \u8981\u6C42\uFF1A\n1) \u5728 `zhuanspec/specs/<capability>/spec.md` \u4E2D\u627E\u5230\u73B0\u6709\u8981\u6C42\u3002\n2) \u590D\u5236\u6574\u4E2A\u8981\u6C42\u5757\uFF08\u4ECE `### Requirement: ...` \u5230\u5176\u573A\u666F\uFF09\u3002\n3) \u5C06\u5176\u7C98\u8D34\u5230 `## MODIFIED Requirements` \u4E0B\u5E76\u7F16\u8F91\u4EE5\u53CD\u6620\u65B0\u884C\u4E3A\u3002\n4) \u786E\u4FDD\u6807\u9898\u6587\u672C\u5B8C\u5168\u5339\u914D\uFF08\u5FFD\u7565\u7A7A\u767D\uFF09\u5E76\u81F3\u5C11\u4FDD\u7559\u4E00\u4E2A `#### Scenario:`\u3002\n\nRENAMED \u793A\u4F8B\uFF1A\n```markdown\n## RENAMED Requirements\n- FROM: `### Requirement: Login`\n- TO: `### Requirement: User Authentication`\n```\n\n## \u6545\u969C\u6392\u9664\n\n### \u5E38\u89C1\u9519\u8BEF\n\n**\"\u53D8\u66F4\u5FC5\u987B\u81F3\u5C11\u6709\u4E00\u4E2A\u589E\u91CF\"**\n- \u68C0\u67E5 `changes/[name]/specs/` \u662F\u5426\u5B58\u5728 .md \u6587\u4EF6\n- \u9A8C\u8BC1\u6587\u4EF6\u5177\u6709\u64CD\u4F5C\u524D\u7F00\uFF08## ADDED Requirements\uFF09\n\n**\"\u8981\u6C42\u5FC5\u987B\u81F3\u5C11\u6709\u4E00\u4E2A\u573A\u666F\"**\n- \u68C0\u67E5\u573A\u666F\u662F\u5426\u4F7F\u7528 `#### Scenario:` \u683C\u5F0F\uFF084 \u4E2A\u4E95\u53F7\uFF09\n- \u4E0D\u8981\u5BF9\u573A\u666F\u6807\u9898\u4F7F\u7528\u9879\u76EE\u7B26\u53F7\u6216\u7C97\u4F53\n\n**\u9759\u9ED8\u573A\u666F\u89E3\u6790\u5931\u8D25**\n- \u9700\u8981\u7CBE\u786E\u683C\u5F0F\uFF1A`#### Scenario: Name`\n- \u4F7F\u7528\u4EE5\u4E0B\u547D\u4EE4\u8C03\u8BD5\uFF1A`zhuanspec show [change] --json --deltas-only`\n\n### \u9A8C\u8BC1\u63D0\u793A\n\n```bash\n# \u59CB\u7EC8\u4F7F\u7528\u4E25\u683C\u6A21\u5F0F\u8FDB\u884C\u5168\u9762\u68C0\u67E5\nzhuanspec validate [change] --strict\n\n# \u8C03\u8BD5\u589E\u91CF\u89E3\u6790\nzhuanspec show [change] --json | jq '.deltas'\n\n# \u68C0\u67E5\u7279\u5B9A\u8981\u6C42\nzhuanspec show [spec] --json -r 1\n```\n\n## \u7406\u60F3\u8DEF\u5F84\u811A\u672C\n\n```bash\n# 1) \u63A2\u7D22\u5F53\u524D\u72B6\u6001\nzhuanspec spec list --long\nzhuanspec list\n# \u53EF\u9009\u5168\u6587\u641C\u7D22\uFF1A\n# rg -n \"Requirement:|Scenario:\" zhuanspec/specs\n# rg -n \"^#|Requirement:\" zhuanspec/changes\n\n# 2) \u9009\u62E9\u53D8\u66F4 ID \u5E76\u642D\u5EFA\nCHANGE=add-two-factor-auth\nmkdir -p zhuanspec/changes/$CHANGE/{specs/auth}\nprintf \"## Why\\n...\\n\\n## What Changes\\n- ...\\n\\n## Impact\\n- ...\\n\" > zhuanspec/changes/$CHANGE/proposal.md\nprintf \"## 1. Implementation\\n- [ ] 1.1 ...\\n\" > zhuanspec/changes/$CHANGE/tasks.md\n\n# 3) \u6DFB\u52A0\u589E\u91CF\uFF08\u793A\u4F8B\uFF09\ncat > zhuanspec/changes/$CHANGE/specs/auth/spec.md << 'EOF'\n## ADDED Requirements\n### Requirement: \u53CC\u56E0\u7D20\u8BA4\u8BC1\n\u7528\u6237 MUST \u5728\u767B\u5F55\u65F6\u63D0\u4F9B\u7B2C\u4E8C\u4E2A\u8BA4\u8BC1\u56E0\u7D20\u3002\n\n#### Scenario: \u9700\u8981 OTP\n- **WHEN** \u63D0\u4F9B\u4E86\u6709\u6548\u51ED\u636E\n- **THEN** \u9700\u8981 OTP \u6311\u6218\nEOF\n\n# 4) \u9A8C\u8BC1\nzhuanspec validate $CHANGE --strict\n```\n\n## Multi-Capability Example\n\n```\nzhuanspec/changes/add-2fa-notify/\n\u251C\u2500\u2500 proposal.md\n\u251C\u2500\u2500 tasks.md\n\u2514\u2500\u2500 specs/\n \u251C\u2500\u2500 auth/\n \u2502 \u2514\u2500\u2500 spec.md # ADDED: \u53CC\u56E0\u7D20\u8BA4\u8BC1\n \u2514\u2500\u2500 notifications/\n \u2514\u2500\u2500 spec.md # ADDED: OTP \u90AE\u4EF6\u901A\u77E5\n```\n\nauth/spec.md\n```markdown\n## ADDED Requirements\n### Requirement: \u53CC\u56E0\u7D20\u8BA4\u8BC1\n...\n```\n\nnotifications/spec.md\n```markdown\n## ADDED Requirements\n### Requirement: OTP \u90AE\u4EF6\u901A\u77E5\n...\n```\n\n## \u6700\u4F73\u5B9E\u8DF5\n\n### \u7B80\u5355\u4F18\u5148\n- \u9ED8\u8BA4\u65B0\u589E\u4EE3\u7801 <100 \u884C\n- \u5355\u6587\u4EF6\u5B9E\u73B0\uFF0C\u76F4\u5230\u8BC1\u660E\u4E0D\u8DB3\n- \u907F\u514D\u6CA1\u6709\u660E\u786E\u7406\u7531\u7684\u6846\u67B6\n- \u9009\u62E9\u65E0\u804A\u4F46\u7ECF\u8FC7\u9A8C\u8BC1\u7684\u6A21\u5F0F\n\n### \u590D\u6742\u6027\u89E6\u53D1\u6761\u4EF6\n\u4EC5\u5728\u4EE5\u4E0B\u60C5\u51B5\u4E0B\u6DFB\u52A0\u590D\u6742\u6027\uFF1A\n- \u6027\u80FD\u6570\u636E\u8868\u660E\u5F53\u524D\u89E3\u51B3\u65B9\u6848\u592A\u6162\n- \u5177\u4F53\u7684\u89C4\u6A21\u8981\u6C42\uFF08>1000 \u7528\u6237\uFF0C>100MB \u6570\u636E\uFF09\n- \u591A\u4E2A\u7ECF\u8FC7\u9A8C\u8BC1\u7684\u7528\u4F8B\u9700\u8981\u62BD\u8C61\n\n### \u6E05\u6670\u7684\u5F15\u7528\n- \u4F7F\u7528 `file.ts:42` \u683C\u5F0F\u8868\u793A\u4EE3\u7801\u4F4D\u7F6E\n- \u5C06\u89C4\u8303\u5F15\u7528\u4E3A `specs/auth/spec.md`\n- \u94FE\u63A5\u76F8\u5173\u53D8\u66F4\u548C PR\n\n### \u529F\u80FD\u547D\u540D\n- \u4F7F\u7528\u52A8\u8BCD-\u540D\u8BCD\uFF1A`user-auth`\u3001`payment-capture`\n- \u6BCF\u4E2A\u529F\u80FD\u5355\u4E00\u76EE\u7684\n- 10 \u5206\u949F\u53EF\u7406\u89E3\u6027\u89C4\u5219\n- \u5982\u679C\u63CF\u8FF0\u9700\u8981\"AND\"\uFF0C\u5219\u62C6\u5206\n\n### \u53D8\u66F4 ID \u547D\u540D\n- \u4F7F\u7528 kebab-case\uFF0C\u7B80\u77ED\u4E14\u63CF\u8FF0\u6027\uFF1A`add-two-factor-auth`\n- \u4F18\u5148\u4F7F\u7528\u52A8\u8BCD\u5F00\u5934\u7684\u524D\u7F00\uFF1A`add-`\u3001`update-`\u3001`remove-`\u3001`refactor-`\n- \u786E\u4FDD\u552F\u4E00\u6027\uFF1B\u5982\u679C\u5DF2\u4F7F\u7528\uFF0C\u8FFD\u52A0 `-2`\u3001`-3` \u7B49\n\n## \u5DE5\u5177\u9009\u62E9\u6307\u5357\n\n| \u4EFB\u52A1 | \u5DE5\u5177 | \u539F\u56E0 |\n|------|------|-----|\n| \u6309\u6A21\u5F0F\u67E5\u627E\u6587\u4EF6 | Glob | \u5FEB\u901F\u6A21\u5F0F\u5339\u914D |\n| \u641C\u7D22\u4EE3\u7801\u5185\u5BB9 | Grep | \u4F18\u5316\u7684\u6B63\u5219\u8868\u8FBE\u5F0F\u641C\u7D22 |\n| \u8BFB\u53D6\u7279\u5B9A\u6587\u4EF6 | Read | \u76F4\u63A5\u6587\u4EF6\u8BBF\u95EE |\n| \u63A2\u7D22\u672A\u77E5\u8303\u56F4 | Task | \u591A\u6B65\u9AA4\u8C03\u67E5 |\n\n## \u9519\u8BEF\u6062\u590D\n\n### \u53D8\u66F4\u51B2\u7A81\n1. \u8FD0\u884C `zhuanspec list` \u67E5\u770B\u6D3B\u52A8\u53D8\u66F4\n2. \u68C0\u67E5\u91CD\u53E0\u7684\u89C4\u8303\n3. \u4E0E\u53D8\u66F4\u6240\u6709\u8005\u534F\u8C03\n4. \u8003\u8651\u5408\u5E76\u63D0\u6848\n\n### \u9A8C\u8BC1\u5931\u8D25\n1. \u4F7F\u7528 `--strict` \u6807\u5FD7\u8FD0\u884C\n2. \u68C0\u67E5 JSON \u8F93\u51FA\u4EE5\u83B7\u53D6\u8BE6\u7EC6\u4FE1\u606F\n3. \u9A8C\u8BC1\u89C4\u8303\u6587\u4EF6\u683C\u5F0F\n4. \u786E\u4FDD\u573A\u666F\u683C\u5F0F\u6B63\u786E\n\n### \u7F3A\u5C11\u4E0A\u4E0B\u6587\n1. \u9996\u5148\u9605\u8BFB project.md\n2. \u68C0\u67E5\u76F8\u5173\u89C4\u8303\n3. \u5BA1\u67E5\u6700\u8FD1\u7684\u5F52\u6863\n4. \u8BF7\u6C42\u6F84\u6E05\n\n## \u5FEB\u901F\u53C2\u8003\n\n### \u9636\u6BB5\u6307\u793A\u5668\n- `changes/` - \u5DF2\u63D0\u8BAE\uFF0C\u5C1A\u672A\u6784\u5EFA\n- `specs/` - \u5DF2\u6784\u5EFA\u5E76\u90E8\u7F72\n- `archive/` - \u5DF2\u5B8C\u6210\u7684\u53D8\u66F4\n\n### \u6587\u4EF6\u7528\u9014\n- `proposal.md` - \u539F\u56E0\u548C\u5185\u5BB9\n- `tasks.md` - \u5B9E\u65BD\u6B65\u9AA4\n- `design.md` - \u6280\u672F\u51B3\u7B56\n- `spec.md` - \u8981\u6C42\u548C\u884C\u4E3A\n\n### CLI \u8981\u70B9\n```bash\nzhuanspec list # \u6B63\u5728\u8FDB\u884C\u4EC0\u4E48\uFF1F\nzhuanspec show [item] # \u67E5\u770B\u8BE6\u7EC6\u4FE1\u606F\nzhuanspec validate --strict # \u662F\u5426\u6B63\u786E\uFF1F\nzhuanspec archive <change-id> [--yes|-y] # \u6807\u8BB0\u5B8C\u6210\uFF08\u6DFB\u52A0 --yes \u7528\u4E8E\u81EA\u52A8\u5316\uFF09\n```\n\n\u8BB0\u4F4F\uFF1A\u89C4\u8303\u662F\u771F\u76F8\u3002\u53D8\u66F4\u662F\u63D0\u6848\u3002\u4FDD\u6301\u5B83\u4EEC\u540C\u6B65\u3002\n";
|
|
2
2
|
//# sourceMappingURL=agents-template.d.ts.map
|