@zhuan-ai/zhuanspec 2.0.0 → 2.1.1
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 +60 -37
- 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 +1 -1
- package/schemas/spec-driven/schema.yaml +13 -13
- package/schemas/spec-driven/templates/design.md +6 -6
- package/schemas/spec-driven/templates/proposal.md +7 -7
- package/schemas/spec-driven/templates/spec.md +4 -4
- package/schemas/tdd/schema.yaml +107 -107
- package/schemas/tdd/templates/implementation.md +5 -5
- package/schemas/tdd/templates/spec.md +6 -6
- package/schemas/tdd/templates/test.md +7 -7
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 **\u68C0\u67E5\u70B9 [\u5F3A\u5236\u6F84\u6E05]**\uFF1A\n \u5FC5\u987B\u5728 tasks.md \u4E2D\u8BB0\u5F55\u6F84\u6E05\u7ED3\u679C\uFF0C\u6DFB\u52A0 \"## \u6F84\u6E05\u65E5\u5FD7\" \u7AE0\u8282\uFF1A\n - \u5982\u679C\u8FDB\u884C\u4E86\u63D0\u95EE\uFF1A\u8BB0\u5F55\u6BCF\u4E2A\u95EE\u9898\u53CA\u7528\u6237\u7684\u56DE\u7B54\n - \u5982\u679C\u65E0\u9700\u6F84\u6E05\uFF1A\u5199\u660E\"\u72B6\u6001\uFF1A\u5DF2\u5B8C\u6210 - \u65E0\u9700\u6F84\u6E05\"\u5E76\u7B80\u8981\u8BF4\u660E\u7406\u7531\n - \u6B64\u7AE0\u8282\u4E0D\u80FD\u4E3A\u7A7A\u6216\u4EC5\u5305\u542B HTML \u6CE8\u91CA\n - \u672A\u5B8C\u6210\u6B64\u68C0\u67E5\u70B9\u524D\u7981\u6B62\u7EE7\u7EED\u7F16\u5199\u63D0\u6848\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## \u53D8\u66F4\u539F\u56E0\n[\u5173\u4E8E\u95EE\u9898/\u673A\u4F1A\u7684 1-2 \u53E5\u8BDD]\n\n## \u53D8\u66F4\u5185\u5BB9\n- [\u53D8\u66F4\u7684\u8981\u70B9\u5217\u8868]\n- [\u7528 **BREAKING** \u6807\u8BB0\u7834\u574F\u6027\u66F4\u6539]\n\n## \u5F71\u54CD\u8303\u56F4\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### \u9700\u6C42\uFF1ANew Feature\nThe system SHALL provide...\n\n#### \u573A\u666F\uFF1ASuccess case\n- **\u5F53** user performs action\n- **\u5219** expected result\n\n## MODIFIED Requirements\n### \u9700\u6C42\uFF1AExisting Feature\n[\u5B8C\u6574\u7684\u4FEE\u6539\u540E\u8981\u6C42]\n\n## REMOVED Requirements\n### \u9700\u6C42\uFF1AOld 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. \u5B9E\u73B0\n- [ ] 1.1 \u521B\u5EFA\u6570\u636E\u5E93\u8868\u7ED3\u6784 @skill:java-db-schema-standards\n- [ ] 1.2 \u5B9E\u73B0 RPC \u63A5\u53E3 @skill:java-scf-rpc-usage-skill\n- [ ] 1.3 \u6DFB\u52A0\u524D\u7AEF\u7EC4\u4EF6 @skill:kf-fe-frontend-dev\n- [ ] 1.4 \u7F16\u5199\u6D4B\u8BD5 @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 **\u68C0\u67E5\u70B9 [Skill \u6807\u6CE8]**\uFF1A\n1. \u5FC5\u987B\u5148\u8FD0\u884C `zhuanspec skills list` \u5E76\u5728 Skill \u6620\u5C04\u8868\u4E2D\u8BB0\u5F55\u53D1\u73B0\u7684 skill\n2. \u6BCF\u4E2A\u4EFB\u52A1\u5FC5\u987B\u6807\u6CE8 @skill:\u771F\u5B9Eskill\u540D\u79F0 \u6216 @skill:none\n3. \u5982\u679C\u4F7F\u7528 @skill:none\uFF0C\u5FC5\u987B\u63D0\u4F9B\u7406\u7531\uFF08\u4F8B\u5982\uFF1A\"\u7EAF\u914D\u7F6E\u53D8\u66F4\uFF0C\u65E0\u9700 skill\"\uFF09\n4. @skill \u540D\u79F0\u5FC5\u987B\u4E0E `zhuanspec skills list` \u8FD4\u56DE\u7684\u540D\u79F0\u5B8C\u5168\u4E00\u81F4 \u2014\u2014 \u7981\u6B62\u865A\u6784 skill \u540D\u79F0\n5. tasks.md \u4E2D\u7684 Skill \u6620\u5C04\u8868\u4E0D\u80FD\u4E3A\u7A7A\n6. validate --strict \u4F1A\u9A8C\u8BC1\u6240\u6709 @skill \u540D\u79F0\u662F\u5426\u5B58\u5728\u4E8E\u5DF2\u77E5 skill \u5217\u8868\u4E2D\n\n\u26A0\uFE0F **\u68C0\u67E5\u70B9 [\u4EFB\u52A1\u6392\u5E8F]**\uFF1A\n1. tasks.md \u4E2D\u7684\u4EFB\u52A1\u5FC5\u987B\u6309\u6CE2\u6B21\u7EC4\u7EC7\uFF08### \u6CE2\u6B21 1, ### \u6CE2\u6B21 2 \u7B49\uFF09\n2. \u6CE2\u6B21\u5206\u914D\u5FC5\u987B\u6839\u636E @depends \u4F9D\u8D56\u5173\u7CFB\u8BA1\u7B97\uFF08\u6CE2\u6B21 1 = \u65E0\u4F9D\u8D56\uFF0C\u6CE2\u6B21 N = \u4F9D\u8D56\u6CE2\u6B21 N-1\uFF09\n3. \u4EFB\u52A1\u4E0D\u80FD\u51FA\u73B0\u5728\u5176\u4F9D\u8D56\u7684\u4EFB\u52A1\u4E4B\u524D\n4. \u5FC5\u987B\u5728\u6587\u4EF6\u672B\u5C3E\u6DFB\u52A0 \"## \u4F9D\u8D56\u5206\u6790\" \u7AE0\u8282\u5E76\u6807\u660E\"\u72B6\u6001\uFF1A\u5DF2\u5B8C\u6210\"\n5. validate --strict \u4F1A\u9A8C\u8BC1\u4EFB\u52A1\u6392\u5E8F\u662F\u5426\u4E0E\u8BA1\u7B97\u7684\u6CE2\u6B21\u5339\u914D\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## \u80CC\u666F\n[\u80CC\u666F\u3001\u7EA6\u675F\u3001\u5229\u76CA\u76F8\u5173\u8005]\n\n## \u76EE\u6807 / \u975E\u76EE\u6807\n- Goals: [...]\n- Non-Goals: [...]\n\n## \u51B3\u7B56\n- Decision: [\u5185\u5BB9\u548C\u539F\u56E0]\n- Alternatives considered: [\u9009\u9879 + \u7406\u7531]\n\n## \u98CE\u9669 / \u6743\u8861\n- [\u98CE\u9669] \u2192 \u7F13\u89E3\u63AA\u65BD\n\n## \u8FC1\u79FB\u8BA1\u5212\n[\u6B65\u9AA4\u3001\u56DE\u6EDA]\n\n## \u5F85\u89E3\u51B3\u95EE\u9898\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#### \u573A\u666F\uFF1A\u7528\u6237\u767B\u5F55\u6210\u529F\n- **\u5F53** \u63D0\u4F9B\u4E86\u6709\u6548\u51ED\u636E\n- **\u5219** \u8FD4\u56DE JWT token\n```\n\n**\u9519\u8BEF**\uFF08\u4E0D\u8981\u4F7F\u7528\u9879\u76EE\u7B26\u53F7\u6216\u7C97\u4F53\uFF09\uFF1A\n```markdown\n- **\u573A\u666F\uFF1A\u7528\u6237\u767B\u5F55** \u274C\n**\u573A\u666F**\uFF1A\u7528\u6237\u767B\u5F55 \u274C\n### \u573A\u666F\uFF1A\u7528\u6237\u767B\u5F55 \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: `### \u9700\u6C42\uFF1ALogin`\n- TO: `### \u9700\u6C42\uFF1AUser 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 \"## \u53D8\u66F4\u539F\u56E0\\n...\\n\\n## \u53D8\u66F4\u5185\u5BB9\\n- ...\\n\\n## \u5F71\u54CD\u8303\u56F4\\n- ...\\n\" > zhuanspec/changes/\\$CHANGE/proposal.md\nprintf \"## 1. \u5B9E\u73B0\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### \u9700\u6C42\uFF1A\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#### \u573A\u666F\uFF1A\u9700\u8981 OTP\n- **\u5F53** \u63D0\u4F9B\u4E86\u6709\u6548\u51ED\u636E\n- **\u5219** \u9700\u8981 OTP \u6311\u6218\nEOF\n\n# 4) \u9A8C\u8BC1\nzhuanspec validate $CHANGE --strict\n```\n\n## \u591A\u529F\u80FD\u793A\u4F8B\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### \u9700\u6C42\uFF1A\u53CC\u56E0\u7D20\u8BA4\u8BC1\n...\n```\n\nnotifications/spec.md\n```markdown\n## ADDED Requirements\n### \u9700\u6C42\uFF1AOTP \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
|