@zhuan-ai/zhuanspec 2.4.8 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,6 +7,12 @@
7
7
  * - Estimated remaining time
8
8
  */
9
9
  export declare class ProgressCommand {
10
+ /**
11
+ * Recover damaged progress.json using three-tier fallback strategy
12
+ * @param filePath - Path to progress.json file
13
+ * @returns Recovered ProgressData or null if unrecoverable
14
+ */
15
+ private recoverProgressJson;
10
16
  /**
11
17
  * Show progress for a specific change
12
18
  * Usage: zhuanspec progress show <change-id>
@@ -12,6 +12,69 @@ import { FileSystemUtils } from '../utils/file-system.js';
12
12
  import { PHASE_ORDER } from '../utils/phase-utils.js';
13
13
  import { initializeProgress } from '../core/hooks/record-progress.js';
14
14
  export class ProgressCommand {
15
+ /**
16
+ * Recover damaged progress.json using three-tier fallback strategy
17
+ * @param filePath - Path to progress.json file
18
+ * @returns Recovered ProgressData or null if unrecoverable
19
+ */
20
+ async recoverProgressJson(filePath) {
21
+ const content = await FileSystemUtils.readFile(filePath);
22
+ // Layer 1: Standard JSON parse
23
+ try {
24
+ return JSON.parse(content);
25
+ }
26
+ catch {
27
+ // Continue to Layer 2
28
+ }
29
+ // Layer 2: Extract first top-level JSON object (handle trailing corruption)
30
+ try {
31
+ // Find the first complete JSON object
32
+ const objectStart = content.indexOf('{');
33
+ if (objectStart === -1)
34
+ return null;
35
+ // Track brace depth to find object boundary
36
+ let depth = 0;
37
+ let objectEnd = -1;
38
+ for (let i = objectStart; i < content.length; i++) {
39
+ if (content[i] === '{')
40
+ depth++;
41
+ else if (content[i] === '}') {
42
+ depth--;
43
+ if (depth === 0) {
44
+ objectEnd = i + 1;
45
+ break;
46
+ }
47
+ }
48
+ }
49
+ if (objectEnd > objectStart) {
50
+ const objectContent = content.slice(objectStart, objectEnd);
51
+ return JSON.parse(objectContent);
52
+ }
53
+ }
54
+ catch {
55
+ // Continue to Layer 3
56
+ }
57
+ // Layer 3: Minimal field extraction using regex
58
+ const phaseMatch = content.match(/"phase"\s*:\s*"([^"]+)"/);
59
+ const currentTaskMatch = content.match(/"currentTask"\s*:\s*"([^"]+)"/);
60
+ const totalTasksMatch = content.match(/"totalTasks"\s*:\s*(\d+)/);
61
+ const changeIdMatch = content.match(/"changeId"\s*:\s*"([^"]+)"/);
62
+ const sessionIdMatch = content.match(/"sessionId"\s*:\s*"([^"]+)"/);
63
+ if (phaseMatch || changeIdMatch) {
64
+ return {
65
+ changeId: changeIdMatch?.[1] || '',
66
+ sessionId: sessionIdMatch?.[1] || '',
67
+ startedAt: '',
68
+ lastUpdatedAt: '',
69
+ phase: phaseMatch?.[1] || 'unknown',
70
+ currentNode: phaseMatch?.[1] || 'unknown',
71
+ currentTask: currentTaskMatch?.[1] || '',
72
+ completedTasks: [],
73
+ totalTasks: totalTasksMatch ? parseInt(totalTasksMatch[1], 10) : 0,
74
+ };
75
+ }
76
+ return null;
77
+ }
15
78
  /**
16
79
  * Show progress for a specific change
17
80
  * Usage: zhuanspec progress show <change-id>
@@ -24,16 +87,11 @@ export class ProgressCommand {
24
87
  if (!await FileSystemUtils.directoryExists(changeDir)) {
25
88
  throw new Error(`Change '${changeId}' not found`);
26
89
  }
27
- // Read progress.json
90
+ // Read progress.json with recovery support
28
91
  const progressPath = path.join(metricsDir, 'progress.json');
29
92
  let progress = null;
30
93
  if (await FileSystemUtils.fileExists(progressPath)) {
31
- try {
32
- progress = JSON.parse(await FileSystemUtils.readFile(progressPath));
33
- }
34
- catch {
35
- // Ignore parse errors
36
- }
94
+ progress = await this.recoverProgressJson(progressPath);
37
95
  }
38
96
  // Read tasks.md
39
97
  const tasksPath = path.join(changeDir, 'tasks.md');
@@ -67,16 +125,11 @@ export class ProgressCommand {
67
125
  }
68
126
  const changeDir = path.join(zhuanspecDir, 'changes', changeId);
69
127
  const metricsDir = path.join(changeDir, 'metrics');
70
- // Read progress.json
128
+ // Read progress.json with recovery support
71
129
  const progressPath = path.join(metricsDir, 'progress.json');
72
130
  let progress = null;
73
131
  if (await FileSystemUtils.fileExists(progressPath)) {
74
- try {
75
- progress = JSON.parse(await FileSystemUtils.readFile(progressPath));
76
- }
77
- catch {
78
- // Ignore parse errors
79
- }
132
+ progress = await this.recoverProgressJson(progressPath);
80
133
  }
81
134
  // Read tasks.md
82
135
  const tasksPath = path.join(changeDir, 'tasks.md');
@@ -126,18 +179,36 @@ export class ProgressCommand {
126
179
  currentWave = parseInt(waveMatch[1], 10);
127
180
  continue;
128
181
  }
129
- // Match task lines: - [ ] X.Y description or - [x] X.Y description
130
- const taskMatch = line.match(/^-\s*\[([x ])\]\s*(\d+\.\d+)\s*(.+)/);
131
- if (taskMatch) {
132
- const statusChar = taskMatch[1];
133
- const taskId = taskMatch[2];
134
- const description = taskMatch[3].trim();
182
+ // Match new format task lines: - [ ] X.Y description or - [x] X.Y description
183
+ const newFormatMatch = line.match(/^-\s*\[([x ])\]\s*(\d+\.\d+)\s*(.+)/);
184
+ if (newFormatMatch) {
185
+ const statusChar = newFormatMatch[1];
186
+ const taskId = newFormatMatch[2];
187
+ const description = newFormatMatch[3].trim();
135
188
  tasks.push({
136
189
  taskId,
137
190
  status: statusChar === 'x' ? 'completed' : 'pending',
138
191
  wave: currentWave,
139
192
  description: description.split('@')[0].trim(), // Remove @skill/@depends tags
140
193
  });
194
+ continue;
195
+ }
196
+ // Match legacy format task headers: #### T1: description or #### T2: description
197
+ const legacyMatch = line.match(/^####\s*(T\d+)\s*:\s*(.+)$/);
198
+ if (legacyMatch) {
199
+ const taskId = legacyMatch[1];
200
+ const rawDescription = legacyMatch[2].trim();
201
+ // Check if description ends with ✅ (completed marker)
202
+ const isCompleted = rawDescription.endsWith('✅');
203
+ const description = isCompleted
204
+ ? rawDescription.slice(0, -1).trim()
205
+ : rawDescription;
206
+ tasks.push({
207
+ taskId,
208
+ status: isCompleted ? 'completed' : 'pending',
209
+ wave: currentWave,
210
+ description: description.split('@')[0].trim(), // Remove @skill/@depends tags
211
+ });
141
212
  }
142
213
  }
143
214
  return tasks;
@@ -11,15 +11,118 @@ import { promises as fsPromises } from 'fs';
11
11
  import { FileSystemUtils } from '../../utils/file-system.js';
12
12
  import { PHASE_ORDER } from '../../utils/phase-utils.js';
13
13
  const fs = fsPromises;
14
+ /**
15
+ * Atomic write JSON file: write to temp file first, then rename
16
+ * This prevents half-written files during crashes or concurrent writes
17
+ * @param filePath - Target file path
18
+ * @param data - Data to write (will be JSON stringified)
19
+ */
20
+ async function atomicWriteJson(filePath, data) {
21
+ const tmpPath = `${filePath}.tmp`;
22
+ const content = JSON.stringify(data, null, 2);
23
+ try {
24
+ // Write to temp file first
25
+ await FileSystemUtils.writeFile(tmpPath, content);
26
+ // Rename to final path (atomic on most filesystems)
27
+ await fs.rename(tmpPath, filePath);
28
+ }
29
+ catch {
30
+ // On failure, try to clean up temp file
31
+ try {
32
+ await fs.unlink(tmpPath);
33
+ }
34
+ catch {
35
+ // Ignore cleanup errors
36
+ }
37
+ // Do not throw - preserve original file and continue silently
38
+ }
39
+ }
40
+ /**
41
+ * Recover damaged progress.json for write operations
42
+ * Uses same three-tier strategy as read side
43
+ * @param filePath - Path to progress.json
44
+ * @returns Recovered ProgressData or null
45
+ */
46
+ async function recoverProgressJsonForWrite(filePath) {
47
+ try {
48
+ const content = await FileSystemUtils.readFile(filePath);
49
+ // Layer 1: Standard JSON parse
50
+ try {
51
+ return JSON.parse(content);
52
+ }
53
+ catch {
54
+ // Continue to Layer 2
55
+ }
56
+ // Layer 2: Extract first top-level JSON object
57
+ const objectStart = content.indexOf('{');
58
+ if (objectStart === -1)
59
+ return null;
60
+ let depth = 0;
61
+ let objectEnd = -1;
62
+ for (let i = objectStart; i < content.length; i++) {
63
+ if (content[i] === '{')
64
+ depth++;
65
+ else if (content[i] === '}') {
66
+ depth--;
67
+ if (depth === 0) {
68
+ objectEnd = i + 1;
69
+ break;
70
+ }
71
+ }
72
+ }
73
+ if (objectEnd > objectStart) {
74
+ try {
75
+ return JSON.parse(content.slice(objectStart, objectEnd));
76
+ }
77
+ catch {
78
+ // Continue to Layer 3
79
+ }
80
+ }
81
+ // Layer 3: Minimal field extraction
82
+ const phaseMatch = content.match(/"phase"\s*:\s*"([^"]+)"/);
83
+ const changeIdMatch = content.match(/"changeId"\s*:\s*"([^"]+)"/);
84
+ const sessionIdMatch = content.match(/"sessionId"\s*:\s*"([^"]+)"/);
85
+ if (phaseMatch || changeIdMatch) {
86
+ return {
87
+ changeId: changeIdMatch?.[1] || '',
88
+ sessionId: sessionIdMatch?.[1] || '',
89
+ startedAt: '',
90
+ lastUpdatedAt: '',
91
+ phase: phaseMatch?.[1] || 'unknown',
92
+ currentNode: phaseMatch?.[1] || 'unknown',
93
+ currentTask: '',
94
+ completedTasks: [],
95
+ totalTasks: 0,
96
+ toolCalls: [],
97
+ skillCalls: [],
98
+ hookTriggers: [],
99
+ clarifications: [],
100
+ filesModified: [],
101
+ linesAdded: 0,
102
+ linesRemoved: 0,
103
+ deviationCount: 0,
104
+ deviationRecords: [],
105
+ reviewStats: { loopCount: 0, criticalFixes: 0, testFixes: 0, consistencyFixes: 0 },
106
+ phaseTransitions: [],
107
+ stats: { tokenUsageTotal: 0, contextLoad: 0, durationMs: { propose: 0, apply: 0, review: 0, archive: 0 } },
108
+ };
109
+ }
110
+ }
111
+ catch {
112
+ // File read error - return null
113
+ }
114
+ return null;
115
+ }
14
116
  /**
15
117
  * Get Beijing time (UTC+8) as ISO string format
16
118
  * Returns format: "2026-04-19T18:35:22.934+08:00"
17
119
  */
18
120
  export function getBeijingTime() {
19
121
  const now = new Date();
20
- // Beijing time is UTC+8
21
- const beijingOffset = 8 * 60; // 8 hours in minutes
22
- const beijingTime = new Date(now.getTime() + beijingOffset * 60 * 1000 - now.getTimezoneOffset() * 60 * 1000);
122
+ // Get UTC time and add 8 hours for Beijing
123
+ const utcMs = now.getTime() + now.getTimezoneOffset() * 60 * 1000;
124
+ const beijingMs = utcMs + 8 * 60 * 60 * 1000;
125
+ const beijingTime = new Date(beijingMs);
23
126
  // Format as ISO string with +08:00 timezone
24
127
  const year = beijingTime.getFullYear();
25
128
  const month = String(beijingTime.getMonth() + 1).padStart(2, '0');
@@ -36,8 +139,10 @@ export function getBeijingTime() {
36
139
  */
37
140
  export function getBeijingTimeForFilename() {
38
141
  const now = new Date();
39
- const beijingOffset = 8 * 60;
40
- const beijingTime = new Date(now.getTime() + beijingOffset * 60 * 1000 - now.getTimezoneOffset() * 60 * 1000);
142
+ // Get UTC time and add 8 hours for Beijing
143
+ const utcMs = now.getTime() + now.getTimezoneOffset() * 60 * 1000;
144
+ const beijingMs = utcMs + 8 * 60 * 60 * 1000;
145
+ const beijingTime = new Date(beijingMs);
41
146
  const year = beijingTime.getFullYear();
42
147
  const month = String(beijingTime.getMonth() + 1).padStart(2, '0');
43
148
  const day = String(beijingTime.getDate()).padStart(2, '0');
@@ -147,11 +252,12 @@ async function runRecordProgress(filePath, toolName, success, stdinData) {
147
252
  await FileSystemUtils.createDirectory(metricsDir);
148
253
  const progressPath = path.join(metricsDir, 'progress.json');
149
254
  const toolCallsPath = path.join(metricsDir, 'tool_calls.json');
150
- // Load existing progress or create new
255
+ // Load existing progress or create new (with recovery support)
151
256
  let progress;
152
257
  if (await FileSystemUtils.fileExists(progressPath)) {
153
- try {
154
- progress = JSON.parse(await FileSystemUtils.readFile(progressPath));
258
+ const recovered = await recoverProgressJsonForWrite(progressPath);
259
+ if (recovered) {
260
+ progress = recovered;
155
261
  progress.phase = progress.phase || phase;
156
262
  progress.currentNode = progress.currentNode || phase;
157
263
  progress.completedTasks = progress.completedTasks || [];
@@ -183,7 +289,7 @@ async function runRecordProgress(filePath, toolName, success, stdinData) {
183
289
  archive: 0,
184
290
  };
185
291
  }
186
- catch {
292
+ else {
187
293
  progress = createNewProgress(changeId);
188
294
  }
189
295
  }
@@ -290,17 +396,26 @@ async function runRecordProgress(filePath, toolName, success, stdinData) {
290
396
  const contextLoadFromStdIn = Number(stdinData.tool_result?.contextLoad || 0);
291
397
  progress.stats.tokenUsageTotal += tokenUsageFromEnv + tokenUsageFromStdIn;
292
398
  progress.stats.contextLoad += contextLoadFromEnv + contextLoadFromStdIn;
293
- const elapsedMs = Date.now() - new Date(progress.startedAt).getTime();
294
- if (phase === 'propose')
295
- progress.stats.durationMs.propose = elapsedMs;
296
- if (phase === 'apply')
297
- progress.stats.durationMs.apply = elapsedMs;
298
- if (phase === 'review')
299
- progress.stats.durationMs.review = elapsedMs;
300
- if (phase === 'archive')
301
- progress.stats.durationMs.archive = elapsedMs;
302
- // Write progress file
303
- await FileSystemUtils.writeFile(progressPath, JSON.stringify(progress, null, 2));
399
+ // Calculate duration for current phase from phaseTransitions
400
+ // Find the last transition to current phase
401
+ const transitionsToCurrentPhase = progress.phaseTransitions.filter((t) => t.to === phase);
402
+ const currentPhaseStart = transitionsToCurrentPhase[transitionsToCurrentPhase.length - 1];
403
+ if (currentPhaseStart) {
404
+ const startTime = new Date(currentPhaseStart.timestamp).getTime();
405
+ const elapsedMs = Date.now() - startTime;
406
+ if (elapsedMs > 0) {
407
+ if (phase === 'propose')
408
+ progress.stats.durationMs.propose = elapsedMs;
409
+ if (phase === 'apply')
410
+ progress.stats.durationMs.apply = elapsedMs;
411
+ if (phase === 'review')
412
+ progress.stats.durationMs.review = elapsedMs;
413
+ if (phase === 'archive')
414
+ progress.stats.durationMs.archive = elapsedMs;
415
+ }
416
+ }
417
+ // Write progress file atomically
418
+ await atomicWriteJson(progressPath, progress);
304
419
  // Also update tool_calls.json separately for detailed tracking
305
420
  let toolCallsLog;
306
421
  if (await FileSystemUtils.fileExists(toolCallsPath)) {
@@ -423,16 +538,16 @@ export async function initializeProgress(changeId, initialPhase = 'propose') {
423
538
  // Ensure metrics directory exists
424
539
  await FileSystemUtils.createDirectory(metricsDir);
425
540
  const progressPath = path.join(metricsDir, 'progress.json');
426
- // Create or update progress file
541
+ // Create or update progress file (with recovery support)
427
542
  let progress;
428
543
  if (await FileSystemUtils.fileExists(progressPath)) {
429
- try {
430
- progress = JSON.parse(await FileSystemUtils.readFile(progressPath));
431
- // Update phase (support phase transitions)
544
+ const recovered = await recoverProgressJsonForWrite(progressPath);
545
+ if (recovered) {
546
+ progress = recovered;
432
547
  progress.phase = initialPhase;
433
548
  progress.currentNode = initialPhase;
434
549
  }
435
- catch {
550
+ else {
436
551
  progress = createNewProgress(changeId);
437
552
  progress.phase = initialPhase;
438
553
  progress.currentNode = initialPhase;
@@ -444,7 +559,7 @@ export async function initializeProgress(changeId, initialPhase = 'propose') {
444
559
  progress.currentNode = initialPhase;
445
560
  }
446
561
  progress.lastUpdatedAt = getBeijingTime();
447
- await FileSystemUtils.writeFile(progressPath, JSON.stringify(progress, null, 2));
562
+ await atomicWriteJson(progressPath, progress);
448
563
  }
449
564
  /**
450
565
  * Record a hook trigger event
@@ -485,7 +600,7 @@ export async function recordHookTrigger(hookName, hookPhase, success, options) {
485
600
  };
486
601
  progress.hookTriggers.push(hookRecord);
487
602
  progress.lastUpdatedAt = getBeijingTime();
488
- await FileSystemUtils.writeFile(progressPath, JSON.stringify(progress, null, 2));
603
+ await atomicWriteJson(progressPath, progress);
489
604
  }
490
605
  catch {
491
606
  // Ignore errors
@@ -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---\n\n## \u26A1 \u4E09\u6761\u94C1\u5F8B\uFF08\u4E0D\u53EF\u8FDD\u53CD\uFF09\n\n> \u4E09\u6761\u94C1\u5F8B\u662F ZhuanSpec \u5DE5\u4F5C\u6D41\u7684\u6838\u5FC3\u7EA6\u675F\uFF0C\u4EFB\u4F55\u60C5\u51B5\u4E0B\u90FD\u5FC5\u987B\u9075\u5B88\u3002\n\n| \u94C1\u5F8B | \u542B\u4E49 | \u8FDD\u53CD\u540E\u679C |\n|------|------|---------|\n| **No Spec, No Code** | \u6CA1\u6709\u6587\u6863\u4E0D\u51C6\u5199\u4EE3\u7801 | Propose \u9636\u6BB5\u4EA7\u51FA spec \u624D\u80FD\u8FDB\u5165 Apply |\n| **Spec is Truth** | \u6587\u6863\u4E0E\u4EE3\u7801\u51B2\u7A81\u65F6\uFF0C\u9519\u7684\u4E00\u5B9A\u662F\u4EE3\u7801 | \u5F52\u6863\u65F6\u5F3A\u5236\u6821\u9A8C Spec-Code \u4E00\u81F4\u6027 |\n| **Reverse Sync** | \u53D1\u73B0\u504F\u5DEE\u5148\u4FEE Spec\uFF0C\u518D\u4FEE\u4EE3\u7801 | Apply \u9636\u6BB5\u6BCF\u5B8C\u6210\u4E00\u4E2A Task \u505A\u504F\u5DEE\u68C0\u6D4B |\n\n### \u94C1\u5F8B\u6267\u884C\u673A\u5236\n\n**\u94C1\u5F8B\u4E00\u6267\u884C**\uFF1A\n- Propose \u9636\u6BB5\u521B\u5EFA\u63D0\u6848\u540E\uFF0C\u5FC5\u987B\u7B49\u5F85\u7528\u6237\u660E\u786E\u6279\u51C6\uFF08\u56DE\u590D\"Plan Approved\"\u6216\u9009\u62E9\"\u6279\u51C6\uFF0C\u8FDB\u5165\u5B9E\u65BD\u9636\u6BB5\"\uFF09\u624D\u80FD\u8FDB\u5165 Apply\n- \u81EA\u52A8\u9A8C\u8BC1\u901A\u8FC7\u540E\uFF0C\u4F7F\u7528\u9009\u9879\u5F0F\u4EA4\u4E92\uFF08AskUserQuestion\uFF09\u5F39\u51FA\u786E\u8BA4\u5BF9\u8BDD\u6846\n- \u672A\u6279\u51C6\u524D\uFF0CPreToolUse Hook \u963B\u65AD\u6240\u6709\u4EE3\u7801\u4FEE\u6539\u64CD\u4F5C\n\n**\u94C1\u5F8B\u4E8C\u6267\u884C**\uFF1A\n- Archive \u9636\u6BB5\u524D\uFF0C\u5FC5\u987B\u9A8C\u8BC1\u5F52\u6863\u5185\u5BB9\u4E0E\u4EE3\u7801\u5B9E\u73B0\u4E00\u81F4\n- \u5982\u4E0D\u4E00\u81F4\uFF0C\u5FC5\u987B\u5148\u66F4\u65B0\u5F52\u6863\u5185\u5BB9\uFF0C\u518D\u5B8C\u6210\u5F52\u6863\n- PreArchive Hook \u68C0\u67E5 Spec-Code \u4E00\u81F4\u6027\n\n**\u94C1\u5F8B\u4E09\u6267\u884C**\uFF1A\n- Apply \u9636\u6BB5\u6BCF\u6B21 Write/Edit \u64CD\u4F5C\u524D\uFF0CPreToolUse Hook \u68C0\u6D4B\u504F\u79BB\n- **\u504F\u79BB\u68C0\u6D4B\u89E6\u53D1\u673A\u5236**\uFF1A\n - \u63D0\u6848\u8303\u56F4\u5916\u6587\u4EF6\u4FEE\u6539\u65F6\u81EA\u52A8\u89E6\u53D1\n - \u7528\u6237\u8F93\u5165\u7EA0\u6B63\u5173\u952E\u8BCD\uFF08\"\u4E0D\u5BF9\"\u3001\"\u9519\u4E86\"\u3001\"\u8FD9\u91CC\u5E94\u8BE5\u662F\"\u7B49\uFF09\u65F6\u81EA\u52A8\u89E6\u53D1\n - \u901A\u8FC7\u8BFB\u53D6 `progress.json` \u7684 `phase` \u5B57\u6BB5\u5224\u65AD\u5F53\u524D\u9636\u6BB5\n- \u5982\u679C\u4FEE\u6539\u6587\u4EF6\u4E0D\u5728\u63D0\u6848\u8303\u56F4\u5185\uFF0C\u89E6\u53D1\u504F\u79BB\u5904\u7406\u6D41\u7A0B\uFF1A\n 1. \u5F39\u51FA\u9009\u9879\u5F0F\u4EA4\u4E92\uFF1A\u66F4\u65B0\u63D0\u6848\u540E\u7EE7\u7EED / Bug\u4FEE\u590D\u8C41\u514D / \u53D6\u6D88\u4FEE\u6539\n 2. \u7528\u6237\u9009\u62E9\"\u66F4\u65B0\u63D0\u6848\u540E\u7EE7\u7EED\" \u2192 AI \u8FDB\u5165 Propose \u6A21\u5F0F \u2192 \u81EA\u52A8\u66F4\u65B0 proposal.md \u548C tasks.md \u2192 `zhuanspec validate --auto-fix` \u2192 \u8FD4\u56DE Apply \u6267\u884C\u539F\u4FEE\u6539\n 3. \u7528\u6237\u9009\u62E9\"Bug\u4FEE\u590D\u8C41\u514D\" \u2192 \u6807\u8BB0\u4E3A Bug \u4FEE\u590D \u2192 \u5141\u8BB8\u4FEE\u6539\uFF0C\u8DF3\u8FC7\u63D0\u6848\u6D41\u7A0B\n 4. \u7528\u6237\u9009\u62E9\"\u53D6\u6D88\" \u2192 \u4E0D\u6267\u884C\u4FEE\u6539 \u2192 \u7EE7\u7EED\u539F\u4EFB\u52A1\n- **\u504F\u79BB\u4FEE\u6B63\u6D41\u7A0B**\uFF08\u7528\u6237\u7EA0\u6B63\u65F6\uFF09\uFF1A\n 1. \u5148\u4FEE\u6539 spec \u6587\u4EF6\uFF0C\u5B9E\u65F6\u540C\u6B65\u7528\u6237\u786E\u8BA4\n 2. \u7528\u6237\u786E\u8BA4\u540E\u4FEE\u6539\u4EE3\u7801\uFF0C\u5B8C\u6210\u540E\u9A8C\u8BC1\n 3. \u7528\u6237\u786E\u8BA4\u65E0\u8BEF\u540E\u89E6\u53D1\u77E5\u8BC6\u6C89\u6DC0\n\n### AI \u81EA\u7531\u5EA6\u63A7\u5236\u77E9\u9635\n\n| \u9636\u6BB5 | \u81EA\u7531\u5EA6 | \u5141\u8BB8\u884C\u4E3A | \u7981\u6B62\u884C\u4E3A |\n|------|--------|---------|---------|\n| **Propose** | \u9AD8 | \u63A2\u7D22\u4EE3\u7801\u3001\u8BBE\u8BA1\u65B9\u6848\u3001\u63D0\u95EE\u6F84\u6E05 | \u7F16\u5199\u4EFB\u4F55\u4EE3\u7801 |\n| **Apply** | \u96F6 | \u4E25\u683C\u6309 tasks.md \u65BD\u5DE5 | \u8D85\u51FA\u63D0\u6848\u8303\u56F4\u4FEE\u6539\u3001\u81EA\u884C\u6DFB\u52A0\u4EFB\u52A1 |\n| **Review** | \u4E2D | \u9A8C\u8BC1\u5B9E\u73B0\u3001\u751F\u6210\u6D4B\u8BD5\u3001\u5BA1\u67E5\u4EE3\u7801 | \u4FEE\u6539\u529F\u80FD\u4EE3\u7801 |\n| **Archive** | \u4F4E | \u5408\u5E76\u89C4\u8303\u3001\u751F\u6210\u6458\u8981 | \u4FEE\u6539\u5DF2\u5F52\u6863\u5185\u5BB9 |\n\n---\n\n## \u77E5\u8BC6\u5E93\u68C0\u67E5\n\n**\u5728\u4EFB\u4F55\u9636\u6BB5\u5F00\u59CB\u524D\uFF0C\u5FC5\u987B\u5148\u68C0\u67E5\u77E5\u8BC6\u5E93\uFF1A**\n\n| \u64CD\u4F5C | \u547D\u4EE4 | \u76EE\u7684 |\n|------|------|------|\n| \u641C\u7D22\u9677\u9631 | `rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/troubleshooting/` | \u907F\u514D\u91CD\u590D\u8E29\u5751 |\n| \u641C\u7D22\u6700\u4F73\u5B9E\u8DF5 | `rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/best-practices/` | \u5B66\u4E60\u6210\u529F\u7ECF\u9A8C |\n| \u641C\u7D22\u9690\u5F0F\u7EA6\u5B9A | `rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/implicit-conventions/` | \u7406\u89E3\u56E2\u961F\u7EA6\u5B9A |\n| \u9605\u8BFB\u77E5\u8BC6\u7D22\u5F15 | `cat zhuanspec/knowledge/index.md` | \u4E86\u89E3\u9879\u76EE\u7EA7\u77E5\u8BC6\u6458\u8981 |\n\n**\u77E5\u8BC6\u5E93\u4F5C\u7528**\uFF1A\n- \u51CF\u5C11\u91CD\u590D\u8E29\u5751\uFF0C\u79EF\u7D2F\u9879\u76EE\u7ECF\u9A8C\n- \u63D0\u4F9B\u56E2\u961F\u9690\u5F0F\u7EA6\u5B9A\u7684\u4E66\u9762\u8BB0\u5F55\n- \u52A0\u901F\u65B0\u6210\u5458\u878D\u5165\u548C\u77E5\u8BC6\u4F20\u627F\n\n---\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- **\u68C0\u67E5\u77E5\u8BC6\u5E93**\uFF1A`rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/` \u641C\u7D22\u76F8\u5173\u9677\u9631\u548C\u6700\u4F73\u5B9E\u8DF5\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`\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## \u8FDB\u5EA6\u6C47\u62A5\u7EA6\u5B9A\n\nApply \u9636\u6BB5\u6267\u884C\u6BCF\u4E2A\u4EFB\u52A1\u65F6\uFF0C\u5FC5\u987B\u6309\u4EE5\u4E0B\u683C\u5F0F\u8F93\u51FA\u8FDB\u5EA6\uFF1A\n\n**\u4EFB\u52A1\u5F00\u59CB\u65F6**\uFF1A\n```\n\u2501\u2501\u2501 \uD83D\uDE80 \u5F00\u59CB\u4EFB\u52A1 [X.Y/N] \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\u4EFB\u52A1: [\u4EFB\u52A1\u63CF\u8FF0]\nWave: W/N | Phase: Apply\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n```\n\n**\u4EFB\u52A1\u5B8C\u6210\u540E**\uFF1A\n```\n\u2501\u2501\u2501 \u2705 \u4EFB\u52A1\u5B8C\u6210 [X.Y/N] \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\u5DF2\u4FEE\u6539: [\u6587\u4EF6\u5217\u8868]\n\u4E0B\u4E00\u4E2A: [\u4E0B\u4E00\u4EFB\u52A1ID]\n\u6574\u4F53\u8FDB\u5EA6: \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591 XX.X%\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n```\n\n**\u8FDB\u5EA6\u6761\u683C\u5F0F**\uFF1A\n- \u4F7F\u7528 12 \u4E2A block \u5B57\u7B26\uFF08\u2588 \u548C \u2591\uFF09\n- \u8FDB\u5EA6\u767E\u5206\u6BD4 = (\u5DF2\u5B8C\u6210\u4EFB\u52A1\u6570 / \u603B\u4EFB\u52A1\u6570) \u00D7 100\n- \u4FDD\u7559 1 \u4F4D\u5C0F\u6570\n\n**\u793A\u4F8B**\uFF1A\n- 3/8 \u5B8C\u6210 \u2192 `\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2591\u2591 37.5%`\n- 6/8 \u5B8C\u6210 \u2192 `\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591 75.0%`\n\n---\n\n## \u56DB\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. **\u68C0\u67E5\u77E5\u8BC6\u5E93\u3001\u52A0\u8F7D\u9879\u76EE\u77E5\u8BC6\u5E76\u5BA1\u67E5\u9879\u76EE**\uFF1A\n - \u8FD0\u884C `rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/` \u641C\u7D22\u76F8\u5173\u9677\u9631\u548C\u6700\u4F73\u5B9E\u8DF5\uFF0C\u907F\u514D\u91CD\u590D\u8E29\u5751\n - \u9605\u8BFB `zhuanspec/knowledge/index.md` \u4E86\u89E3\u9879\u76EE\u7EA7\u77E5\u8BC6\u6458\u8981\n - **\u52A0\u8F7D\u9879\u76EE\u77E5\u8BC6**\uFF1A\u8C03\u7528 `@skill:load-project-knowledge` \u8FDB\u884C\u6E10\u8FDB\u5F0F\u52A0\u8F7D\uFF1A\n * \u8F93\u5165\uFF1Adomain\uFF08\u5F53\u524D\u9879\u76EE\uFF09\u3001keywords\uFF08\u4ECE\u9700\u6C42\u63CF\u8FF0\u63D0\u53D6\uFF09\n * \u83B7\u53D6\uFF1Amatched_services\uFF08\u6D89\u53CA\u7684\u670D\u52A1\u5217\u8868\uFF09\u3001search_priority\uFF08\u68C0\u7D22\u4F18\u5148\u8DEF\u5F84\uFF09\u3001architecture_constraints\uFF08\u67B6\u6784\u7EA6\u675F\uFF09\n * \u4F7F\u7528\uFF1A\u540E\u7EED\u4EE3\u7801\u5B9A\u4F4D\u4F7F\u7528 search_priority \u9650\u5B9A\u8303\u56F4\uFF0C\u65B9\u6848\u8BBE\u8BA1\u68C0\u67E5 architecture_constraints\n * \u517C\u5BB9\u7B56\u7565\uFF1A\u82E5\u672A\u627E\u5230 project.md \u6216\u5173\u952E\u8BCD\u65E0\u5339\u914D\uFF0C\u8F93\u51FA\u8B66\u544A\u5E76\u4F7F\u7528\u5168\u5C40\u68C0\u7D22\n - \u9605\u8BFB `zhuanspec/project.md` \u4E86\u89E3\u9879\u76EE\u7EA6\u5B9A\uFF08\u63D0\u793A\uFF1A\"\u2713 Loaded project.md\"\uFF09\n - \u5BA1\u67E5 `zhuanspec/project.md`\uFF0C`zhuanspec list` \u548C `zhuanspec list --specs` \u4EE5\u4E86\u89E3\u5F53\u524D\u4E0A\u4E0B\u6587\u3002\n1. **\u5F3A\u5236\u8BE2\u95EE\u6D4B\u8BD5\u7528\u4F8B\uFF08TDD \u6A21\u5F0F\u68C0\u67E5\u70B9\uFF0C\u5FC5\u987B\u9996\u5148\u6267\u884C\uFF09**\uFF1A\n - \u4F7F\u7528\u9009\u9879\u5F0F\u4EA4\u4E92\u8BE2\u95EE\uFF1A\"\u8BF7\u63D0\u4F9B\u76F8\u5173\u7684\u6D4B\u8BD5\u7528\u4F8B\uFF08\u53EF\u9009\uFF09\uFF0C\u53EF\u4EE5\u662F\uFF1A\u672C\u5730\u76EE\u5F55\u8DEF\u5F84\u3001\u5728\u7EBF\u94FE\u63A5\uFF08\u5C06\u901A\u8FC7 zzcase-data-fetcher skill \u83B7\u53D6\uFF09\u3001\u6216\u8DF3\u8FC7\u6B64\u6B65\u9AA4\u7EE7\u7EED\u5E38\u89C4\u6D41\u7A0B\"\n - \u7528\u6237\u9009\u62E9\"\u63D0\u4F9B\u6D4B\u8BD5\u7528\u4F8B\"\uFF1A\u8FDB\u5165 TDD \u9A71\u52A8\u6A21\u5F0F\n * \u660E\u786E\u544A\u77E5\uFF1A\u6D4B\u8BD5\u7528\u4F8B\u5C06\u7528\u4E8E\u9700\u6C42\u5B9A\u4E49\u3001\u5355\u5143\u6D4B\u8BD5\u751F\u6210\u3001\u5B9E\u65BD\u9A8C\u8BC1\n * \u5728 proposal.md \u521B\u5EFA \"Test Case Coverage\" \u90E8\u5206\n * \u5728 tasks.md \u4F7F\u7528 `@test-case:TC-XXX` \u6807\u7B7E\u5173\u8054\u4EFB\u52A1\n * \u521B\u5EFA test-cases.md \u8BB0\u5F55\u6D4B\u8BD5\u7528\u4F8B\u8BE6\u60C5\n - \u7528\u6237\u9009\u62E9\"\u8DF3\u8FC7\"\uFF1A\u7EE7\u7EED\u5E38\u89C4\u6D41\u7A0B\uFF08\u5373\u63D0\u6848\u65E0\u9700\u8003\u8651\u6D4B\u8BD5case\uFF09\n\n \u26A0\uFE0F **CHECKPOINT [TDD-MODE]**:\n - TDD \u6A21\u5F0F\u4E0B\uFF0CApply \u9636\u6BB5\u6BCF\u4E2A\u4EFB\u52A1\u5B8C\u6210\u540E\u9700\u9A8C\u8BC1\u5BF9\u5E94\u6D4B\u8BD5\u7528\u4F8B\u901A\u8FC7\n - Review \u9636\u6BB5\u5305\u542B\u6D4B\u8BD5\u8986\u76D6\u7387\u68C0\u67E5\n - \u6D4B\u8BD5\u7528\u4F8B\u5728 TDD \u6A21\u5F0F\u4E0B\u53D1\u6325\u5173\u952E\u9A8C\u8BC1\u4F5C\u7528\uFF0C\u786E\u4FDD\u4EE3\u7801\u7B26\u5408\u9884\u671F\u884C\u4E3A\n\n2. **\u5F3A\u5236\u6F84\u6E05\u68C0\u67E5\uFF08\u5FC5\u987B\u6267\u884C\uFF0C\u4E0D\u53EF\u8DF3\u8FC7\uFF09**\uFF1A\u5206\u6790\u7528\u6237\u8BF7\u6C42\uFF0C\u8BC6\u522B\u6240\u6709\u4E0D\u786E\u5B9A\u6216\u6A21\u7CCA\u7684\u65B9\u9762\uFF08\u8303\u56F4\u3001\u6280\u672F\u9009\u62E9\u3001\u5B9E\u73B0\u7EC6\u8282\u3001\u6570\u636E\u83B7\u53D6\u6765\u6E90\u3001\u670D\u52A1\u5206\u5C42\u3001\u4F9D\u8D56\u5173\u7CFB\u3001\u4F18\u5148\u7EA7\u3001\u9A8C\u6536\u6807\u51C6\u7B49......\uFF09\u3002\u5982\u679C\u53D1\u73B0\u4EFB\u4F55\u6A21\u7CCA\u4E4B\u5904\uFF0C\u5FC5\u987B\u505C\u6B62\u5E76\u4F7F\u7528**\u9009\u9879\u5F0F\u4EA4\u4E92**\uFF08\u5982 `AskQuestion` \u5DE5\u5177\uFF09\u63D0\u95EE\uFF0C\u83B7\u5F97\u660E\u786E\u7B54\u590D\u540E\u624D\u80FD\u7EE7\u7EED\u3002\u4E25\u7981\u5728\u4E0D\u786E\u5B9A\u7684\u60C5\u51B5\u4E0B\u81EA\u884C\u63A8\u6D4B\u6216\u521B\u5EFA\u63D0\u6848\uFF0C\u4E25\u7981\u8981\u6C42\u7528\u6237\u624B\u52A8\u8F93\u5165\u5927\u6BB5\u6587\u5B57\u3002\n\n \u26A0\uFE0F **CHECKPOINT [PRE-CLARIFICATION]**:\n You MUST record the pre-clarification result in tasks.md under \"## Pre-Clarification Log\":\n - If questions were asked: Record each question and the user's answer\n - If no clarification needed: Write \"Status: COMPLETED - No clarification needed\" with brief justification\n - This section MUST NOT be empty or contain only HTML comments\n - NEVER proceed to proposal writing without completing this checkpoint\n\n3. \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`design.md` \u548C\u89C4\u8303\u589E\u91CF\u3002\n4. \u5C06\u53D8\u66F4\u6620\u5C04\u4E3A\u5177\u4F53\u7684\u529F\u80FD\u6216\u8981\u6C42\uFF0C\u5C06\u591A\u8303\u56F4\u7684\u5DE5\u4F5C\u5206\u89E3\u4E3A\u5177\u6709\u660E\u786E\u5173\u7CFB\u548C\u987A\u5E8F\u7684\u4E0D\u540C\u89C4\u8303\u589E\u91CF\u3002\n5. \u5F53\u89E3\u51B3\u65B9\u6848\u8DE8\u8D8A\u591A\u4E2A\u7CFB\u7EDF\u3001\u5F15\u5165\u65B0\u6A21\u5F0F\u6216\u5728\u63D0\u4EA4\u89C4\u8303\u4E4B\u524D\u9700\u8981\u6743\u8861\u8BA8\u8BBA\u65F6\uFF0C\u5728 `design.md` \u4E2D\u6355\u83B7\u67B6\u6784\u63A8\u7406\u3002\n6. \u5728 `changes/<id>/specs/<capability>/spec.md` \u4E2D\u8D77\u8349\u89C4\u8303\u589E\u91CF\uFF08\u6BCF\u4E2A\u529F\u80FD\u4E00\u4E2A\u6587\u4EF6\u5939\uFF09\uFF0C\u4F7F\u7528 `## ADDED|MODIFIED|REMOVED Requirements`\uFF0C\u6BCF\u4E2A\u8981\u6C42\u81F3\u5C11\u5305\u542B\u4E00\u4E2A `#### Scenario:`\uFF0C\u5E76\u5728\u76F8\u5173\u65F6\u4EA4\u53C9\u5F15\u7528\u76F8\u5173\u529F\u80FD\u3002\n7. **\u53D1\u73B0\u53EF\u7528 Skill \u5E76\u521B\u5EFA tasks.md**\uFF1A\n - \u8FD0\u884C `zhuanspec skills list --json` \u83B7\u53D6\u5F53\u524D\u73AF\u5883\u4E2D\u53EF\u7528\u7684 skill \u5217\u8868\u53CA\u5176 description\n - \u5728 `proposal.md` \u7684 **Skill Mapping** \u6BB5\u4E2D\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\u5B9E\u73B0\u533A\u57DF\u7684\u5B9E\u9645\u529F\u80FD\u4E0E skill description \u660E\u786E\u5339\u914D\u65F6\u624D\u5173\u8054\n - \u7B80\u5355\u7684\u4EE3\u7801\u4FEE\u6539\uFF08\u5982\u679A\u4E3E\u503C\u589E\u5220\uFF09\u5E94\u5339\u914D\u901A\u7528\u7F16\u7801\u89C4\u8303 skill\uFF0C\u800C\u975E\u67B6\u6784\u7EA7 skill\n - \u907F\u514D\u4EC5\u56E0\u6A21\u5757\u540D\u79F0\u6216\u6587\u4EF6\u8DEF\u5F84\u4E2D\u7684\u5173\u952E\u8BCD\u800C\u9519\u8BEF\u5339\u914D\n - \u5728\u8868\u683C\u4E2D\u8BF4\u660E\u5339\u914D\u7406\u7531\n - \u5C06 `tasks.md` \u8D77\u8349\u4E3A\u6709\u5E8F\u7684\u5C0F\u578B\u3001\u53EF\u9A8C\u8BC1\u5DE5\u4F5C\u9879\u5217\u8868\n - \u4F7F\u7528 `@skill:<real-skill-name>` \u6807\u6CE8\u4E0E skill \u5339\u914D\u7684\u4EFB\u52A1\uFF08\u652F\u6301\u591A\u4E2A\uFF1A`@skill:name1,name2`\uFF09\n - \u4EC5\u5F53 skill \u660E\u786E\u5339\u914D\u4EFB\u52A1\u65F6\u624D\u6807\u6CE8\uFF0C\u6CA1\u6709\u5339\u914D\u7684 skill \u53EF\u7701\u7565\u6807\u7B7E\n\n \u26A0\uFE0F **CHECKPOINT [SKILL-TAGGING]**:\n 1. You MUST run `zhuanspec skills list` first and record discovered skills in the Skill Mapping table\n 2. Every task MUST have either @skill:real-skill-name or @skill:none\n 3. If @skill:none, you MUST provide a justification (e.g., \"pure config change, no skill applies\")\n 4. @skill names MUST match exactly the names returned by `zhuanspec skills list` \u2014 do NOT invent skill names\n 5. The Skill Mapping table in tasks.md MUST NOT be empty\n 6. validate --strict will verify all @skill names exist in the known skill list\n\n \u26A0\uFE0F **CHECKPOINT [TASK-ORDERING]**:\n 1. Tasks in tasks.md MUST be organized under Wave headers (### Wave 1, ### Wave 2, etc.)\n 2. Wave assignment must be computed from @depends relationships (Wave 1 = no deps, Wave N = depends on Wave N-1)\n 3. No task may appear before a task it depends on\n 4. You MUST add a \"## Dependency Analysis\" section at the end with \"Status: COMPLETED\"\n 5. validate --strict will verify task ordering matches computed waves\n\n8. **\u6D4B\u8BD5 case \u5904\u7406\uFF08\u4EC5 TDD \u6A21\u5F0F\uFF09**\uFF1A\n\n **\u26A0\uFE0F \u6A21\u5F0F\u5224\u65AD**\uFF1A\u6839\u636E\u4EE5\u4E0B\u6761\u4EF6\u5224\u65AD\u5F53\u524D\u662F\u54EA\u79CD\u6A21\u5F0F\uFF1A\n - **\u6709 case \u6A21\u5F0F**\uFF1A\u7528\u6237\u63D0\u4F9B\u6D4B\u8BD5 case \u6765\u6E90\uFF08taskId/bicId\uFF09\u3001\u7528\u6237\u8981\u6C42 TDD \u5DE5\u4F5C\u6D41\u3001\u6216\u660E\u786E\u8981\u6C42\u8BBE\u8BA1\u6D4B\u8BD5 case\n - **\u65E0 case \u6A21\u5F0F**\uFF1A\u666E\u901A spec-driven \u5DE5\u4F5C\u6D41\uFF0C\u7528\u6237\u672A\u63D0\u4F9B\u6D4B\u8BD5 case \u76F8\u5173\u4FE1\u606F\n\n **\u3010\u6709 case \u6A21\u5F0F\u3011**\uFF08\u5FC5\u987B\u6267\u884C\u4EE5\u4E0B\u6B65\u9AA4\uFF09\uFF1A\n - \u83B7\u53D6\u6D4B\u8BD5 case \u6765\u6E90\uFF1A\n * \u901A\u8FC7 taskId/bicId \u83B7\u53D6\u6D4B\u8BD5 case\uFF08\u4F7F\u7528 MCP \u5DE5\u5177 `zzcase_get_api_report_queryBaseCase`\uFF09\n * \u624B\u52A8\u5F55\u5165\u6D4B\u8BD5 case\n - **\u3010\u5F3A\u5236\u3011\u521B\u5EFA test-cases.md \u6587\u4EF6**\uFF1A\n * \u4F7F\u7528 `getTestCasesTemplate` \u6A21\u677F\uFF08\u4ECE `src/core/templates/index.ts` \u5BFC\u51FA\uFF09\n * \u6587\u4EF6\u8DEF\u5F84\uFF1A`changes/<change-id>/test-cases.md`\n * \u586B\u5199\u83B7\u53D6\u65F6\u95F4\u3001\u6765\u6E90\uFF08taskId/bicId/manual\uFF09\u3001\u6D4B\u8BD5 case \u8BE6\u60C5\n * \u6BCF\u4E2A TC-XXX \u5FC5\u987B\u5305\u542B\uFF1A\u524D\u7F6E\u6761\u4EF6\u3001\u6D4B\u8BD5\u6B65\u9AA4\u3001\u9884\u671F\u7ED3\u679C\u3001\u9A8C\u6536\u70B9\n - \u5728 `tasks.md` \u589E\u52A0 **Test Case Coverage** \u8868\u683C\uFF08\u56DB\u5217\u683C\u5F0F\uFF09\uFF1A\n | Task | \u6D4B\u8BD5 Case ID | \u6D4B\u8BD5 Case \u6587\u4EF6\u8DEF\u5F84 | \u8986\u76D6\u573A\u666F |\n |------|-------------|-------------------|----------|\n * \"\u6D4B\u8BD5 Case \u6587\u4EF6\u8DEF\u5F84\" \u5217\u586B\u5199 BIC \u8DEF\u5F84\u5C42\u7EA7\u683C\u5F0F\n - \u4F7F\u7528 `@test-case:TC-XXX` \u5173\u8054\u4EFB\u52A1\u4E0E\u6D4B\u8BD5 case\n\n \u26A0\uFE0F **CHECKPOINT [TEST-CASE-COVERAGE]**\uFF08\u4EC5\u9002\u7528\u4E8E\u6709 case \u6A21\u5F0F\uFF09:\n 1. \u6BCF\u4E2A Requirement \u5E94\u81F3\u5C11\u5BF9\u5E94\u4E00\u4E2A\u6D4B\u8BD5 case\n 2. \u6D4B\u8BD5 case \u5E94\u8986\u76D6\u6B63\u5411\u548C\u5F02\u5E38\u573A\u666F\n 3. **\u5FC5\u987B\u521B\u5EFA test-cases.md \u6587\u4EF6**\uFF08\u4F7F\u7528 `getTestCasesTemplate` \u6A21\u677F\uFF09\n 4. Test Case Coverage \u8868\u683C\u5FC5\u987B\u5305\u542B\u56DB\u5217\uFF1ATask\u3001\u6D4B\u8BD5 Case ID\u3001\u6D4B\u8BD5 Case \u6587\u4EF6\u8DEF\u5F84\u3001\u8986\u76D6\u573A\u666F\n 5. validate --strict \u4F1A\u9A8C\u8BC1\u6D4B\u8BD5 case \u8986\u76D6\u7387\uFF08**\u963B\u585E\u7EA7\u522B**\uFF09\n\n **\u3010\u65E0 case \u6A21\u5F0F\u3011**\uFF08\u8DF3\u8FC7\u6D4B\u8BD5 case \u76F8\u5173\u6B65\u9AA4\uFF09\uFF1A\n - \u4E0D\u521B\u5EFA test-cases.md\n - tasks.md \u4E0D\u9700\u8981 Test Case Coverage \u6BB5\n - validate --strict \u7684 test-case-coverage \u89C4\u5219\u81EA\u52A8\u8DF3\u8FC7\uFF08SKIPPED\uFF09\n - \u5355\u6D4B\u7EDF\u4E00\u5728 Review \u9636\u6BB5\u5904\u7406\n\n9. \u3010\u81EA\u52A8\u9A8C\u8BC1\u4E0E\u4FEE\u590D\u3011\uFF1A\n \u8FD0\u884C `zhuanspec validate <id> --strict --auto-fix` \u8FDB\u884C\u9A8C\u8BC1\uFF1A\n - \u5982\u679C\u9A8C\u8BC1\u901A\u8FC7\uFF08PASS\uFF09\uFF1A\u7EE7\u7EED\u4E0B\u4E00\u6B65\n - \u5982\u679C\u9A8C\u8BC1\u5931\u8D25\uFF08FAIL\uFF09\uFF1A\u81EA\u52A8\u89E6\u53D1\u4FEE\u590D\u5FAA\u73AF\uFF1A\n * CLI \u81EA\u52A8\u5206\u6790\u9519\u8BEF\u539F\u56E0\n * CLI \u81EA\u52A8\u751F\u6210\u4FEE\u590D\u65B9\u6848\u5E76\u6267\u884C\n * \u91CD\u65B0\u9A8C\u8BC1\uFF08\u6700\u591A 3 \u6B21\u5FAA\u73AF\uFF09\n * \u5FAA\u73AF\u7ED3\u675F\u540E\u4ECD\u672A\u901A\u8FC7\uFF1A\u8F93\u51FA\u9519\u8BEF\u62A5\u544A\uFF0C\u7B49\u5F85\u4EBA\u5DE5\u5E72\u9884\n - \u9A8C\u8BC1\u901A\u8FC7\u540E\uFF0C\u8F93\u51FA\u63D0\u6848\u6458\u8981\n\n10. \u3010\u8F93\u51FA\u63D0\u6848\u6458\u8981\u3011\uFF1A\n \u2022 \u53D8\u66F4\u539F\u56E0\u3001\u5185\u5BB9\u3001\u5F71\u54CD\u8303\u56F4\n \u2022 \u5173\u952E Requirements\n \u2022 \u4EFB\u52A1\u6570\u91CF\u548C Wave \u5206\u5E03\n\n11. \u3010\u9009\u9879\u5F0F\u4EA4\u4E92\u786E\u8BA4\u3011\uFF1A\n \u4F7F\u7528 AskQuestion \u5DE5\u5177\u5F39\u51FA\u786E\u8BA4\u5BF9\u8BDD\u6846\uFF1A\n ```\n \u95EE\u9898: \"\u8BF7\u786E\u8BA4\u662F\u5426\u6279\u51C6\u6B64\u63D0\u6848\uFF1F\"\n \u9009\u9879\uFF1A\n A) \u6279\u51C6\uFF0C\u8FDB\u5165\u5B9E\u65BD\u9636\u6BB5\n B) \u9700\u8981\u4FEE\u6539\u63D0\u6848\u5185\u5BB9\n C) \u6682\u4E0D\u6279\u51C6\uFF0C\u7A0D\u540E\u5904\u7406\n D) \u5176\u4ED6\uFF08\u8BF7\u5728\u540E\u7EED\u8865\u5145\u8BF4\u660E\uFF09\n ```\n\n \u7528\u6237\u9009\u62E9\u5904\u7406\uFF1A\n \u2022 \u9009\u62E9\"\u6279\u51C6\"\uFF1A\u521B\u5EFA `.approved` \u6587\u4EF6\uFF0C\u8FDB\u5165 Apply \u9636\u6BB5\n \u2022 \u9009\u62E9\"\u4FEE\u6539\"\uFF1A\u8FD4\u56DE\u6B65\u9AA4 4 \u4FEE\u6539\u63D0\u6848\u5185\u5BB9\n \u2022 \u9009\u62E9\"\u6682\u4E0D\"\uFF1A\u4FDD\u6301\u63D0\u6848\u72B6\u6001\uFF0C\u7B49\u5F85\u540E\u7EED\u5904\u7406\n \u2022 \u9009\u62E9\"\u5176\u4ED6\"\uFF1A\u7B49\u5F85\u7528\u6237\u8865\u5145\u8BF4\u660E\u540E\u7EE7\u7EED\n\n \u26A0\uFE0F **CHECKPOINT [PLAN-APPROVED]**:\n - \u7528\u6237\u5FC5\u987B\u660E\u786E\u9009\u62E9\"\u6279\u51C6\"\u9009\u9879\u624D\u80FD\u8FDB\u5165 Apply \u9636\u6BB5\n - \u672A\u6279\u51C6\u524D\u7981\u6B62\u4EFB\u4F55\u4EE3\u7801\u4FEE\u6539\u64CD\u4F5C\n - PreToolUse Hook \u4F1A\u963B\u65AD\u672A\u6279\u51C6\u72B6\u6001\u7684 Write/Edit \u64CD\u4F5C\n\n### \u9636\u6BB5 2\uFF1A\u5B9E\u65BD\u53D8\u66F4\n\n**\u524D\u7F6E\u68C0\u67E5**\uFF1A\n- \u26A0\uFE0F **CHECKPOINT [PLAN-APPROVED]**: `.approved` \u6587\u4EF6\u5FC5\u987B\u5B58\u5728\u3002\u672A\u6279\u51C6\u7684\u63D0\u6848\u7981\u6B62\u5B9E\u65BD\u3002\n - PreToolUse Hook \u4F1A\u963B\u65AD\u672A\u6279\u51C6\u72B6\u6001\u7684 Write/Edit \u64CD\u4F5C\n - \u5982\u679C `.approved` \u4E0D\u5B58\u5728\uFF0C\u63D0\u793A\u7528\u6237\u5148\u5B8C\u6210 Proposal \u9636\u6BB5\u7684\u6279\u51C6\u6D41\u7A0B\n\n\u5C06\u8FD9\u4E9B\u6B65\u9AA4\u4F5C\u4E3A\u5F85\u529E\u4E8B\u9879\u8DDF\u8E2A\uFF0C\u9010\u4E00\u5B8C\u6210\u3002\n\n0. **\u68C0\u67E5\u77E5\u8BC6\u5E93\u3001\u52A0\u8F7D\u9879\u76EE\u77E5\u8BC6\u5E76\u9605\u8BFB proposal.md**\uFF1A\n - \u8FD0\u884C `rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/` \u641C\u7D22\u76F8\u5173\u6700\u4F73\u5B9E\u8DF5\u548C\u9677\u9631\n - **\u52A0\u8F7D\u9879\u76EE\u77E5\u8BC6**\uFF1A\u8C03\u7528 `@skill:load-project-knowledge` \u8FDB\u884C\u6E10\u8FDB\u5F0F\u52A0\u8F7D\uFF1A\n * \u8F93\u5165\uFF1Adomain\uFF08\u5F53\u524D\u9879\u76EE\uFF09\u3001keywords\uFF08\u4ECE tasks.md \u63D0\u53D6\uFF09\n * \u83B7\u53D6\uFF1Amatched_services\u3001search_priority\u3001architecture_constraints\n * \u4F7F\u7528\uFF1A\u4EE3\u7801\u5B9A\u4F4D\u4F7F\u7528 search_priority \u9650\u5B9A\u8303\u56F4\uFF0C\u907F\u514D\u5168\u5C40\u68C0\u7D22\u504F\u5DEE\n - \u9605\u8BFB `zhuanspec/project.md` \u4E86\u89E3\u9879\u76EE\u7EA6\u5B9A\uFF08\u63D0\u793A\uFF1A\"\u2713 Loaded project.md\"\uFF09\n - \u9605\u8BFB proposal.md - \u4E86\u89E3\u8981\u6784\u5EFA\u7684\u5185\u5BB9\n1. **\u9605\u8BFB design.md**\uFF08\u5982\u679C\u5B58\u5728\uFF09 - \u5BA1\u67E5\u6280\u672F\u51B3\u7B56\n2. **\u9605\u8BFB tasks.md** - \u83B7\u53D6\u5B9E\u65BD\u6E05\u5355\n3. **\u5224\u65AD\u6267\u884C\u6A21\u5F0F** - \u6839\u636E tasks.md \u5185\u5BB9\u9009\u62E9\u6267\u884C\u7B56\u7565\uFF1A\n - **\u5982\u679C tasks.md \u5305\u542B `@depends` \u4F9D\u8D56\u58F0\u660E**\uFF1A\n \u2192 \u6309 Wave \u5E76\u884C\u6267\u884C\uFF08\u4F7F\u7528 superpowers:subagent-driven-development skill\uFF09\n - **\u5982\u679C tasks.md \u65E0\u4F9D\u8D56\u58F0\u660E**\uFF1A\n \u2192 \u6309\u987A\u5E8F\u6267\u884C\n4. **\u6309\u987A\u5E8F\u5B9E\u65BD\u4EFB\u52A1**\uFF08\u65E0\u4F9D\u8D56\u58F0\u660E\u65F6\uFF09- \u4FDD\u6301\u7F16\u8F91\u6700\u5C0F\u5316\u3002\u5982\u679C\u4EFB\u52A1\u6807\u6CE8\u4E86 `@skill:<skill-name>`\uFF0C\u76F4\u63A5\u8C03\u7528\u5BF9\u5E94 skill\n - **\u9636\u6BB5\u804C\u8D23\u8981\u6C42**\uFF1AApply \u9636\u6BB5\u4E0D\u751F\u6210\u5355\u6D4B\u6587\u4EF6\uFF1B\u5355\u6D4B\u7EDF\u4E00\u5728 Review \u9636\u6BB5\u751F\u6210\u4E0E\u9A8C\u8BC1\u3002\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]`\n\n\n### \u9636\u6BB5 3\uFF1AReview\n\n**\u68C0\u67E5\u77E5\u8BC6\u5E93\u3001project.md \u5E76\u6267\u884C\u5BA1\u67E5**\uFF1A\n- \u8FD0\u884C `rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/` \u641C\u7D22\u76F8\u5173\u5BA1\u67E5\u6700\u4F73\u5B9E\u8DF5\n- \u9605\u8BFB `zhuanspec/project.md` \u4E86\u89E3\u9879\u76EE\u7EA6\u5B9A\uFF08\u63D0\u793A\uFF1A\"\u2713 Loaded project.md\"\uFF09\n\n\u6267\u884C `zhuanspec review <change-id>`\uFF0C\u542F\u52A8\u4E09\u8F68\u5E76\u884C\u5BA1\u67E5\uFF1A\n\n**\u4E09\u8F68\u5E76\u884C\u673A\u5236**\uFF1A\n- \u4F7F\u7528 Agent \u5DE5\u5177\u542F\u52A8 3 \u4E2A subagent \u5E76\u884C\u6267\u884C\n- **Code Review subagent**\uFF1A\u8C03\u7528 `code-review-expert` skill\n- **Unit Test subagent**\uFF1A\u8C03\u7528 `generate-mockito-unit-test-skill` skill\n- **Spec-Code Consistency subagent**\uFF1A\u6267\u884C\u4E00\u81F4\u6027\u68C0\u67E5\n\n**Subagent \u81EA\u95ED\u73AF**\uFF1A\n- \u6BCF\u4E2A subagent \u5185\u90E8\u72EC\u7ACB\u4FEE\u590D\u5FAA\u73AF\uFF08\u6700\u591A3\u8F6E\uFF09\n- \u53D1\u73B0\u95EE\u9898\u65F6\u7ACB\u5373\u4FEE\u590D\uFF0C\u7136\u540E\u91CD\u65B0\u68C0\u67E5\n- \u8F93\u51FA\u72EC\u7ACB\u62A5\u544A\u6587\u4EF6\uFF1A\n - `code-review-result.json`\n - `unit-test-result.json`\n - `spec-consistency-result.json`\n- \u6C47\u603B\u751F\u6210 `review-report.md`\n\n**\u9A8C\u6536\u6807\u51C6**\uFF1A\n- review passed\n- critical = 0\n- \u5355\u6D4B\u901A\u8FC7\n- \u4E09\u8F68\u5168\u90E8 PASS\n\n### \u9636\u6BB5 4\uFF1A\u5F52\u6863\u53D8\u66F4\n\n**\u524D\u7F6E\u68C0\u67E5**\uFF1A\n- \u26A0\uFE0F **CHECKPOINT [REVIEW-PASSED]**: Review \u9636\u6BB5\u5FC5\u987B\u901A\u8FC7\uFF08\u4E09\u8F68\u5168\u90E8 PASS\uFF09\n - `review-report.md` \u5B58\u5728\u4E14\u663E\u793A passed\n - `code-review-result.json`: critical = 0\n - `unit-test-result.json`: tests passed\n - `spec-consistency-result.json`: passed\n\n**\u6B65\u9AA4**\uFF1A\n0. **\u68C0\u67E5\u77E5\u8BC6\u5E93**\uFF1A\u8FD0\u884C `rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/` \u641C\u7D22\u662F\u5426\u6709\u9700\u8981\u6C89\u6DC0\u7684\u77E5\u8BC6\n1. **\u786E\u5B9A\u53D8\u66F4 ID**\uFF1A\u8FD0\u884C `zhuanspec list` \u786E\u8BA4\u8981\u5F52\u6863\u7684\u53D8\u66F4\n2. **\u9A8C\u8BC1 Review \u95E8\u7981**\uFF1A\u786E\u8BA4\u4E0A\u8FF0\u56DB\u4E2A\u7ED3\u679C\u6587\u4EF6\u5B58\u5728\u4E14\u5168\u90E8\u901A\u8FC7\n3. **\u8FD0\u884C\u5F52\u6863\u547D\u4EE4**\uFF1A\u6267\u884C `zhuanspec archive <id> --yes`\uFF08\u4EC5\u5DE5\u5177\u7C7B\u5DE5\u4F5C\u4F7F\u7528 `--skip-specs`\uFF09\n4. **\u9A8C\u8BC1\u5F52\u6863\u7ED3\u679C**\uFF1A\u8FD0\u884C `zhuanspec validate --strict` \u786E\u8BA4\u901A\u8FC7\n5. **\u77E5\u8BC6\u6C89\u6DC0\uFF08\u624B\u52A8\u8865\u5145\uFF09**\uFF1A\u8C03\u7528 `@skill:zhuanspec:knowledge` \u4ECE\u4F1A\u8BDD\u8BB0\u5FC6\u8865\u5145\u77E5\u8BC6\n - CLI \u5DF2\u81EA\u52A8\u4ECE\u53D8\u66F4\u76EE\u5F55\u63D0\u53D6\u7ED3\u6784\u5316\u77E5\u8BC6\n - AI \u9700\u4ECE\u4F1A\u8BDD\u8865\u5145\u9690\u5F0F\u7EA6\u5B9A\u3001\u8C03\u8BD5\u53D1\u73B0\u7B49\n6. **\u4F1A\u8BDD\u5206\u6790**\uFF1A\u8C03\u7528 `@skill:session-analytics` \u5206\u6790\u4F1A\u8BDD\u6307\u6807\u6570\u636E\n7. **\u8F93\u51FA\u53CD\u9988\u94FE\u63A5**\uFF1A\u544A\u77E5\u7528\u6237\u586B\u5199\u4F7F\u7528\u53CD\u9988\uFF1A\n \uD83D\uDCCB https://doc.weixin.qq.com/forms/AJ4AfQfgAAwACwAAwaVABsCNqDXIKn8sf\n\n## \u6267\u884C\u4EFB\u4F55\u4EFB\u52A1\u4E4B\u524D\n\n**\u77E5\u8BC6\u5E93\u68C0\u67E5\uFF1A**\n- [ ] \u641C\u7D22\u76F8\u5173\u9677\u9631\uFF1A`rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/troubleshooting/`\n- [ ] \u641C\u7D22\u6700\u4F73\u5B9E\u8DF5\uFF1A`rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/best-practices/`\n- [ ] \u9605\u8BFB\u77E5\u8BC6\u7D22\u5F15\uFF1A`cat zhuanspec/knowledge/index.md`\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\u3001\u9879\u76EE\u7ED3\u6784\u548C\u76F8\u5173\u529F\u80FD\u6A21\u5757\uFF08\u6309\u9700\u52A0\u8F7D\uFF09\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- **\u68C0\u67E5\u77E5\u8BC6\u5E93**\uFF1A`rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/` \u641C\u7D22\u76F8\u5173\u9677\u9631\u548C\u6700\u4F73\u5B9E\u8DF5\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> **\u6838\u5FC3\u539F\u5219**\uFF1A\u9047\u5230\u4EFB\u4F55\u6A21\u7CCA\u70B9\uFF0C\u5FC5\u987B\u6F84\u6E05\u3002\u4E25\u7981\u731C\u6D4B\u3001\u81C6\u6D4B\u3001\u81EA\u884C\u5047\u8BBE\u3002\n\n### \u6F84\u6E05\u95ED\u73AF\u673A\u5236\n\n\u5728\u521B\u5EFA\u4EFB\u4F55\u63D0\u6848\u6587\u4EF6\u4E4B\u524D\uFF0C\u5FC5\u987B\u6267\u884C\u4EE5\u4E0B\u6D41\u7A0B\uFF1A\n\n```\n\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 1. \u67E5\u9605\u73B0\u6709\u6765\u6E90 \u2502\n\u2502 \u2192 \u89C4\u8303\u3001\u9879\u76EE\u7EA6\u5B9A\u3001\u4EE3\u7801\u5E93\u3001\u4E0A\u4E0B\u6587\u6587\u4EF6 \u2502\n\u2502 \u2192 \u5C1D\u8BD5\u4ECE\u8FD9\u4E9B\u6765\u6E90\u786E\u5B9A\u4FE1\u606F \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 2. \u8BC6\u522B\u6A21\u7CCA\u70B9 \u2502\n\u2502 \u2192 \u5206\u6790\u7528\u6237\u8BF7\u6C42\uFF0C\u5217\u51FA\u4E0D\u786E\u5B9A\u7684\u65B9\u9762 \u2502\n\u2502 \u2192 \u6392\u9664\u53EF\u4EE5\u4ECE\u73B0\u6709\u6765\u6E90\u786E\u5B9A\u7684\u65B9\u9762 \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 3. \u5224\u65AD\u63D0\u95EE\u7B56\u7565 \u2502\n\u2502 \u2192 \u5982\u679C\u4ECD\u6709\u6A21\u7CCA\u70B9\uFF1A\u5FC5\u987B\u63D0\u95EE \u2502\n\u2502 \u2192 \u5982\u679C\u5168\u90E8\u660E\u786E\uFF1A\u7EE7\u7EED\u521B\u5EFA \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 4. \u751F\u6210\u6F84\u6E05\u95EE\u9898 \u2502\n\u2502 \u2192 \u4F18\u5148\u68C0\u67E5 superpowers:brainstorming \u662F\u5426\u53EF\u7528 \u2502\n\u2502 \u2192 \u53EF\u7528\uFF1A\u8C03\u7528\u8BE5\u6280\u80FD\u751F\u6210\u9AD8\u8D28\u91CF\u95EE\u9898 \u2502\n\u2502 \u2192 \u4E0D\u53EF\u7528\uFF1A\u76F4\u63A5\u4F7F\u7528 AskUserQuestion \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 5. \u9009\u9879\u5F0F\u4EA4\u4E92 \u2502\n\u2502 \u2192 2-5 \u4E2A\u9884\u8BBE\u9009\u9879 + \"\u5176\u4ED6\"\u515C\u5E95 \u2502\n\u2502 \u2192 \u7B49\u5F85\u7528\u6237\u9009\u62E9 \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 6. \u5904\u7406\"\u5176\u4ED6\"\u9009\u9879 \u2502\n\u2502 \u2192 \u7528\u6237\u9009\u62E9\"\u5176\u4ED6\"\u540E\u9488\u5BF9\u6027\u8FFD\u95EE \u2502\n\u2502 \u2192 \u4ECD\u4F18\u5148\u4F7F\u7528\u9009\u9879\u5F0F \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 7. \u5F00\u59CB\u521B\u5EFA \u2502\n\u2502 \u2192 \u53EA\u6709\u5728\u6240\u6709\u6A21\u7CCA\u70B9\u90FD\u660E\u786E\u540E\u624D\u80FD\u521B\u5EFA\u63D0\u6848 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n### \u63D0\u95EE\u7B56\u7565\u9009\u62E9\n\n| \u6280\u80FD\u53EF\u7528\u6027 | \u63D0\u95EE\u65B9\u5F0F | \u8BF4\u660E |\n|-----------|---------|------|\n| superpowers:brainstorming \u53EF\u7528 | \u8C03\u7528\u6280\u80FD\u751F\u6210\u95EE\u9898 | \u9AD8\u8D28\u91CF\u3001\u7ED3\u6784\u5316\u7684\u6F84\u6E05\u95EE\u9898 |\n| superpowers:brainstorming \u4E0D\u53EF\u7528 | AskUserQuestion \u76F4\u63A5\u63D0\u95EE | \u9009\u9879\u5F0F\u4EA4\u4E92\uFF0C\u7B80\u6D01\u9AD8\u6548 |\n\n### Brainstorming \u8C03\u7528\u8FB9\u754C\n\n**\u9002\u7528\u573A\u666F**\uFF1A\n| \u573A\u666F\u7C7B\u578B | \u8C03\u7528\u65B9\u5F0F | \u8BF4\u660E |\n|----------|---------|------|\n| **\u590D\u6742\u6A21\u7CCA** | superpowers:brainstorming | \u8DE8\u6A21\u5757\u3001\u65B0\u67B6\u6784\u3001\u591A\u65B9\u6848\u9009\u62E9 |\n| **\u7B80\u5355\u6F84\u6E05** | AskUserQuestion \u76F4\u63A5\u63D0\u95EE | \u53C2\u6570\u8C03\u6574\u3001\u8303\u56F4\u8FB9\u754C\u3001\u5355\u4E00\u9009\u62E9 |\n| **\u5DF2\u5B8C\u6574\u9700\u6C42** | \u8DF3\u8FC7\u6F84\u6E05 | \u7528\u6237\u63D0\u4F9B\u5B8C\u6574\u9700\u6C42\u6587\u6863 |\n\n**\u8C03\u7528\u7EA6\u675F**\uFF1A\n- \u4EC5\u4F7F\u7528 brainstorming \u7684**\u6F84\u6E05\u63D0\u95EE\u80FD\u529B**\uFF08\u6B65\u9AA43\uFF1A\u9010\u4E00\u63D0\u95EE\u6F84\u6E05\uFF09\n- **\u4E0D\u8FDB\u5165\u5B8C\u6574\u8BBE\u8BA1\u6D41\u7A0B**\uFF08\u6B65\u9AA44-9\uFF1A\u65B9\u6848\u5BF9\u6BD4\u3001\u8BBE\u8BA1\u6587\u6863\uFF09\n- **\u4E0D\u89E6\u53D1 writing-plans skill**\uFF08\u5C5E\u4E8E Apply \u9636\u6BB5\uFF09\n- \u83B7\u5F97\u6F84\u6E05\u540E\u7ACB\u5373\u8FD4\u56DE ZhuanSpec \u63D0\u6848\u6D41\u7A0B\n\n### \u9009\u9879\u5F0F\u4EA4\u4E92\u683C\u5F0F\n\n**\u5FC5\u987B\u9075\u5B88**\uFF1A\n- \u6BCF\u4E2A\u95EE\u9898\u63D0\u4F9B 2-5 \u4E2A\u9884\u8BBE\u9009\u9879\n- \u672B\u5C3E\u5305\u542B\"\u5176\u4ED6\"\u9009\u9879\u4F5C\u4E3A\u515C\u5E95\n- \u7981\u6B62\u8981\u6C42\u7528\u6237\u624B\u52A8\u8F93\u5165\u5927\u6BB5\u6587\u5B57\n\n**\u793A\u4F8B**\uFF1A\n```json\n{\n \"questions\": [\n {\n \"id\": \"scope\",\n \"prompt\": \"\u60A8\u5E0C\u671B\u6539\u8FDB\u54EA\u4E9B\u65B9\u9762\uFF1F\",\n \"options\": [\n {\"id\": \"security\", \"label\": \"\u5B89\u5168\u6027\"},\n {\"id\": \"ux\", \"label\": \"\u7528\u6237\u4F53\u9A8C\"},\n {\"id\": \"performance\", \"label\": \"\u6027\u80FD\"},\n {\"id\": \"other\", \"label\": \"\u5176\u4ED6\"}\n ],\n \"allow_multiple\": true\n }\n ]\n}\n```\n\n### \u5E38\u89C1\u6A21\u7CCA\u70B9\u6E05\u5355\n\n| \u7C7B\u522B | \u9700\u6F84\u6E05\u7684\u60C5\u51B5 |\n|------|-------------|\n| **\u8303\u56F4** | \u8FB9\u754C\u4E0D\u660E\u786E\uFF08\"\u6539\u8FDB\u6027\u80FD\"\u3001\"\u4F18\u5316\u4EE3\u7801\"\uFF09 |\n| **\u6280\u672F** | \u591A\u79CD\u5B9E\u73B0\u65B9\u5F0F\u4F46\u672A\u6307\u5B9A\u504F\u597D |\n| **\u4F18\u5148\u7EA7** | \u591A\u4E2A\u9700\u6C42\u4F46\u672A\u8BF4\u660E\u987A\u5E8F |\n| **\u9A8C\u6536** | \u4E0D\u6E05\u695A\u5982\u4F55\u5224\u65AD\u5B8C\u6210 |\n| **\u5B9E\u73B0** | \u6570\u636E\u83B7\u53D6\u6765\u6E90\u3001\u670D\u52A1\u5206\u5C42\u3001\u4F9D\u8D56\u5173\u7CFB\u4E0D\u660E\u786E |\n| **\u4F4D\u7F6E** | \u4EE3\u7801\u6539\u52A8\u4F4D\u7F6E\u4E0D\u660E\u786E |\n\n### \u7981\u6B62\u884C\u4E3A\n\n| \u274C \u7981\u6B62 | \u539F\u56E0 |\n|--------|------|\n| \u81EA\u884C\u63A8\u6D4B\u7528\u6237\u610F\u56FE | \u8FDD\u53CD\u4E09\u6761\u94C1\u5F8B |\n| \u8DF3\u8FC7\u6F84\u6E05\u76F4\u63A5\u521B\u5EFA\u6587\u4EF6 | \u8FDD\u53CD No Spec, No Code |\n| \u8981\u6C42\u7528\u6237\u624B\u52A8\u8F93\u5165\u5927\u6BB5\u6587\u5B57 | \u6548\u7387\u4F4E\u3001\u4F53\u9A8C\u5DEE |\n\n---\n\n### \u4E0E\u4E09\u6761\u94C1\u5F8B\u7684\u5173\u7CFB\n\n| \u94C1\u5F8B | \u6F84\u6E05\u5DE5\u4F5C\u6D41\u4F53\u73B0 |\n|------|---------------|\n| **No Spec, No Code** | \u6F84\u6E05\u5B8C\u6210\u540E\u624D\u80FD\u521B\u5EFA\u63D0\u6848 |\n| **Spec is Truth** | \u6F84\u6E05\u7ED3\u679C\u5199\u5165 tasks.md \u7684\"\u6F84\u6E05\u65E5\u5FD7\" |\n| **Reverse Sync** | Apply \u9636\u6BB5\u504F\u79BB\u65F6\u91CD\u65B0\u8FDB\u5165\u6F84\u6E05\u6D41\u7A0B |\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 knowledge/ # \u9879\u76EE\u7EA7\u77E5\u8BC6\u5E93\n\u2502 \u251C\u2500\u2500 index.md # \u77E5\u8BC6\u7D22\u5F15\n\u2502 \u251C\u2500\u2500 troubleshooting/ # \u5E38\u89C1\u95EE\u9898\u4E0E\u9677\u9631\n\u2502 \u251C\u2500\u2500 best-practices/ # \u6700\u4F73\u5B9E\u8DF5\n\u2502 \u2514\u2500\u2500 implicit-conventions/ # \u9690\u5F0F\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\u5FC5\u9009\uFF1B\u77E5\u8BC6\u63D0\u53D6\u6765\u6E90\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. **\u521B\u5EFA design.md\uFF08\u5FC5\u9009\uFF09**\uFF1A\n\u6BCF\u4E2A\u63D0\u6848\u90FD\u5FC5\u987B\u521B\u5EFA `design.md`\uFF0C\u8BB0\u5F55\u6280\u672F\u51B3\u7B56\u548C\u67B6\u6784\u601D\u8003\uFF1A\n\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## \u6700\u4F73\u5B9E\u8DF5\n[\u5B9E\u65BD\u8FC7\u7A0B\u4E2D\u7684\u6700\u4F73\u5B9E\u8DF5\u5EFA\u8BAE]\n\n## \u9690\u5F0F\u7EA6\u5B9A\n[\u56E2\u961F\u7279\u6709\u7684\u9690\u5F0F\u7EA6\u5B9A\u6216\u9ED8\u8BA4\u884C\u4E3A]\n\n## \u8FC1\u79FB\u8BA1\u5212\n[\u6B65\u9AA4\u3001\u56DE\u6EDA]\n\n## \u5F85\u89E3\u51B3\u95EE\u9898\n- [...]\n```\n\n**\u91CD\u8981**\uFF1Adesign.md \u662F\u77E5\u8BC6\u63D0\u53D6\u7684\u4E3B\u8981\u6765\u6E90\uFF0C\u5F52\u6863\u65F6\u4F1A\u81EA\u52A8\u63D0\u53D6\u5176\u4E2D\u7684\"\u51B3\u7B56\"\u3001\"\u6700\u4F73\u5B9E\u8DF5\"\u3001\"\u9690\u5F0F\u7EA6\u5B9A\"\u6C89\u6DC0\u5230\u9879\u76EE\u77E5\u8BC6\u5E93\u3002\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\n## \u4EFB\u52A1\u6267\u884C\u7F16\u6392\n\n\u5F53 apply \u6307\u4EE4\u4E2D\u5305\u542B `<execution_plan>`/task.md\u4E2D\u5305\u542B `@depends` \u65F6\uFF0C\u5FC5\u987B\u6309\u4EE5\u4E0B\u7B56\u7565\u6267\u884C\u4EFB\u52A1\uFF0C\u800C\u975E\u987A\u5E8F\u9010\u4E00\u6267\u884C\u3002\n\n### \u8C03\u5EA6\u89C4\u5219\n\n1. **\u6309 wave \u7F16\u53F7\u4ECE\u5C0F\u5230\u5927**\u4F9D\u6B21\u6267\u884C\uFF0Cwave \u4E4B\u95F4\u4E25\u683C\u4E32\u884C\n2. **\u540C\u4E00 wave \u5185\u7684\u591A\u4E2A task**\uFF1A\u4E3A\u6BCF\u4E2A task \u542F\u52A8\u72EC\u7ACB\u7684 subagent\uFF08Coding \u7C7B\u578B\uFF09\uFF0C\u6240\u6709 subagent \u5E76\u884C\u6267\u884C\n3. **\u7B49\u5F85\u672C wave \u6240\u6709 subagent \u5B8C\u6210\u540E**\uFF0C\u624D\u542F\u52A8\u4E0B\u4E00 wave\n4. \u540C\u4E00 wave \u5185\u4EC5\u6709\u4E00\u4E2A task \u65F6\uFF0C\u542F\u52A8\u5355\u4E2A subagent \u6267\u884C\n5. **\u53C2\u8003 `<scheduling_summary>` \u4E2D\u7684\u5177\u4F53\u8C03\u5EA6\u6307\u4EE4**\uFF0C\u660E\u786E\u6BCF\u4E2A wave \u9700\u8981\u542F\u52A8\u7684 subagent \u6570\u91CF\u548C\u6267\u884C\u65B9\u5F0F\n\n### \u8C03\u5EA6\u6307\u4EE4\u683C\u5F0F\n\n\u6267\u884C\u8BA1\u5212\u7684 `<wave>` \u5143\u7D20\u5305\u542B\u4EE5\u4E0B\u5C5E\u6027\u7528\u4E8E\u6307\u5BFC subagent \u8C03\u5EA6\uFF1A\n- `subagent_count`\uFF1A\u8BE5\u6CE2\u6B21\u9700\u8981\u542F\u52A8\u7684 subagent \u6570\u91CF\uFF08\u7B49\u4E8E wave \u5185\u7684\u4EFB\u52A1\u6570\uFF09\n- `execution_mode`\uFF1A\u6267\u884C\u6A21\u5F0F\uFF0C`parallel`\uFF08\u5E76\u884C\uFF09\u6216 `serial`\uFF08\u4E32\u884C\uFF09\n\n`<scheduling_summary>` \u63D0\u4F9B\u4EBA\u7C7B\u53EF\u8BFB\u7684\u8C03\u5EA6\u6458\u8981\uFF0C\u683C\u5F0F\u5982\u4E0B\uFF1A\n```\nWave 1 \u2192 \u542F\u52A8 1 \u4E2A subagent \u6267\u884C\u8BE5\u6CE2\u6B21\u7684\u5355\u4E2A\u4EFB\u52A1\nWave 2 \u2192 \u542F\u52A8 1 \u4E2A subagent \u6267\u884C\u8BE5\u6CE2\u6B21\u7684\u5355\u4E2A\u4EFB\u52A1\nWave 3 \u2192 \u542F\u52A8 2 \u4E2A subagent \u5E76\u884C\u6267\u884C\u8BE5\u6CE2\u6B21\u7684 2 \u4E2A\u4EFB\u52A1\n```\n\nAI \u52A9\u624B\u5728\u6267\u884C\u65F6**\u5FC5\u987B**\u6309\u7167 `<scheduling_summary>` \u4E2D\u7684\u6307\u4EE4\u542F\u52A8\u5BF9\u5E94\u6570\u91CF\u7684 subagent\u3002\n\n### Subagent \u4E0A\u4E0B\u6587\u9694\u79BB\n\n\u6BCF\u4E2A subagent \u7684 prompt \u4E2D**\u4EC5\u5305\u542B**\uFF1A\n- \u5F53\u524D task \u7684\u63CF\u8FF0\u548C\u9A8C\u6536\u6807\u51C6\n- \u5F53\u524D task \u5173\u8054\u7684 `@skill` \u5185\u5BB9\uFF08\u901A\u8FC7 skill \u540D\u79F0\u89E6\u53D1\u52A0\u8F7D\uFF09\n- \u76F8\u5173\u7684 spec \u6587\u4EF6\u8DEF\u5F84\u548C\u5185\u5BB9\uFF08\u4EC5\u9650\u8BE5 task \u6D89\u53CA\u7684\u90E8\u5206\uFF09\n- \u524D\u5E8F wave \u7684\u5B8C\u6210\u6458\u8981\uFF08\u800C\u975E\u5B8C\u6574\u8F93\u51FA\uFF09\n\n**\u7981\u6B62**\u5411 subagent \u6CE8\u5165\uFF1A\n- \u5176\u4ED6 wave \u7684 task \u8BE6\u60C5\n- \u4E0D\u76F8\u5173\u7684 skill \u5185\u5BB9\n- \u5176\u4ED6 subagent \u7684\u5B8C\u6574\u8F93\u51FA\n\n### \u5B8C\u6210\u540C\u6B65\n\n- \u6BCF\u4E2A subagent \u5B8C\u6210\u540E\uFF0C\u63D0\u53D6\u7B80\u77ED\u7684**\u5B8C\u6210\u6458\u8981**\uFF08\u4FEE\u6539\u4E86\u54EA\u4E9B\u6587\u4EF6\u3001\u5173\u952E\u53D8\u66F4\u70B9\uFF09\n- \u5C06\u6458\u8981\u4F20\u9012\u7ED9\u540E\u7EED wave \u7684 subagent \u4F5C\u4E3A\u4E0A\u4E0B\u6587\n- \u5728 `tasks.md` \u4E2D\u5C06\u5BF9\u5E94\u4EFB\u52A1\u6807\u8BB0\u4E3A `[x]`\n\n### \u964D\u7EA7\u7B56\u7565\n\n\u5F53 AI \u5E73\u53F0\u4E0D\u652F\u6301 subagent \u65F6\uFF0C\u6309\u4EE5\u4E0B\u964D\u7EA7\u7B56\u7565\u6267\u884C\uFF1A\n1. \u4ECD\u6309 wave \u987A\u5E8F\u6267\u884C\u4EFB\u52A1\n2. \u6BCF\u4E2A task \u6267\u884C\u524D\uFF0C\u6E05\u7406\u4E0D\u76F8\u5173\u7684 skill \u4E0A\u4E0B\u6587\n3. \u6BCF\u4E2A task \u6267\u884C\u540E\uFF0C\u4EC5\u4FDD\u7559\u5B8C\u6210\u6458\u8981\uFF0C\u907F\u514D\u4E0A\u4E0B\u6587\u7D2F\u79EF\u81A8\u80C0\n\n---\n\n## Apply \u9636\u6BB5\u4E13\u7528 Agent\n\nApply \u9636\u6BB5\u4F7F\u7528\u4E24\u79CD\u4E13\u7528 Agent \u7C7B\u578B\u6267\u884C\u4EE3\u7801\u5B9E\u65BD\u4EFB\u52A1\uFF0C\u7531\u7F16\u6392 Agent\uFF08\u4E3B Agent\uFF09\u6839\u636E\u4EFB\u52A1\u6807\u6CE8\u9009\u62E9\u3002\n\n**Agent \u5B9A\u4E49\u6587\u4EF6\u8DEF\u5F84**\uFF08\u4F9B Claude/Cursor \u7B49\u5DE5\u5177\u6CE8\u518C\uFF09\uFF1A\n- `agents/zhuanspec/apply-agent.md` - \u666E\u901A\u4EE3\u7801\u5B9E\u65BD Agent\n- `agents/zhuanspec/tdd-apply-agent.md` - TDD \u6A21\u5F0F Agent\n\n### Agent \u7C7B\u578B\u9009\u62E9\u89C4\u5219\n\n| \u6761\u4EF6 | Agent \u7C7B\u578B | \u5B9A\u4E49\u6587\u4EF6 |\n|------|-----------|---------|\n| \u4EFB\u52A1\u65E0 `@test-case` \u6807\u6CE8 | `applyAgent` | `agents/zhuanspec/apply-agent.md` |\n| \u4EFB\u52A1\u6709 `@test-case:TC-XXX` \u6807\u6CE8 | `tddApplyAgent` | `agents/zhuanspec/tdd-apply-agent.md` |\n\n### Agent \u4F7F\u7528\u65B9\u5F0F\n\n\u7F16\u6392 Agent\uFF08\u4E3B Agent\uFF09\u5728 Wave \u5E76\u884C\u6267\u884C\u65F6\uFF1A\n\n1. **\u9009\u62E9 Agent**\uFF1A\u6839\u636E\u4EFB\u52A1\u7684 `@test-case` \u6807\u6CE8\u9009\u62E9\u5BF9\u5E94 Agent \u7C7B\u578B\n2. **\u52A0\u8F7D Agent \u5B9A\u4E49**\uFF1A\u8BFB\u53D6\u5BF9\u5E94 Agent \u5B9A\u4E49\u6587\u4EF6\u83B7\u53D6\u5B8C\u6574\u6307\u4EE4\n3. **\u6CE8\u5165\u4E0A\u4E0B\u6587**\uFF1A\n - \u5F53\u524D task \u7684\u5B8C\u6574\u63CF\u8FF0\n - \u76F8\u5173 spec \u6587\u4EF6\u5185\u5BB9\n - Rules \u548C Knowledge\uFF08\u8E29\u5751\u8B66\u544A\u3001\u6700\u4F73\u5B9E\u8DF5\uFF09\n - \u524D\u5E8F wave \u5B8C\u6210\u6458\u8981\n4. **\u542F\u52A8 Subagent**\uFF1A\u4F7F\u7528 Agent tool \u542F\u52A8 subagent\n5. **\u5904\u7406\u72B6\u6001\u62A5\u544A**\uFF1A\u6839\u636E Agent \u8FD4\u56DE\u7684 Status \u6267\u884C\u540E\u7EED\u64CD\u4F5C\n\n### Rules \u548C Knowledge \u6CE8\u5165\uFF08\u5173\u952E\uFF09\n\n\u7F16\u6392 Agent MUST \u5728\u6BCF\u4E2A subagent prompt \u4E2D\u6CE8\u5165\u4EE5\u4E0B\u4E0A\u4E0B\u6587\uFF1A\n\n**Rules \u52A0\u8F7D**\uFF08\u6839\u636E @skill \u9009\u62E9\u6027\u6CE8\u5165\uFF09\uFF1A\n- `api-design.md` - \u524D\u540E\u7AEF\u63A5\u53E3\u8BBE\u8BA1\u89C4\u8303\uFF08\u6D89\u53CA Controller/API \u65F6\uFF09\n- `dao-standards.md` - Java DAO \u5C42\u89C4\u8303\uFF08\u6D89\u53CA DAO \u65F6\uFF09\n- `coding-standards.md` - KF \u540E\u7AEF\u7F16\u7801\u89C4\u5219\uFF08\u6D89\u53CA Java \u4EE3\u7801\u65F6\uFF09\n- `java-db-schema-standards.md` - MySQL \u6570\u636E\u5E93\u5EFA\u8868\u6539\u8868\u89C4\u8303\n\n**Knowledge \u52A0\u8F7D**\uFF08MUST \u59CB\u7EC8\u6CE8\u5165\uFF09\uFF1A\n- `knowledge/index.md` - \u77E5\u8BC6\u7D22\u5F15\u6458\u8981\n- \u76F8\u5173 `best-practices/` \u5185\u5BB9\uFF08\u6700\u4F73\u5B9E\u8DF5\uFF09\n- \u76F8\u5173 `troubleshooting/` \u5185\u5BB9\uFF08\u8E29\u5751\u8B66\u544A\uFF09\n\n### \u72B6\u6001\u5904\u7406\u7B56\u7565\n\n| Status | \u5904\u7406\u65B9\u5F0F |\n|--------|---------|\n| **DONE** | \u7EE7\u7EED\u4E0B\u4E00\u4EFB\u52A1\uFF0C\u8BB0\u5F55\u5B8C\u6210\u6458\u8981 |\n| **DONE_WITH_CONCERNS** | \u8BC4\u4F30 concerns\uFF0C\u6B63\u786E\u6027\u95EE\u9898\u5148\u4FEE\u590D\uFF0C\u89C2\u5BDF\u6027\u95EE\u9898\u8BB0\u5F55\u540E\u7EE7\u7EED |\n| **BLOCKED** | \u8BC4\u4F30 blocker \u7C7B\u578B\uFF1A\u63D0\u4F9B\u4E0A\u4E0B\u6587/\u6362\u66F4\u5F3A\u6A21\u578B/\u62C6\u5206\u4EFB\u52A1/\u4FEE\u6539\u8BA1\u5212 |\n| **NEEDS_CONTEXT** | \u63D0\u4F9B\u7F3A\u5931\u4FE1\u606F\u5E76\u91CD\u65B0\u542F\u52A8 subagent |\n\n### Subagent \u4E0A\u4E0B\u6587\u9694\u79BB\u89C4\u5219\n\n**\u5FC5\u987B\u6CE8\u5165**\uFF1A\n- \u5F53\u524D task \u7684\u5B8C\u6574\u63CF\u8FF0\u548C\u9A8C\u6536\u6807\u51C6\n- \u5F53\u524D task \u5173\u8054\u7684 `@skill` \u5185\u5BB9\n- \u76F8\u5173\u7684 spec \u6587\u4EF6\u8DEF\u5F84\u548C\u5185\u5BB9\uFF08\u4EC5\u9650\u8BE5 task \u6D89\u53CA\u7684\u90E8\u5206\uFF09\n- \u524D\u5E8F wave \u7684\u5B8C\u6210\u6458\u8981\uFF08\u800C\u975E\u5B8C\u6574\u8F93\u51FA\uFF09\n- Rules \u548C Knowledge \u4E0A\u4E0B\u6587\n\n**\u7981\u6B62\u6CE8\u5165**\uFF1A\n- \u5176\u4ED6 wave \u7684 task \u8BE6\u60C5\n- \u4E0D\u76F8\u5173\u7684 skill \u5185\u5BB9\n- \u5176\u4ED6 subagent \u7684\u5B8C\u6574\u8F93\u51FA\n\n---\n\n### Rules \u548C Knowledge \u6CE8\u5165\u793A\u4F8B\n\n\u7F16\u6392 Agent \u5728\u542F\u52A8 subagent \u65F6\u7684 prompt \u793A\u4F8B\uFF1A\n\n```markdown\n## Rules \u548C Knowledge \u4E0A\u4E0B\u6587\uFF08\u5FC5\u987B\u9075\u5FAA\uFF09\n\n### \u76F8\u5173 Rules\n[\u6839\u636E @skill \u6807\u6CE8\u6CE8\u5165\u5BF9\u5E94 rules \u5185\u5BB9\uFF0C\u5982 api-design.md]\n\n### Knowledge - \u6700\u4F73\u5B9E\u8DF5\n[\u6CE8\u5165 best-practices \u5185\u5BB9]\n\n### Knowledge - \u8E29\u5751\u8B66\u544A\n[\u6CE8\u5165 troubleshooting \u5185\u5BB9\uFF0C\u5982\u6709]\n\n\u26A0\uFE0F **\u91CD\u8981**: \u4EE5\u4E0B rules \u548C knowledge MUST \u5728\u5B9E\u65BD\u8FC7\u7A0B\u4E2D\u9075\u5FAA\u3002\n\u5982\u6709\u4EFB\u4F55\u4E0D\u786E\u5B9A\uFF0C\u62A5\u544A NEEDS_CONTEXT \u72B6\u6001\u3002\n```\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---\n\n## \u26A1 \u4E09\u6761\u94C1\u5F8B\uFF08\u4E0D\u53EF\u8FDD\u53CD\uFF09\n\n> \u4E09\u6761\u94C1\u5F8B\u662F ZhuanSpec \u5DE5\u4F5C\u6D41\u7684\u6838\u5FC3\u7EA6\u675F\uFF0C\u4EFB\u4F55\u60C5\u51B5\u4E0B\u90FD\u5FC5\u987B\u9075\u5B88\u3002\n\n| \u94C1\u5F8B | \u542B\u4E49 | \u8FDD\u53CD\u540E\u679C |\n|------|------|---------|\n| **No Spec, No Code** | \u6CA1\u6709\u6587\u6863\u4E0D\u51C6\u5199\u4EE3\u7801 | Propose \u9636\u6BB5\u4EA7\u51FA spec \u624D\u80FD\u8FDB\u5165 Apply |\n| **Spec is Truth** | \u6587\u6863\u4E0E\u4EE3\u7801\u51B2\u7A81\u65F6\uFF0C\u9519\u7684\u4E00\u5B9A\u662F\u4EE3\u7801 | \u5F52\u6863\u65F6\u5F3A\u5236\u6821\u9A8C Spec-Code \u4E00\u81F4\u6027 |\n| **Reverse Sync** | \u53D1\u73B0\u504F\u5DEE\u5148\u4FEE Spec\uFF0C\u518D\u4FEE\u4EE3\u7801 | Apply \u9636\u6BB5\u6BCF\u5B8C\u6210\u4E00\u4E2A Task \u505A\u504F\u5DEE\u68C0\u6D4B |\n\n### \u94C1\u5F8B\u6267\u884C\u673A\u5236\n\n**\u94C1\u5F8B\u4E00\u6267\u884C**\uFF1A\n- Propose \u9636\u6BB5\u521B\u5EFA\u63D0\u6848\u540E\uFF0C\u5FC5\u987B\u7B49\u5F85\u7528\u6237\u660E\u786E\u6279\u51C6\uFF08\u56DE\u590D\"Plan Approved\"\u6216\u9009\u62E9\"\u6279\u51C6\uFF0C\u8FDB\u5165\u5B9E\u65BD\u9636\u6BB5\"\uFF09\u624D\u80FD\u8FDB\u5165 Apply\n- \u81EA\u52A8\u9A8C\u8BC1\u901A\u8FC7\u540E\uFF0C\u4F7F\u7528\u9009\u9879\u5F0F\u4EA4\u4E92\uFF08AskUserQuestion\uFF09\u5F39\u51FA\u786E\u8BA4\u5BF9\u8BDD\u6846\n- \u672A\u6279\u51C6\u524D\uFF0CPreToolUse Hook \u963B\u65AD\u6240\u6709\u4EE3\u7801\u4FEE\u6539\u64CD\u4F5C\n\n**\u94C1\u5F8B\u4E8C\u6267\u884C**\uFF1A\n- Archive \u9636\u6BB5\u524D\uFF0C\u5FC5\u987B\u9A8C\u8BC1\u5F52\u6863\u5185\u5BB9\u4E0E\u4EE3\u7801\u5B9E\u73B0\u4E00\u81F4\n- \u5982\u4E0D\u4E00\u81F4\uFF0C\u5FC5\u987B\u5148\u66F4\u65B0\u5F52\u6863\u5185\u5BB9\uFF0C\u518D\u5B8C\u6210\u5F52\u6863\n- PreArchive Hook \u68C0\u67E5 Spec-Code \u4E00\u81F4\u6027\n\n**\u94C1\u5F8B\u4E09\u6267\u884C**\uFF1A\n- Apply \u9636\u6BB5\u6BCF\u6B21 Write/Edit \u64CD\u4F5C\u524D\uFF0CPreToolUse Hook \u68C0\u6D4B\u504F\u79BB\n- **\u504F\u79BB\u68C0\u6D4B\u89E6\u53D1\u673A\u5236**\uFF1A\n - \u63D0\u6848\u8303\u56F4\u5916\u6587\u4EF6\u4FEE\u6539\u65F6\u81EA\u52A8\u89E6\u53D1\n - \u7528\u6237\u8F93\u5165\u7EA0\u6B63\u5173\u952E\u8BCD\uFF08\"\u4E0D\u5BF9\"\u3001\"\u9519\u4E86\"\u3001\"\u8FD9\u91CC\u5E94\u8BE5\u662F\"\u7B49\uFF09\u65F6\u81EA\u52A8\u89E6\u53D1\n - \u901A\u8FC7\u8BFB\u53D6 `progress.json` \u7684 `phase` \u5B57\u6BB5\u5224\u65AD\u5F53\u524D\u9636\u6BB5\n- \u5982\u679C\u4FEE\u6539\u6587\u4EF6\u4E0D\u5728\u63D0\u6848\u8303\u56F4\u5185\uFF0C\u89E6\u53D1\u504F\u79BB\u5904\u7406\u6D41\u7A0B\uFF1A\n 1. \u5F39\u51FA\u9009\u9879\u5F0F\u4EA4\u4E92\uFF1A\u66F4\u65B0\u63D0\u6848\u540E\u7EE7\u7EED / Bug\u4FEE\u590D\u8C41\u514D / \u53D6\u6D88\u4FEE\u6539\n 2. \u7528\u6237\u9009\u62E9\"\u66F4\u65B0\u63D0\u6848\u540E\u7EE7\u7EED\" \u2192 AI \u8FDB\u5165 Propose \u6A21\u5F0F \u2192 \u81EA\u52A8\u66F4\u65B0 proposal.md \u548C tasks.md \u2192 `zhuanspec validate --auto-fix` \u2192 \u8FD4\u56DE Apply \u6267\u884C\u539F\u4FEE\u6539\n 3. \u7528\u6237\u9009\u62E9\"Bug\u4FEE\u590D\u8C41\u514D\" \u2192 \u6807\u8BB0\u4E3A Bug \u4FEE\u590D \u2192 \u5141\u8BB8\u4FEE\u6539\uFF0C\u8DF3\u8FC7\u63D0\u6848\u6D41\u7A0B\n 4. \u7528\u6237\u9009\u62E9\"\u53D6\u6D88\" \u2192 \u4E0D\u6267\u884C\u4FEE\u6539 \u2192 \u7EE7\u7EED\u539F\u4EFB\u52A1\n- **\u504F\u79BB\u4FEE\u6B63\u6D41\u7A0B**\uFF08\u7528\u6237\u7EA0\u6B63\u65F6\uFF09\uFF1A\n 1. \u5148\u4FEE\u6539 spec \u6587\u4EF6\uFF0C\u5B9E\u65F6\u540C\u6B65\u7528\u6237\u786E\u8BA4\n 2. \u7528\u6237\u786E\u8BA4\u540E\u4FEE\u6539\u4EE3\u7801\uFF0C\u5B8C\u6210\u540E\u9A8C\u8BC1\n 3. \u7528\u6237\u786E\u8BA4\u65E0\u8BEF\u540E\u89E6\u53D1\u77E5\u8BC6\u6C89\u6DC0\n\n### AI \u81EA\u7531\u5EA6\u63A7\u5236\u77E9\u9635\n\n| \u9636\u6BB5 | \u81EA\u7531\u5EA6 | \u5141\u8BB8\u884C\u4E3A | \u7981\u6B62\u884C\u4E3A |\n|------|--------|---------|---------|\n| **Propose** | \u9AD8 | \u63A2\u7D22\u4EE3\u7801\u3001\u8BBE\u8BA1\u65B9\u6848\u3001\u63D0\u95EE\u6F84\u6E05 | \u7F16\u5199\u4EFB\u4F55\u4EE3\u7801 |\n| **Apply** | \u96F6 | \u4E25\u683C\u6309 tasks.md \u65BD\u5DE5 | \u8D85\u51FA\u63D0\u6848\u8303\u56F4\u4FEE\u6539\u3001\u81EA\u884C\u6DFB\u52A0\u4EFB\u52A1 |\n| **Review** | \u4E2D | \u9A8C\u8BC1\u5B9E\u73B0\u3001\u751F\u6210\u6D4B\u8BD5\u3001\u5BA1\u67E5\u4EE3\u7801 | \u4FEE\u6539\u529F\u80FD\u4EE3\u7801 |\n| **Archive** | \u4F4E | \u5408\u5E76\u89C4\u8303\u3001\u751F\u6210\u6458\u8981 | \u4FEE\u6539\u5DF2\u5F52\u6863\u5185\u5BB9 |\n\n---\n\n## \u77E5\u8BC6\u5E93\u68C0\u67E5\n\n**\u5728\u4EFB\u4F55\u9636\u6BB5\u5F00\u59CB\u524D\uFF0C\u5FC5\u987B\u5148\u68C0\u67E5\u77E5\u8BC6\u5E93\uFF1A**\n\n| \u64CD\u4F5C | \u547D\u4EE4 | \u76EE\u7684 |\n|------|------|------|\n| \u641C\u7D22\u9677\u9631 | `rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/troubleshooting/` | \u907F\u514D\u91CD\u590D\u8E29\u5751 |\n| \u641C\u7D22\u6700\u4F73\u5B9E\u8DF5 | `rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/best-practices/` | \u5B66\u4E60\u6210\u529F\u7ECF\u9A8C |\n| \u641C\u7D22\u9690\u5F0F\u7EA6\u5B9A | `rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/implicit-conventions/` | \u7406\u89E3\u56E2\u961F\u7EA6\u5B9A |\n| \u9605\u8BFB\u77E5\u8BC6\u7D22\u5F15 | `cat zhuanspec/knowledge/index.md` | \u4E86\u89E3\u9879\u76EE\u7EA7\u77E5\u8BC6\u6458\u8981 |\n\n**\u77E5\u8BC6\u5E93\u4F5C\u7528**\uFF1A\n- \u51CF\u5C11\u91CD\u590D\u8E29\u5751\uFF0C\u79EF\u7D2F\u9879\u76EE\u7ECF\u9A8C\n- \u63D0\u4F9B\u56E2\u961F\u9690\u5F0F\u7EA6\u5B9A\u7684\u4E66\u9762\u8BB0\u5F55\n- \u52A0\u901F\u65B0\u6210\u5458\u878D\u5165\u548C\u77E5\u8BC6\u4F20\u627F\n\n---\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- **\u68C0\u67E5\u77E5\u8BC6\u5E93**\uFF1A`rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/` \u641C\u7D22\u76F8\u5173\u9677\u9631\u548C\u6700\u4F73\u5B9E\u8DF5\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`\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## \u8FDB\u5EA6\u6C47\u62A5\u7EA6\u5B9A\n\nApply \u9636\u6BB5\u6267\u884C\u6BCF\u4E2A\u4EFB\u52A1\u65F6\uFF0C\u5FC5\u987B\u6309\u4EE5\u4E0B\u683C\u5F0F\u8F93\u51FA\u8FDB\u5EA6\uFF1A\n\n**\u4EFB\u52A1\u5F00\u59CB\u65F6**\uFF1A\n```\n\u2501\u2501\u2501 \uD83D\uDE80 \u5F00\u59CB\u4EFB\u52A1 [X.Y/N] \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\u4EFB\u52A1: [\u4EFB\u52A1\u63CF\u8FF0]\nWave: W/N | Phase: Apply\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n```\n\n**\u4EFB\u52A1\u5B8C\u6210\u540E**\uFF1A\n```\n\u2501\u2501\u2501 \u2705 \u4EFB\u52A1\u5B8C\u6210 [X.Y/N] \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\u5DF2\u4FEE\u6539: [\u6587\u4EF6\u5217\u8868]\n\u4E0B\u4E00\u4E2A: [\u4E0B\u4E00\u4EFB\u52A1ID]\n\u6574\u4F53\u8FDB\u5EA6: \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591 XX.X%\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n```\n\n**\u8FDB\u5EA6\u6761\u683C\u5F0F**\uFF1A\n- \u4F7F\u7528 12 \u4E2A block \u5B57\u7B26\uFF08\u2588 \u548C \u2591\uFF09\n- \u8FDB\u5EA6\u767E\u5206\u6BD4 = (\u5DF2\u5B8C\u6210\u4EFB\u52A1\u6570 / \u603B\u4EFB\u52A1\u6570) \u00D7 100\n- \u4FDD\u7559 1 \u4F4D\u5C0F\u6570\n\n**\u793A\u4F8B**\uFF1A\n- 3/8 \u5B8C\u6210 \u2192 `\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2591\u2591 37.5%`\n- 6/8 \u5B8C\u6210 \u2192 `\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591 75.0%`\n\n---\n\n## \u56DB\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. **\u68C0\u67E5\u77E5\u8BC6\u5E93\u3001\u52A0\u8F7D\u9879\u76EE\u77E5\u8BC6\u5E76\u5BA1\u67E5\u9879\u76EE**\uFF1A\n - \u8FD0\u884C `rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/` \u641C\u7D22\u76F8\u5173\u9677\u9631\u548C\u6700\u4F73\u5B9E\u8DF5\uFF0C\u907F\u514D\u91CD\u590D\u8E29\u5751\n - \u9605\u8BFB `zhuanspec/knowledge/index.md` \u4E86\u89E3\u9879\u76EE\u7EA7\u77E5\u8BC6\u6458\u8981\n - **\u52A0\u8F7D\u9879\u76EE\u77E5\u8BC6**\uFF1A\u8C03\u7528 `@skill:load-project-knowledge` \u8FDB\u884C\u6E10\u8FDB\u5F0F\u52A0\u8F7D\uFF1A\n * \u8F93\u5165\uFF1Adomain\uFF08\u5F53\u524D\u9879\u76EE\uFF09\u3001keywords\uFF08\u4ECE\u9700\u6C42\u63CF\u8FF0\u63D0\u53D6\uFF09\n * \u83B7\u53D6\uFF1Amatched_services\uFF08\u6D89\u53CA\u7684\u670D\u52A1\u5217\u8868\uFF09\u3001search_priority\uFF08\u68C0\u7D22\u4F18\u5148\u8DEF\u5F84\uFF09\u3001architecture_constraints\uFF08\u67B6\u6784\u7EA6\u675F\uFF09\n * \u4F7F\u7528\uFF1A\u540E\u7EED\u4EE3\u7801\u5B9A\u4F4D\u4F7F\u7528 search_priority \u9650\u5B9A\u8303\u56F4\uFF0C\u65B9\u6848\u8BBE\u8BA1\u68C0\u67E5 architecture_constraints\n * \u517C\u5BB9\u7B56\u7565\uFF1A\u82E5\u672A\u627E\u5230 project.md \u6216\u5173\u952E\u8BCD\u65E0\u5339\u914D\uFF0C\u8F93\u51FA\u8B66\u544A\u5E76\u4F7F\u7528\u5168\u5C40\u68C0\u7D22\n - \u9605\u8BFB `zhuanspec/project.md` \u4E86\u89E3\u9879\u76EE\u7EA6\u5B9A\uFF08\u63D0\u793A\uFF1A\"\u2713 Loaded project.md\"\uFF09\n - \u5BA1\u67E5 `zhuanspec/project.md`\uFF0C`zhuanspec list` \u548C `zhuanspec list --specs` \u4EE5\u4E86\u89E3\u5F53\u524D\u4E0A\u4E0B\u6587\u3002\n1. **\u5F3A\u5236\u8BE2\u95EE\u6D4B\u8BD5\u7528\u4F8B\uFF08TDD \u6A21\u5F0F\u68C0\u67E5\u70B9\uFF0C\u5FC5\u987B\u9996\u5148\u6267\u884C\uFF09**\uFF1A\n - \u4F7F\u7528\u9009\u9879\u5F0F\u4EA4\u4E92\u8BE2\u95EE\uFF1A\"\u8BF7\u63D0\u4F9B\u76F8\u5173\u7684\u6D4B\u8BD5\u7528\u4F8B\uFF08\u53EF\u9009\uFF09\uFF0C\u53EF\u4EE5\u662F\uFF1A\u672C\u5730\u76EE\u5F55\u8DEF\u5F84\u3001\u5728\u7EBF\u94FE\u63A5\uFF08\u5C06\u901A\u8FC7 zzcase-data-fetcher skill \u83B7\u53D6\uFF09\u3001\u6216\u8DF3\u8FC7\u6B64\u6B65\u9AA4\u7EE7\u7EED\u5E38\u89C4\u6D41\u7A0B\"\n - \u7528\u6237\u9009\u62E9\"\u63D0\u4F9B\u6D4B\u8BD5\u7528\u4F8B\"\uFF1A\u8FDB\u5165 TDD \u9A71\u52A8\u6A21\u5F0F\n * \u660E\u786E\u544A\u77E5\uFF1A\u6D4B\u8BD5\u7528\u4F8B\u5C06\u7528\u4E8E\u9700\u6C42\u5B9A\u4E49\u3001\u5355\u5143\u6D4B\u8BD5\u751F\u6210\u3001\u5B9E\u65BD\u9A8C\u8BC1\n * \u5728 proposal.md \u521B\u5EFA \"Test Case Coverage\" \u90E8\u5206\n * \u5728 tasks.md \u4F7F\u7528 `@test-case:TC-XXX` \u6807\u7B7E\u5173\u8054\u4EFB\u52A1\n * \u521B\u5EFA test-cases.md \u8BB0\u5F55\u6D4B\u8BD5\u7528\u4F8B\u8BE6\u60C5\n - \u7528\u6237\u9009\u62E9\"\u8DF3\u8FC7\"\uFF1A\u7EE7\u7EED\u5E38\u89C4\u6D41\u7A0B\uFF08\u5373\u63D0\u6848\u65E0\u9700\u8003\u8651\u6D4B\u8BD5case\uFF09\n\n \u26A0\uFE0F **CHECKPOINT [TDD-MODE]**:\n - TDD \u6A21\u5F0F\u4E0B\uFF0CApply \u9636\u6BB5\u6BCF\u4E2A\u4EFB\u52A1\u5B8C\u6210\u540E\u9700\u9A8C\u8BC1\u5BF9\u5E94\u6D4B\u8BD5\u7528\u4F8B\u901A\u8FC7\n - Review \u9636\u6BB5\u5305\u542B\u6D4B\u8BD5\u8986\u76D6\u7387\u68C0\u67E5\n - \u6D4B\u8BD5\u7528\u4F8B\u5728 TDD \u6A21\u5F0F\u4E0B\u53D1\u6325\u5173\u952E\u9A8C\u8BC1\u4F5C\u7528\uFF0C\u786E\u4FDD\u4EE3\u7801\u7B26\u5408\u9884\u671F\u884C\u4E3A\n\n2. **\u5F3A\u5236\u6F84\u6E05\u68C0\u67E5\uFF08\u5FC5\u987B\u6267\u884C\uFF0C\u4E0D\u53EF\u8DF3\u8FC7\uFF09**\uFF1A\u5206\u6790\u7528\u6237\u8BF7\u6C42\uFF0C\u8BC6\u522B\u6240\u6709\u4E0D\u786E\u5B9A\u6216\u6A21\u7CCA\u7684\u65B9\u9762\uFF08\u8303\u56F4\u3001\u6280\u672F\u9009\u62E9\u3001\u5B9E\u73B0\u7EC6\u8282\u3001\u6570\u636E\u83B7\u53D6\u6765\u6E90\u3001\u670D\u52A1\u5206\u5C42\u3001\u4F9D\u8D56\u5173\u7CFB\u3001\u4F18\u5148\u7EA7\u3001\u9A8C\u6536\u6807\u51C6\u7B49......\uFF09\u3002\u5982\u679C\u53D1\u73B0\u4EFB\u4F55\u6A21\u7CCA\u4E4B\u5904\uFF0C\u5FC5\u987B\u505C\u6B62\u5E76\u4F7F\u7528**\u9009\u9879\u5F0F\u4EA4\u4E92**\uFF08\u5982 `AskQuestion` \u5DE5\u5177\uFF09\u63D0\u95EE\uFF0C\u83B7\u5F97\u660E\u786E\u7B54\u590D\u540E\u624D\u80FD\u7EE7\u7EED\u3002\u4E25\u7981\u5728\u4E0D\u786E\u5B9A\u7684\u60C5\u51B5\u4E0B\u81EA\u884C\u63A8\u6D4B\u6216\u521B\u5EFA\u63D0\u6848\uFF0C\u4E25\u7981\u8981\u6C42\u7528\u6237\u624B\u52A8\u8F93\u5165\u5927\u6BB5\u6587\u5B57\u3002\n\n \u26A0\uFE0F **CHECKPOINT [PRE-CLARIFICATION]**:\n You MUST record the pre-clarification result in tasks.md under \"## Pre-Clarification Log\":\n - If questions were asked: Record each question and the user's answer\n - If no clarification needed: Write \"Status: COMPLETED - No clarification needed\" with brief justification\n - This section MUST NOT be empty or contain only HTML comments\n - NEVER proceed to proposal writing without completing this checkpoint\n\n3. \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`design.md` \u548C\u89C4\u8303\u589E\u91CF\u3002\n4. \u5C06\u53D8\u66F4\u6620\u5C04\u4E3A\u5177\u4F53\u7684\u529F\u80FD\u6216\u8981\u6C42\uFF0C\u5C06\u591A\u8303\u56F4\u7684\u5DE5\u4F5C\u5206\u89E3\u4E3A\u5177\u6709\u660E\u786E\u5173\u7CFB\u548C\u987A\u5E8F\u7684\u4E0D\u540C\u89C4\u8303\u589E\u91CF\u3002\n5. \u5F53\u89E3\u51B3\u65B9\u6848\u8DE8\u8D8A\u591A\u4E2A\u7CFB\u7EDF\u3001\u5F15\u5165\u65B0\u6A21\u5F0F\u6216\u5728\u63D0\u4EA4\u89C4\u8303\u4E4B\u524D\u9700\u8981\u6743\u8861\u8BA8\u8BBA\u65F6\uFF0C\u5728 `design.md` \u4E2D\u6355\u83B7\u67B6\u6784\u63A8\u7406\u3002\n6. \u5728 `changes/<id>/specs/<capability>/spec.md` \u4E2D\u8D77\u8349\u89C4\u8303\u589E\u91CF\uFF08\u6BCF\u4E2A\u529F\u80FD\u4E00\u4E2A\u6587\u4EF6\u5939\uFF09\uFF0C\u4F7F\u7528 `## ADDED|MODIFIED|REMOVED Requirements`\uFF0C\u6BCF\u4E2A\u8981\u6C42\u81F3\u5C11\u5305\u542B\u4E00\u4E2A `#### Scenario:`\uFF0C\u5E76\u5728\u76F8\u5173\u65F6\u4EA4\u53C9\u5F15\u7528\u76F8\u5173\u529F\u80FD\u3002\n7. **\u53D1\u73B0\u53EF\u7528 Skill \u5E76\u521B\u5EFA tasks.md**\uFF1A\n - \u8FD0\u884C `zhuanspec skills list --json` \u83B7\u53D6\u5F53\u524D\u73AF\u5883\u4E2D\u53EF\u7528\u7684 skill \u5217\u8868\u53CA\u5176 description\n - \u5728 `proposal.md` \u7684 **Skill Mapping** \u6BB5\u4E2D\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\u5B9E\u73B0\u533A\u57DF\u7684\u5B9E\u9645\u529F\u80FD\u4E0E skill description \u660E\u786E\u5339\u914D\u65F6\u624D\u5173\u8054\n - \u7B80\u5355\u7684\u4EE3\u7801\u4FEE\u6539\uFF08\u5982\u679A\u4E3E\u503C\u589E\u5220\uFF09\u5E94\u5339\u914D\u901A\u7528\u7F16\u7801\u89C4\u8303 skill\uFF0C\u800C\u975E\u67B6\u6784\u7EA7 skill\n - \u907F\u514D\u4EC5\u56E0\u6A21\u5757\u540D\u79F0\u6216\u6587\u4EF6\u8DEF\u5F84\u4E2D\u7684\u5173\u952E\u8BCD\u800C\u9519\u8BEF\u5339\u914D\n - \u5728\u8868\u683C\u4E2D\u8BF4\u660E\u5339\u914D\u7406\u7531\n - \u5C06 `tasks.md` \u8D77\u8349\u4E3A\u6709\u5E8F\u7684\u5C0F\u578B\u3001\u53EF\u9A8C\u8BC1\u5DE5\u4F5C\u9879\u5217\u8868\n - \u4F7F\u7528 `@skill:<real-skill-name>` \u6807\u6CE8\u4E0E skill \u5339\u914D\u7684\u4EFB\u52A1\uFF08\u652F\u6301\u591A\u4E2A\uFF1A`@skill:name1,name2`\uFF09\n - \u4EC5\u5F53 skill \u660E\u786E\u5339\u914D\u4EFB\u52A1\u65F6\u624D\u6807\u6CE8\uFF0C\u6CA1\u6709\u5339\u914D\u7684 skill \u53EF\u7701\u7565\u6807\u7B7E\n\n \u26A0\uFE0F **CHECKPOINT [SKILL-TAGGING]**:\n 1. You MUST run `zhuanspec skills list` first and record discovered skills in the Skill Mapping table\n 2. Every task MUST have either @skill:real-skill-name or @skill:none\n 3. If @skill:none, you MUST provide a justification (e.g., \"pure config change, no skill applies\")\n 4. @skill names MUST match exactly the names returned by `zhuanspec skills list` \u2014 do NOT invent skill names\n 5. The Skill Mapping table in tasks.md MUST NOT be empty\n 6. validate --strict will verify all @skill names exist in the known skill list\n\n \u26A0\uFE0F **CHECKPOINT [TASK-ORDERING]**:\n 1. Tasks in tasks.md MUST be organized under Wave headers (### Wave 1, ### Wave 2, etc.)\n 2. Wave assignment must be computed from @depends relationships (Wave 1 = no deps, Wave N = depends on Wave N-1)\n 3. No task may appear before a task it depends on\n 4. You MUST add a \"## Dependency Analysis\" section at the end with \"Status: COMPLETED\"\n 5. validate --strict will verify task ordering matches computed waves\n\n8. **\u6D4B\u8BD5 case \u5904\u7406\uFF08\u4EC5 TDD \u6A21\u5F0F\uFF09**\uFF1A\n\n **\u26A0\uFE0F \u6A21\u5F0F\u5224\u65AD**\uFF1A\u6839\u636E\u4EE5\u4E0B\u6761\u4EF6\u5224\u65AD\u5F53\u524D\u662F\u54EA\u79CD\u6A21\u5F0F\uFF1A\n - **\u6709 case \u6A21\u5F0F**\uFF1A\u7528\u6237\u63D0\u4F9B\u6D4B\u8BD5 case \u6765\u6E90\uFF08taskId/bicId\uFF09\u3001\u7528\u6237\u8981\u6C42 TDD \u5DE5\u4F5C\u6D41\u3001\u6216\u660E\u786E\u8981\u6C42\u8BBE\u8BA1\u6D4B\u8BD5 case\n - **\u65E0 case \u6A21\u5F0F**\uFF1A\u666E\u901A spec-driven \u5DE5\u4F5C\u6D41\uFF0C\u7528\u6237\u672A\u63D0\u4F9B\u6D4B\u8BD5 case \u76F8\u5173\u4FE1\u606F\n\n **\u3010\u6709 case \u6A21\u5F0F\u3011**\uFF08\u5FC5\u987B\u6267\u884C\u4EE5\u4E0B\u6B65\u9AA4\uFF09\uFF1A\n - **\u3010\u5F3A\u5236\u3011\u83B7\u53D6\u6D4B\u8BD5 case \u7684\u65B9\u5F0F**\uFF1A\n * \u5982\u679C\u7528\u6237\u63D0\u4F9B\u7684\u662F**\u94FE\u63A5**\uFF08\u5982 zzcase \u5E73\u53F0 URL\uFF09\uFF1A\u4F7F\u7528 `@skill:zzcase-data-fetcher` skill \u76F4\u63A5\u8BFB\u53D6\n * \u5982\u679C\u7528\u6237\u63D0\u4F9B **taskId/bicId**\uFF1A\u4F7F\u7528 `@skill:zzcase-data-fetcher` skill \u901A\u8FC7\u53C2\u6570\u83B7\u53D6\n * **\u7981\u6B62**\u4F7F\u7528 MCP \u5DE5\u5177 `zzcase_get_api_report_queryBaseCase` \u83B7\u53D6\u6D4B\u8BD5 case\n * \u6216\u624B\u52A8\u5F55\u5165\u6D4B\u8BD5 case\n - **\u3010\u5F3A\u5236\u3011\u521B\u5EFA test-cases.md \u6587\u4EF6**\uFF1A\n * \u4F7F\u7528 `getTestCasesTemplate` \u6A21\u677F\uFF08\u4ECE `src/core/templates/index.ts` \u5BFC\u51FA\uFF09\n * \u6587\u4EF6\u8DEF\u5F84\uFF1A`changes/<change-id>/test-cases.md`\n * \u586B\u5199\u83B7\u53D6\u65F6\u95F4\u3001\u6765\u6E90\uFF08taskId/bicId/manual\uFF09\u3001\u6D4B\u8BD5 case \u8BE6\u60C5\n * \u6BCF\u4E2A TC-XXX \u5FC5\u987B\u5305\u542B\uFF1A\u524D\u7F6E\u6761\u4EF6\u3001\u6D4B\u8BD5\u6B65\u9AA4\u3001\u9884\u671F\u7ED3\u679C\u3001\u9A8C\u6536\u70B9\n - \u5728 `tasks.md` \u589E\u52A0 **Test Case Coverage** \u8868\u683C\uFF08\u56DB\u5217\u683C\u5F0F\uFF09\uFF1A\n | Task | \u6D4B\u8BD5 Case ID | \u6D4B\u8BD5 Case \u6587\u4EF6\u8DEF\u5F84 | \u8986\u76D6\u573A\u666F |\n |------|-------------|-------------------|----------|\n * \"\u6D4B\u8BD5 Case \u6587\u4EF6\u8DEF\u5F84\" \u5217\u586B\u5199 BIC \u8DEF\u5F84\u5C42\u7EA7\u683C\u5F0F\n - \u4F7F\u7528 `@test-case:TC-XXX` \u5173\u8054\u4EFB\u52A1\u4E0E\u6D4B\u8BD5 case\n\n \u26A0\uFE0F **CHECKPOINT [TEST-CASE-COVERAGE]**\uFF08\u4EC5\u9002\u7528\u4E8E\u6709 case \u6A21\u5F0F\uFF09:\n 1. \u6BCF\u4E2A Requirement \u5E94\u81F3\u5C11\u5BF9\u5E94\u4E00\u4E2A\u6D4B\u8BD5 case\n 2. \u6D4B\u8BD5 case \u5E94\u8986\u76D6\u6B63\u5411\u548C\u5F02\u5E38\u573A\u666F\n 3. **\u5FC5\u987B\u521B\u5EFA test-cases.md \u6587\u4EF6**\uFF08\u4F7F\u7528 `getTestCasesTemplate` \u6A21\u677F\uFF09\n 4. Test Case Coverage \u8868\u683C\u5FC5\u987B\u5305\u542B\u56DB\u5217\uFF1ATask\u3001\u6D4B\u8BD5 Case ID\u3001\u6D4B\u8BD5 Case \u6587\u4EF6\u8DEF\u5F84\u3001\u8986\u76D6\u573A\u666F\n 5. validate --strict \u4F1A\u9A8C\u8BC1\u6D4B\u8BD5 case \u8986\u76D6\u7387\uFF08**\u963B\u585E\u7EA7\u522B**\uFF09\n\n **\u3010\u65E0 case \u6A21\u5F0F\u3011**\uFF08\u8DF3\u8FC7\u6D4B\u8BD5 case \u76F8\u5173\u6B65\u9AA4\uFF09\uFF1A\n - \u4E0D\u521B\u5EFA test-cases.md\n - tasks.md \u4E0D\u9700\u8981 Test Case Coverage \u6BB5\n - validate --strict \u7684 test-case-coverage \u89C4\u5219\u81EA\u52A8\u8DF3\u8FC7\uFF08SKIPPED\uFF09\n - \u5355\u6D4B\u7EDF\u4E00\u5728 Review \u9636\u6BB5\u5904\u7406\n\n9. \u3010\u81EA\u52A8\u9A8C\u8BC1\u4E0E\u4FEE\u590D\u3011\uFF1A\n \u8FD0\u884C `zhuanspec validate <id> --strict --auto-fix` \u8FDB\u884C\u9A8C\u8BC1\uFF1A\n - \u5982\u679C\u9A8C\u8BC1\u901A\u8FC7\uFF08PASS\uFF09\uFF1A\u7EE7\u7EED\u4E0B\u4E00\u6B65\n - \u5982\u679C\u9A8C\u8BC1\u5931\u8D25\uFF08FAIL\uFF09\uFF1A\u81EA\u52A8\u89E6\u53D1\u4FEE\u590D\u5FAA\u73AF\uFF1A\n * CLI \u81EA\u52A8\u5206\u6790\u9519\u8BEF\u539F\u56E0\n * CLI \u81EA\u52A8\u751F\u6210\u4FEE\u590D\u65B9\u6848\u5E76\u6267\u884C\n * \u91CD\u65B0\u9A8C\u8BC1\uFF08\u6700\u591A 3 \u6B21\u5FAA\u73AF\uFF09\n * \u5FAA\u73AF\u7ED3\u675F\u540E\u4ECD\u672A\u901A\u8FC7\uFF1A\u8F93\u51FA\u9519\u8BEF\u62A5\u544A\uFF0C\u7B49\u5F85\u4EBA\u5DE5\u5E72\u9884\n - \u9A8C\u8BC1\u901A\u8FC7\u540E\uFF0C\u8F93\u51FA\u63D0\u6848\u6458\u8981\n\n10. \u3010\u8F93\u51FA\u63D0\u6848\u6458\u8981\u3011\uFF1A\n \u2022 \u53D8\u66F4\u539F\u56E0\u3001\u5185\u5BB9\u3001\u5F71\u54CD\u8303\u56F4\n \u2022 \u5173\u952E Requirements\n \u2022 \u4EFB\u52A1\u6570\u91CF\u548C Wave \u5206\u5E03\n\n11. \u3010\u9009\u9879\u5F0F\u4EA4\u4E92\u786E\u8BA4\u3011\uFF1A\n \u4F7F\u7528 AskQuestion \u5DE5\u5177\u5F39\u51FA\u786E\u8BA4\u5BF9\u8BDD\u6846\uFF1A\n ```\n \u95EE\u9898: \"\u8BF7\u786E\u8BA4\u662F\u5426\u6279\u51C6\u6B64\u63D0\u6848\uFF1F\"\n \u9009\u9879\uFF1A\n A) \u6279\u51C6\uFF0C\u8FDB\u5165\u5B9E\u65BD\u9636\u6BB5\n B) \u9700\u8981\u4FEE\u6539\u63D0\u6848\u5185\u5BB9\n C) \u6682\u4E0D\u6279\u51C6\uFF0C\u7A0D\u540E\u5904\u7406\n D) \u5176\u4ED6\uFF08\u8BF7\u5728\u540E\u7EED\u8865\u5145\u8BF4\u660E\uFF09\n ```\n\n \u7528\u6237\u9009\u62E9\u5904\u7406\uFF1A\n \u2022 \u9009\u62E9\"\u6279\u51C6\"\uFF1A\u521B\u5EFA `.approved` \u6587\u4EF6\uFF0C\u8FDB\u5165 Apply \u9636\u6BB5\n \u2022 \u9009\u62E9\"\u4FEE\u6539\"\uFF1A\u8FD4\u56DE\u6B65\u9AA4 4 \u4FEE\u6539\u63D0\u6848\u5185\u5BB9\n \u2022 \u9009\u62E9\"\u6682\u4E0D\"\uFF1A\u4FDD\u6301\u63D0\u6848\u72B6\u6001\uFF0C\u7B49\u5F85\u540E\u7EED\u5904\u7406\n \u2022 \u9009\u62E9\"\u5176\u4ED6\"\uFF1A\u7B49\u5F85\u7528\u6237\u8865\u5145\u8BF4\u660E\u540E\u7EE7\u7EED\n\n \u26A0\uFE0F **CHECKPOINT [PLAN-APPROVED]**:\n - \u7528\u6237\u5FC5\u987B\u660E\u786E\u9009\u62E9\"\u6279\u51C6\"\u9009\u9879\u624D\u80FD\u8FDB\u5165 Apply \u9636\u6BB5\n - \u672A\u6279\u51C6\u524D\u7981\u6B62\u4EFB\u4F55\u4EE3\u7801\u4FEE\u6539\u64CD\u4F5C\n - PreToolUse Hook \u4F1A\u963B\u65AD\u672A\u6279\u51C6\u72B6\u6001\u7684 Write/Edit \u64CD\u4F5C\n\n### \u9636\u6BB5 2\uFF1A\u5B9E\u65BD\u53D8\u66F4\n\n**\u524D\u7F6E\u68C0\u67E5**\uFF1A\n- \u26A0\uFE0F **CHECKPOINT [PLAN-APPROVED]**: `.approved` \u6587\u4EF6\u5FC5\u987B\u5B58\u5728\u3002\u672A\u6279\u51C6\u7684\u63D0\u6848\u7981\u6B62\u5B9E\u65BD\u3002\n - PreToolUse Hook \u4F1A\u963B\u65AD\u672A\u6279\u51C6\u72B6\u6001\u7684 Write/Edit \u64CD\u4F5C\n - \u5982\u679C `.approved` \u4E0D\u5B58\u5728\uFF0C\u63D0\u793A\u7528\u6237\u5148\u5B8C\u6210 Proposal \u9636\u6BB5\u7684\u6279\u51C6\u6D41\u7A0B\n\n\u5C06\u8FD9\u4E9B\u6B65\u9AA4\u4F5C\u4E3A\u5F85\u529E\u4E8B\u9879\u8DDF\u8E2A\uFF0C\u9010\u4E00\u5B8C\u6210\u3002\n\n0. **\u68C0\u67E5\u77E5\u8BC6\u5E93\u3001\u52A0\u8F7D\u9879\u76EE\u77E5\u8BC6\u5E76\u9605\u8BFB proposal.md**\uFF1A\n - \u8FD0\u884C `rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/` \u641C\u7D22\u76F8\u5173\u6700\u4F73\u5B9E\u8DF5\u548C\u9677\u9631\n - **\u52A0\u8F7D\u9879\u76EE\u77E5\u8BC6**\uFF1A\u8C03\u7528 `@skill:load-project-knowledge` \u8FDB\u884C\u6E10\u8FDB\u5F0F\u52A0\u8F7D\uFF1A\n * \u8F93\u5165\uFF1Adomain\uFF08\u5F53\u524D\u9879\u76EE\uFF09\u3001keywords\uFF08\u4ECE tasks.md \u63D0\u53D6\uFF09\n * \u83B7\u53D6\uFF1Amatched_services\u3001search_priority\u3001architecture_constraints\n * \u4F7F\u7528\uFF1A\u4EE3\u7801\u5B9A\u4F4D\u4F7F\u7528 search_priority \u9650\u5B9A\u8303\u56F4\uFF0C\u907F\u514D\u5168\u5C40\u68C0\u7D22\u504F\u5DEE\n - \u9605\u8BFB `zhuanspec/project.md` \u4E86\u89E3\u9879\u76EE\u7EA6\u5B9A\uFF08\u63D0\u793A\uFF1A\"\u2713 Loaded project.md\"\uFF09\n - \u9605\u8BFB proposal.md - \u4E86\u89E3\u8981\u6784\u5EFA\u7684\u5185\u5BB9\n1. **\u9605\u8BFB design.md**\uFF08\u5982\u679C\u5B58\u5728\uFF09 - \u5BA1\u67E5\u6280\u672F\u51B3\u7B56\n2. **\u9605\u8BFB tasks.md** - \u83B7\u53D6\u5B9E\u65BD\u6E05\u5355\n3. **\u5224\u65AD\u6267\u884C\u6A21\u5F0F** - \u6839\u636E tasks.md \u5185\u5BB9\u9009\u62E9\u6267\u884C\u7B56\u7565\uFF1A\n - **\u5982\u679C tasks.md \u5305\u542B `@depends` \u4F9D\u8D56\u58F0\u660E**\uFF1A\n \u2192 \u6309 Wave \u5E76\u884C\u6267\u884C\uFF08\u4F7F\u7528 superpowers:subagent-driven-development skill\uFF09\n - **\u5982\u679C tasks.md \u65E0\u4F9D\u8D56\u58F0\u660E**\uFF1A\n \u2192 \u6309\u987A\u5E8F\u6267\u884C\n4. **\u6309\u987A\u5E8F\u5B9E\u65BD\u4EFB\u52A1**\uFF08\u65E0\u4F9D\u8D56\u58F0\u660E\u65F6\uFF09- \u4FDD\u6301\u7F16\u8F91\u6700\u5C0F\u5316\u3002\u5982\u679C\u4EFB\u52A1\u6807\u6CE8\u4E86 `@skill:<skill-name>`\uFF0C\u76F4\u63A5\u8C03\u7528\u5BF9\u5E94 skill\n - **\u9636\u6BB5\u804C\u8D23\u8981\u6C42**\uFF1AApply \u9636\u6BB5\u4E0D\u751F\u6210\u5355\u6D4B\u6587\u4EF6\uFF1B\u5355\u6D4B\u7EDF\u4E00\u5728 Review \u9636\u6BB5\u751F\u6210\u4E0E\u9A8C\u8BC1\u3002\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]`\n7. **\u89E6\u53D1\u5BA1\u67E5\u95E8\u7981** - \u6240\u6709\u4EFB\u52A1\u5B8C\u6210\u540E\u9009\u9879\u5F0F\u63D0\u95EE\u7528\u6237\u662F\u5426\u8FDB\u5165 Review \u9636\u6BB5\uFF0C\u9009\u62E9\u662F\u5219\u6267\u884C `zhuanspec review <change-id>` \u9ED8\u8BA4\u5F53\u524D\u63D0\u6848\n\n\n### \u9636\u6BB5 3\uFF1AReview\n\n**\u68C0\u67E5\u77E5\u8BC6\u5E93\u3001project.md \u5E76\u6267\u884C\u5BA1\u67E5**\uFF1A\n- \u8FD0\u884C `rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/` \u641C\u7D22\u76F8\u5173\u5BA1\u67E5\u6700\u4F73\u5B9E\u8DF5\n- \u9605\u8BFB `zhuanspec/project.md` \u4E86\u89E3\u9879\u76EE\u7EA6\u5B9A\uFF08\u63D0\u793A\uFF1A\"\u2713 Loaded project.md\"\uFF09\n\n\u6267\u884C `zhuanspec review <change-id>`\uFF0C\u542F\u52A8\u4E09\u8F68\u5E76\u884C\u5BA1\u67E5\uFF1A\n\n**\u4E09\u8F68\u5E76\u884C\u673A\u5236**\uFF1A\n- \u4F7F\u7528 Agent \u5DE5\u5177\u542F\u52A8 3 \u4E2A subagent \u5E76\u884C\u6267\u884C\n- **Code Review subagent**\uFF1A\u8C03\u7528 `code-review-expert` skill\n- **Unit Test subagent**\uFF1A\u8C03\u7528 `generate-mockito-unit-test-skill` skill\n- **Spec-Code Consistency subagent**\uFF1A\u6267\u884C\u4E00\u81F4\u6027\u68C0\u67E5\n\n**Subagent \u81EA\u95ED\u73AF**\uFF1A\n- \u6BCF\u4E2A subagent \u5185\u90E8\u72EC\u7ACB\u4FEE\u590D\u5FAA\u73AF\uFF08\u6700\u591A3\u8F6E\uFF09\n- \u53D1\u73B0\u95EE\u9898\u65F6\u7ACB\u5373\u4FEE\u590D\uFF0C\u7136\u540E\u91CD\u65B0\u68C0\u67E5\n- \u8F93\u51FA\u72EC\u7ACB\u62A5\u544A\u6587\u4EF6\uFF1A\n - `code-review-result.json`\n - `unit-test-result.json`\n - `spec-consistency-result.json`\n- \u6C47\u603B\u751F\u6210 `review-report.md`\n\n**\u9A8C\u6536\u6807\u51C6**\uFF1A\n- review passed\n- critical = 0\n- \u5355\u6D4B\u901A\u8FC7\n- \u4E09\u8F68\u5168\u90E8 PASS\n\n### \u9636\u6BB5 4\uFF1A\u5F52\u6863\u53D8\u66F4\n\n**\u524D\u7F6E\u68C0\u67E5**\uFF1A\n- \u26A0\uFE0F **CHECKPOINT [REVIEW-PASSED]**: Review \u9636\u6BB5\u5FC5\u987B\u901A\u8FC7\uFF08\u4E09\u8F68\u5168\u90E8 PASS\uFF09\n - `review-report.md` \u5B58\u5728\u4E14\u663E\u793A passed\n - `code-review-result.json`: critical = 0\n - `unit-test-result.json`: tests passed\n - `spec-consistency-result.json`: passed\n\n**\u6B65\u9AA4**\uFF1A\n0. **\u68C0\u67E5\u77E5\u8BC6\u5E93**\uFF1A\u8FD0\u884C `rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/` \u641C\u7D22\u662F\u5426\u6709\u9700\u8981\u6C89\u6DC0\u7684\u77E5\u8BC6\n1. **\u786E\u5B9A\u53D8\u66F4 ID**\uFF1A\u8FD0\u884C `zhuanspec list` \u786E\u8BA4\u8981\u5F52\u6863\u7684\u53D8\u66F4\n2. **\u9A8C\u8BC1 Review \u95E8\u7981**\uFF1A\u786E\u8BA4\u4E0A\u8FF0\u56DB\u4E2A\u7ED3\u679C\u6587\u4EF6\u5B58\u5728\u4E14\u5168\u90E8\u901A\u8FC7\n3. **\u8FD0\u884C\u5F52\u6863\u547D\u4EE4**\uFF1A\u6267\u884C `zhuanspec archive <id> --yes`\uFF08\u4EC5\u5DE5\u5177\u7C7B\u5DE5\u4F5C\u4F7F\u7528 `--skip-specs`\uFF09\n4. **\u9A8C\u8BC1\u5F52\u6863\u7ED3\u679C**\uFF1A\u8FD0\u884C `zhuanspec validate --strict` \u786E\u8BA4\u901A\u8FC7\n5. **\u77E5\u8BC6\u6C89\u6DC0\uFF08\u624B\u52A8\u8865\u5145\uFF09**\uFF1A\u8C03\u7528 `@skill:zhuanspec:knowledge` \u4ECE\u4F1A\u8BDD\u8BB0\u5FC6\u8865\u5145\u77E5\u8BC6\n - CLI \u5DF2\u81EA\u52A8\u4ECE\u53D8\u66F4\u76EE\u5F55\u63D0\u53D6\u7ED3\u6784\u5316\u77E5\u8BC6\n - AI \u9700\u4ECE\u4F1A\u8BDD\u8865\u5145\u9690\u5F0F\u7EA6\u5B9A\u3001\u8C03\u8BD5\u53D1\u73B0\u7B49\n6. **\u4F1A\u8BDD\u5206\u6790**\uFF1A\u8C03\u7528 `@skill:session-analytics` \u5206\u6790\u4F1A\u8BDD\u6307\u6807\u6570\u636E\n7. **\u8F93\u51FA\u53CD\u9988\u94FE\u63A5**\uFF1A\u544A\u77E5\u7528\u6237\u586B\u5199\u4F7F\u7528\u53CD\u9988\uFF1A\n \uD83D\uDCCB https://doc.weixin.qq.com/forms/AJ4AfQfgAAwACwAAwaVABsCNqDXIKn8sf\n\n## \u6267\u884C\u4EFB\u4F55\u4EFB\u52A1\u4E4B\u524D\n\n**\u77E5\u8BC6\u5E93\u68C0\u67E5\uFF1A**\n- [ ] \u641C\u7D22\u76F8\u5173\u9677\u9631\uFF1A`rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/troubleshooting/`\n- [ ] \u641C\u7D22\u6700\u4F73\u5B9E\u8DF5\uFF1A`rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/best-practices/`\n- [ ] \u9605\u8BFB\u77E5\u8BC6\u7D22\u5F15\uFF1A`cat zhuanspec/knowledge/index.md`\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\u3001\u9879\u76EE\u7ED3\u6784\u548C\u76F8\u5173\u529F\u80FD\u6A21\u5757\uFF08\u6309\u9700\u52A0\u8F7D\uFF09\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- **\u68C0\u67E5\u77E5\u8BC6\u5E93**\uFF1A`rg \"[\u5173\u952E\u8BCD]\" zhuanspec/knowledge/` \u641C\u7D22\u76F8\u5173\u9677\u9631\u548C\u6700\u4F73\u5B9E\u8DF5\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> **\u6838\u5FC3\u539F\u5219**\uFF1A\u9047\u5230\u4EFB\u4F55\u6A21\u7CCA\u70B9\uFF0C\u5FC5\u987B\u6F84\u6E05\u3002\u4E25\u7981\u731C\u6D4B\u3001\u81C6\u6D4B\u3001\u81EA\u884C\u5047\u8BBE\u3002\n\n### \u6F84\u6E05\u95ED\u73AF\u673A\u5236\n\n\u5728\u521B\u5EFA\u4EFB\u4F55\u63D0\u6848\u6587\u4EF6\u4E4B\u524D\uFF0C\u5FC5\u987B\u6267\u884C\u4EE5\u4E0B\u6D41\u7A0B\uFF1A\n\n```\n\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 1. \u67E5\u9605\u73B0\u6709\u6765\u6E90 \u2502\n\u2502 \u2192 \u89C4\u8303\u3001\u9879\u76EE\u7EA6\u5B9A\u3001\u4EE3\u7801\u5E93\u3001\u4E0A\u4E0B\u6587\u6587\u4EF6 \u2502\n\u2502 \u2192 \u5C1D\u8BD5\u4ECE\u8FD9\u4E9B\u6765\u6E90\u786E\u5B9A\u4FE1\u606F \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 2. \u8BC6\u522B\u6A21\u7CCA\u70B9 \u2502\n\u2502 \u2192 \u5206\u6790\u7528\u6237\u8BF7\u6C42\uFF0C\u5217\u51FA\u4E0D\u786E\u5B9A\u7684\u65B9\u9762 \u2502\n\u2502 \u2192 \u6392\u9664\u53EF\u4EE5\u4ECE\u73B0\u6709\u6765\u6E90\u786E\u5B9A\u7684\u65B9\u9762 \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 3. \u5224\u65AD\u63D0\u95EE\u7B56\u7565 \u2502\n\u2502 \u2192 \u5982\u679C\u4ECD\u6709\u6A21\u7CCA\u70B9\uFF1A\u5FC5\u987B\u63D0\u95EE \u2502\n\u2502 \u2192 \u5982\u679C\u5168\u90E8\u660E\u786E\uFF1A\u7EE7\u7EED\u521B\u5EFA \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 4. \u751F\u6210\u6F84\u6E05\u95EE\u9898 \u2502\n\u2502 \u2192 \u4F18\u5148\u68C0\u67E5 superpowers:brainstorming \u662F\u5426\u53EF\u7528 \u2502\n\u2502 \u2192 \u53EF\u7528\uFF1A\u8C03\u7528\u8BE5\u6280\u80FD\u751F\u6210\u9AD8\u8D28\u91CF\u95EE\u9898 \u2502\n\u2502 \u2192 \u4E0D\u53EF\u7528\uFF1A\u76F4\u63A5\u4F7F\u7528 AskUserQuestion \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 5. \u9009\u9879\u5F0F\u4EA4\u4E92 \u2502\n\u2502 \u2192 2-5 \u4E2A\u9884\u8BBE\u9009\u9879 + \"\u5176\u4ED6\"\u515C\u5E95 \u2502\n\u2502 \u2192 \u7B49\u5F85\u7528\u6237\u9009\u62E9 \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 6. \u5904\u7406\"\u5176\u4ED6\"\u9009\u9879 \u2502\n\u2502 \u2192 \u7528\u6237\u9009\u62E9\"\u5176\u4ED6\"\u540E\u9488\u5BF9\u6027\u8FFD\u95EE \u2502\n\u2502 \u2192 \u4ECD\u4F18\u5148\u4F7F\u7528\u9009\u9879\u5F0F \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 7. \u5F00\u59CB\u521B\u5EFA \u2502\n\u2502 \u2192 \u53EA\u6709\u5728\u6240\u6709\u6A21\u7CCA\u70B9\u90FD\u660E\u786E\u540E\u624D\u80FD\u521B\u5EFA\u63D0\u6848 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n### \u63D0\u95EE\u7B56\u7565\u9009\u62E9\n\n| \u6280\u80FD\u53EF\u7528\u6027 | \u63D0\u95EE\u65B9\u5F0F | \u8BF4\u660E |\n|-----------|---------|------|\n| superpowers:brainstorming \u53EF\u7528 | \u8C03\u7528\u6280\u80FD\u751F\u6210\u95EE\u9898 | \u9AD8\u8D28\u91CF\u3001\u7ED3\u6784\u5316\u7684\u6F84\u6E05\u95EE\u9898 |\n| superpowers:brainstorming \u4E0D\u53EF\u7528 | AskUserQuestion \u76F4\u63A5\u63D0\u95EE | \u9009\u9879\u5F0F\u4EA4\u4E92\uFF0C\u7B80\u6D01\u9AD8\u6548 |\n\n### Brainstorming \u8C03\u7528\u8FB9\u754C\n\n**\u9002\u7528\u573A\u666F**\uFF1A\n| \u573A\u666F\u7C7B\u578B | \u8C03\u7528\u65B9\u5F0F | \u8BF4\u660E |\n|----------|---------|------|\n| **\u590D\u6742\u6A21\u7CCA** | superpowers:brainstorming | \u8DE8\u6A21\u5757\u3001\u65B0\u67B6\u6784\u3001\u591A\u65B9\u6848\u9009\u62E9 |\n| **\u7B80\u5355\u6F84\u6E05** | AskUserQuestion \u76F4\u63A5\u63D0\u95EE | \u53C2\u6570\u8C03\u6574\u3001\u8303\u56F4\u8FB9\u754C\u3001\u5355\u4E00\u9009\u62E9 |\n| **\u5DF2\u5B8C\u6574\u9700\u6C42** | \u8DF3\u8FC7\u6F84\u6E05 | \u7528\u6237\u63D0\u4F9B\u5B8C\u6574\u9700\u6C42\u6587\u6863 |\n\n**\u8C03\u7528\u7EA6\u675F**\uFF1A\n- \u4EC5\u4F7F\u7528 brainstorming \u7684**\u6F84\u6E05\u63D0\u95EE\u80FD\u529B**\uFF08\u6B65\u9AA43\uFF1A\u9010\u4E00\u63D0\u95EE\u6F84\u6E05\uFF09\n- **\u4E0D\u8FDB\u5165\u5B8C\u6574\u8BBE\u8BA1\u6D41\u7A0B**\uFF08\u6B65\u9AA44-9\uFF1A\u65B9\u6848\u5BF9\u6BD4\u3001\u8BBE\u8BA1\u6587\u6863\uFF09\n- **\u4E0D\u89E6\u53D1 writing-plans skill**\uFF08\u5C5E\u4E8E Apply \u9636\u6BB5\uFF09\n- \u83B7\u5F97\u6F84\u6E05\u540E\u7ACB\u5373\u8FD4\u56DE ZhuanSpec \u63D0\u6848\u6D41\u7A0B\n\n### \u9009\u9879\u5F0F\u4EA4\u4E92\u683C\u5F0F\n\n**\u5FC5\u987B\u9075\u5B88**\uFF1A\n- \u6BCF\u4E2A\u95EE\u9898\u63D0\u4F9B 2-5 \u4E2A\u9884\u8BBE\u9009\u9879\n- \u672B\u5C3E\u5305\u542B\"\u5176\u4ED6\"\u9009\u9879\u4F5C\u4E3A\u515C\u5E95\n- \u7981\u6B62\u8981\u6C42\u7528\u6237\u624B\u52A8\u8F93\u5165\u5927\u6BB5\u6587\u5B57\n\n**\u793A\u4F8B**\uFF1A\n```json\n{\n \"questions\": [\n {\n \"id\": \"scope\",\n \"prompt\": \"\u60A8\u5E0C\u671B\u6539\u8FDB\u54EA\u4E9B\u65B9\u9762\uFF1F\",\n \"options\": [\n {\"id\": \"security\", \"label\": \"\u5B89\u5168\u6027\"},\n {\"id\": \"ux\", \"label\": \"\u7528\u6237\u4F53\u9A8C\"},\n {\"id\": \"performance\", \"label\": \"\u6027\u80FD\"},\n {\"id\": \"other\", \"label\": \"\u5176\u4ED6\"}\n ],\n \"allow_multiple\": true\n }\n ]\n}\n```\n\n### \u5E38\u89C1\u6A21\u7CCA\u70B9\u6E05\u5355\n\n| \u7C7B\u522B | \u9700\u6F84\u6E05\u7684\u60C5\u51B5 |\n|------|-------------|\n| **\u8303\u56F4** | \u8FB9\u754C\u4E0D\u660E\u786E\uFF08\"\u6539\u8FDB\u6027\u80FD\"\u3001\"\u4F18\u5316\u4EE3\u7801\"\uFF09 |\n| **\u6280\u672F** | \u591A\u79CD\u5B9E\u73B0\u65B9\u5F0F\u4F46\u672A\u6307\u5B9A\u504F\u597D |\n| **\u4F18\u5148\u7EA7** | \u591A\u4E2A\u9700\u6C42\u4F46\u672A\u8BF4\u660E\u987A\u5E8F |\n| **\u9A8C\u6536** | \u4E0D\u6E05\u695A\u5982\u4F55\u5224\u65AD\u5B8C\u6210 |\n| **\u5B9E\u73B0** | \u6570\u636E\u83B7\u53D6\u6765\u6E90\u3001\u670D\u52A1\u5206\u5C42\u3001\u4F9D\u8D56\u5173\u7CFB\u4E0D\u660E\u786E |\n| **\u4F4D\u7F6E** | \u4EE3\u7801\u6539\u52A8\u4F4D\u7F6E\u4E0D\u660E\u786E |\n\n### \u7981\u6B62\u884C\u4E3A\n\n| \u274C \u7981\u6B62 | \u539F\u56E0 |\n|--------|------|\n| \u81EA\u884C\u63A8\u6D4B\u7528\u6237\u610F\u56FE | \u8FDD\u53CD\u4E09\u6761\u94C1\u5F8B |\n| \u8DF3\u8FC7\u6F84\u6E05\u76F4\u63A5\u521B\u5EFA\u6587\u4EF6 | \u8FDD\u53CD No Spec, No Code |\n| \u8981\u6C42\u7528\u6237\u624B\u52A8\u8F93\u5165\u5927\u6BB5\u6587\u5B57 | \u6548\u7387\u4F4E\u3001\u4F53\u9A8C\u5DEE |\n\n---\n\n### \u4E0E\u4E09\u6761\u94C1\u5F8B\u7684\u5173\u7CFB\n\n| \u94C1\u5F8B | \u6F84\u6E05\u5DE5\u4F5C\u6D41\u4F53\u73B0 |\n|------|---------------|\n| **No Spec, No Code** | \u6F84\u6E05\u5B8C\u6210\u540E\u624D\u80FD\u521B\u5EFA\u63D0\u6848 |\n| **Spec is Truth** | \u6F84\u6E05\u7ED3\u679C\u5199\u5165 tasks.md \u7684\"\u6F84\u6E05\u65E5\u5FD7\" |\n| **Reverse Sync** | Apply \u9636\u6BB5\u504F\u79BB\u65F6\u91CD\u65B0\u8FDB\u5165\u6F84\u6E05\u6D41\u7A0B |\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 knowledge/ # \u9879\u76EE\u7EA7\u77E5\u8BC6\u5E93\n\u2502 \u251C\u2500\u2500 index.md # \u77E5\u8BC6\u7D22\u5F15\n\u2502 \u251C\u2500\u2500 troubleshooting/ # \u5E38\u89C1\u95EE\u9898\u4E0E\u9677\u9631\n\u2502 \u251C\u2500\u2500 best-practices/ # \u6700\u4F73\u5B9E\u8DF5\n\u2502 \u2514\u2500\u2500 implicit-conventions/ # \u9690\u5F0F\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\u5FC5\u9009\uFF1B\u77E5\u8BC6\u63D0\u53D6\u6765\u6E90\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. **\u521B\u5EFA design.md\uFF08\u5FC5\u9009\uFF09**\uFF1A\n\u6BCF\u4E2A\u63D0\u6848\u90FD\u5FC5\u987B\u521B\u5EFA `design.md`\uFF0C\u8BB0\u5F55\u6280\u672F\u51B3\u7B56\u548C\u67B6\u6784\u601D\u8003\uFF1A\n\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## \u6700\u4F73\u5B9E\u8DF5\n[\u5B9E\u65BD\u8FC7\u7A0B\u4E2D\u7684\u6700\u4F73\u5B9E\u8DF5\u5EFA\u8BAE]\n\n## \u9690\u5F0F\u7EA6\u5B9A\n[\u56E2\u961F\u7279\u6709\u7684\u9690\u5F0F\u7EA6\u5B9A\u6216\u9ED8\u8BA4\u884C\u4E3A]\n\n## \u8FC1\u79FB\u8BA1\u5212\n[\u6B65\u9AA4\u3001\u56DE\u6EDA]\n\n## \u5F85\u89E3\u51B3\u95EE\u9898\n- [...]\n```\n\n**\u91CD\u8981**\uFF1Adesign.md \u662F\u77E5\u8BC6\u63D0\u53D6\u7684\u4E3B\u8981\u6765\u6E90\uFF0C\u5F52\u6863\u65F6\u4F1A\u81EA\u52A8\u63D0\u53D6\u5176\u4E2D\u7684\"\u51B3\u7B56\"\u3001\"\u6700\u4F73\u5B9E\u8DF5\"\u3001\"\u9690\u5F0F\u7EA6\u5B9A\"\u6C89\u6DC0\u5230\u9879\u76EE\u77E5\u8BC6\u5E93\u3002\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\n## \u4EFB\u52A1\u6267\u884C\u7F16\u6392\n\n\u5F53 apply \u6307\u4EE4\u4E2D\u5305\u542B `<execution_plan>`/task.md\u4E2D\u5305\u542B `@depends` \u65F6\uFF0C\u5FC5\u987B\u6309\u4EE5\u4E0B\u7B56\u7565\u6267\u884C\u4EFB\u52A1\uFF0C\u800C\u975E\u987A\u5E8F\u9010\u4E00\u6267\u884C\u3002\n\n### \u8C03\u5EA6\u89C4\u5219\n\n1. **\u6309 wave \u7F16\u53F7\u4ECE\u5C0F\u5230\u5927**\u4F9D\u6B21\u6267\u884C\uFF0Cwave \u4E4B\u95F4\u4E25\u683C\u4E32\u884C\n2. **\u540C\u4E00 wave \u5185\u7684\u591A\u4E2A task**\uFF1A\u4E3A\u6BCF\u4E2A task \u542F\u52A8\u72EC\u7ACB\u7684 subagent\uFF08Coding \u7C7B\u578B\uFF09\uFF0C\u6240\u6709 subagent \u5E76\u884C\u6267\u884C\n3. **\u7B49\u5F85\u672C wave \u6240\u6709 subagent \u5B8C\u6210\u540E**\uFF0C\u624D\u542F\u52A8\u4E0B\u4E00 wave\n4. \u540C\u4E00 wave \u5185\u4EC5\u6709\u4E00\u4E2A task \u65F6\uFF0C\u542F\u52A8\u5355\u4E2A subagent \u6267\u884C\n5. **\u53C2\u8003 `<scheduling_summary>` \u4E2D\u7684\u5177\u4F53\u8C03\u5EA6\u6307\u4EE4**\uFF0C\u660E\u786E\u6BCF\u4E2A wave \u9700\u8981\u542F\u52A8\u7684 subagent \u6570\u91CF\u548C\u6267\u884C\u65B9\u5F0F\n\n### \u8C03\u5EA6\u6307\u4EE4\u683C\u5F0F\n\n\u6267\u884C\u8BA1\u5212\u7684 `<wave>` \u5143\u7D20\u5305\u542B\u4EE5\u4E0B\u5C5E\u6027\u7528\u4E8E\u6307\u5BFC subagent \u8C03\u5EA6\uFF1A\n- `subagent_count`\uFF1A\u8BE5\u6CE2\u6B21\u9700\u8981\u542F\u52A8\u7684 subagent \u6570\u91CF\uFF08\u7B49\u4E8E wave \u5185\u7684\u4EFB\u52A1\u6570\uFF09\n- `execution_mode`\uFF1A\u6267\u884C\u6A21\u5F0F\uFF0C`parallel`\uFF08\u5E76\u884C\uFF09\u6216 `serial`\uFF08\u4E32\u884C\uFF09\n\n`<scheduling_summary>` \u63D0\u4F9B\u4EBA\u7C7B\u53EF\u8BFB\u7684\u8C03\u5EA6\u6458\u8981\uFF0C\u683C\u5F0F\u5982\u4E0B\uFF1A\n```\nWave 1 \u2192 \u542F\u52A8 1 \u4E2A subagent \u6267\u884C\u8BE5\u6CE2\u6B21\u7684\u5355\u4E2A\u4EFB\u52A1\nWave 2 \u2192 \u542F\u52A8 1 \u4E2A subagent \u6267\u884C\u8BE5\u6CE2\u6B21\u7684\u5355\u4E2A\u4EFB\u52A1\nWave 3 \u2192 \u542F\u52A8 2 \u4E2A subagent \u5E76\u884C\u6267\u884C\u8BE5\u6CE2\u6B21\u7684 2 \u4E2A\u4EFB\u52A1\n```\n\nAI \u52A9\u624B\u5728\u6267\u884C\u65F6**\u5FC5\u987B**\u6309\u7167 `<scheduling_summary>` \u4E2D\u7684\u6307\u4EE4\u542F\u52A8\u5BF9\u5E94\u6570\u91CF\u7684 subagent\u3002\n\n### Subagent \u4E0A\u4E0B\u6587\u9694\u79BB\n\n\u6BCF\u4E2A subagent \u7684 prompt \u4E2D**\u4EC5\u5305\u542B**\uFF1A\n- \u5F53\u524D task \u7684\u63CF\u8FF0\u548C\u9A8C\u6536\u6807\u51C6\n- \u5F53\u524D task \u5173\u8054\u7684 `@skill` \u5185\u5BB9\uFF08\u901A\u8FC7 skill \u540D\u79F0\u89E6\u53D1\u52A0\u8F7D\uFF09\n- \u76F8\u5173\u7684 spec \u6587\u4EF6\u8DEF\u5F84\u548C\u5185\u5BB9\uFF08\u4EC5\u9650\u8BE5 task \u6D89\u53CA\u7684\u90E8\u5206\uFF09\n- \u524D\u5E8F wave \u7684\u5B8C\u6210\u6458\u8981\uFF08\u800C\u975E\u5B8C\u6574\u8F93\u51FA\uFF09\n\n**\u7981\u6B62**\u5411 subagent \u6CE8\u5165\uFF1A\n- \u5176\u4ED6 wave \u7684 task \u8BE6\u60C5\n- \u4E0D\u76F8\u5173\u7684 skill \u5185\u5BB9\n- \u5176\u4ED6 subagent \u7684\u5B8C\u6574\u8F93\u51FA\n\n### \u5B8C\u6210\u540C\u6B65\n\n- \u6BCF\u4E2A subagent \u5B8C\u6210\u540E\uFF0C\u63D0\u53D6\u7B80\u77ED\u7684**\u5B8C\u6210\u6458\u8981**\uFF08\u4FEE\u6539\u4E86\u54EA\u4E9B\u6587\u4EF6\u3001\u5173\u952E\u53D8\u66F4\u70B9\uFF09\n- \u5C06\u6458\u8981\u4F20\u9012\u7ED9\u540E\u7EED wave \u7684 subagent \u4F5C\u4E3A\u4E0A\u4E0B\u6587\n- \u5728 `tasks.md` \u4E2D\u5C06\u5BF9\u5E94\u4EFB\u52A1\u6807\u8BB0\u4E3A `[x]`\n\n### \u964D\u7EA7\u7B56\u7565\n\n\u5F53 AI \u5E73\u53F0\u4E0D\u652F\u6301 subagent \u65F6\uFF0C\u6309\u4EE5\u4E0B\u964D\u7EA7\u7B56\u7565\u6267\u884C\uFF1A\n1. \u4ECD\u6309 wave \u987A\u5E8F\u6267\u884C\u4EFB\u52A1\n2. \u6BCF\u4E2A task \u6267\u884C\u524D\uFF0C\u6E05\u7406\u4E0D\u76F8\u5173\u7684 skill \u4E0A\u4E0B\u6587\n3. \u6BCF\u4E2A task \u6267\u884C\u540E\uFF0C\u4EC5\u4FDD\u7559\u5B8C\u6210\u6458\u8981\uFF0C\u907F\u514D\u4E0A\u4E0B\u6587\u7D2F\u79EF\u81A8\u80C0\n\n---\n\n## Apply \u9636\u6BB5\u4E13\u7528 Agent\n\nApply \u9636\u6BB5\u4F7F\u7528\u4E24\u79CD\u4E13\u7528 Agent \u7C7B\u578B\u6267\u884C\u4EE3\u7801\u5B9E\u65BD\u4EFB\u52A1\uFF0C\u7531\u7F16\u6392 Agent\uFF08\u4E3B Agent\uFF09\u6839\u636E\u4EFB\u52A1\u6807\u6CE8\u9009\u62E9\u3002\n\n**Agent \u5B9A\u4E49\u6587\u4EF6\u8DEF\u5F84**\uFF08\u4F9B Claude/Cursor \u7B49\u5DE5\u5177\u6CE8\u518C\uFF09\uFF1A\n- `agents/zhuanspec/apply-agent.md` - \u666E\u901A\u4EE3\u7801\u5B9E\u65BD Agent\n- `agents/zhuanspec/tdd-apply-agent.md` - TDD \u6A21\u5F0F Agent\n\n### Agent \u7C7B\u578B\u9009\u62E9\u89C4\u5219\n\n| \u6761\u4EF6 | Agent \u7C7B\u578B | \u5B9A\u4E49\u6587\u4EF6 |\n|------|-----------|---------|\n| \u4EFB\u52A1\u65E0 `@test-case` \u6807\u6CE8 | `applyAgent` | `agents/zhuanspec/apply-agent.md` |\n| \u4EFB\u52A1\u6709 `@test-case:TC-XXX` \u6807\u6CE8 | `tddApplyAgent` | `agents/zhuanspec/tdd-apply-agent.md` |\n\n### Agent \u4F7F\u7528\u65B9\u5F0F\n\n\u7F16\u6392 Agent\uFF08\u4E3B Agent\uFF09\u5728 Wave \u5E76\u884C\u6267\u884C\u65F6\uFF1A\n\n1. **\u9009\u62E9 Agent**\uFF1A\u6839\u636E\u4EFB\u52A1\u7684 `@test-case` \u6807\u6CE8\u9009\u62E9\u5BF9\u5E94 Agent \u7C7B\u578B\n2. **\u52A0\u8F7D Agent \u5B9A\u4E49**\uFF1A\u8BFB\u53D6\u5BF9\u5E94 Agent \u5B9A\u4E49\u6587\u4EF6\u83B7\u53D6\u5B8C\u6574\u6307\u4EE4\n3. **\u6CE8\u5165\u4E0A\u4E0B\u6587**\uFF1A\n - \u5F53\u524D task \u7684\u5B8C\u6574\u63CF\u8FF0\n - \u76F8\u5173 spec \u6587\u4EF6\u5185\u5BB9\n - Rules \u548C Knowledge\uFF08\u8E29\u5751\u8B66\u544A\u3001\u6700\u4F73\u5B9E\u8DF5\uFF09\n - \u524D\u5E8F wave \u5B8C\u6210\u6458\u8981\n4. **\u542F\u52A8 Subagent**\uFF1A\u4F7F\u7528 Agent tool \u542F\u52A8 subagent\n5. **\u5904\u7406\u72B6\u6001\u62A5\u544A**\uFF1A\u6839\u636E Agent \u8FD4\u56DE\u7684 Status \u6267\u884C\u540E\u7EED\u64CD\u4F5C\n\n### Rules \u548C Knowledge \u6CE8\u5165\uFF08\u5173\u952E\uFF09\n\n\u7F16\u6392 Agent MUST \u5728\u6BCF\u4E2A subagent prompt \u4E2D\u6CE8\u5165\u4EE5\u4E0B\u4E0A\u4E0B\u6587\uFF1A\n\n**Rules \u52A0\u8F7D**\uFF08\u6839\u636E @skill \u9009\u62E9\u6027\u6CE8\u5165\uFF09\uFF1A\n- `api-design.md` - \u524D\u540E\u7AEF\u63A5\u53E3\u8BBE\u8BA1\u89C4\u8303\uFF08\u6D89\u53CA Controller/API \u65F6\uFF09\n- `dao-standards.md` - Java DAO \u5C42\u89C4\u8303\uFF08\u6D89\u53CA DAO \u65F6\uFF09\n- `coding-standards.md` - KF \u540E\u7AEF\u7F16\u7801\u89C4\u5219\uFF08\u6D89\u53CA Java \u4EE3\u7801\u65F6\uFF09\n- `java-db-schema-standards.md` - MySQL \u6570\u636E\u5E93\u5EFA\u8868\u6539\u8868\u89C4\u8303\n\n**Knowledge \u52A0\u8F7D**\uFF08MUST \u59CB\u7EC8\u6CE8\u5165\uFF09\uFF1A\n- `knowledge/index.md` - \u77E5\u8BC6\u7D22\u5F15\u6458\u8981\n- \u76F8\u5173 `best-practices/` \u5185\u5BB9\uFF08\u6700\u4F73\u5B9E\u8DF5\uFF09\n- \u76F8\u5173 `troubleshooting/` \u5185\u5BB9\uFF08\u8E29\u5751\u8B66\u544A\uFF09\n\n### \u72B6\u6001\u5904\u7406\u7B56\u7565\n\n| Status | \u5904\u7406\u65B9\u5F0F |\n|--------|---------|\n| **DONE** | \u7EE7\u7EED\u4E0B\u4E00\u4EFB\u52A1\uFF0C\u8BB0\u5F55\u5B8C\u6210\u6458\u8981 |\n| **DONE_WITH_CONCERNS** | \u8BC4\u4F30 concerns\uFF0C\u6B63\u786E\u6027\u95EE\u9898\u5148\u4FEE\u590D\uFF0C\u89C2\u5BDF\u6027\u95EE\u9898\u8BB0\u5F55\u540E\u7EE7\u7EED |\n| **BLOCKED** | \u8BC4\u4F30 blocker \u7C7B\u578B\uFF1A\u63D0\u4F9B\u4E0A\u4E0B\u6587/\u6362\u66F4\u5F3A\u6A21\u578B/\u62C6\u5206\u4EFB\u52A1/\u4FEE\u6539\u8BA1\u5212 |\n| **NEEDS_CONTEXT** | \u63D0\u4F9B\u7F3A\u5931\u4FE1\u606F\u5E76\u91CD\u65B0\u542F\u52A8 subagent |\n\n### Subagent \u4E0A\u4E0B\u6587\u9694\u79BB\u89C4\u5219\n\n**\u5FC5\u987B\u6CE8\u5165**\uFF1A\n- \u5F53\u524D task \u7684\u5B8C\u6574\u63CF\u8FF0\u548C\u9A8C\u6536\u6807\u51C6\n- \u5F53\u524D task \u5173\u8054\u7684 `@skill` \u5185\u5BB9\n- \u76F8\u5173\u7684 spec \u6587\u4EF6\u8DEF\u5F84\u548C\u5185\u5BB9\uFF08\u4EC5\u9650\u8BE5 task \u6D89\u53CA\u7684\u90E8\u5206\uFF09\n- \u524D\u5E8F wave \u7684\u5B8C\u6210\u6458\u8981\uFF08\u800C\u975E\u5B8C\u6574\u8F93\u51FA\uFF09\n- Rules \u548C Knowledge \u4E0A\u4E0B\u6587\n\n**\u7981\u6B62\u6CE8\u5165**\uFF1A\n- \u5176\u4ED6 wave \u7684 task \u8BE6\u60C5\n- \u4E0D\u76F8\u5173\u7684 skill \u5185\u5BB9\n- \u5176\u4ED6 subagent \u7684\u5B8C\u6574\u8F93\u51FA\n\n---\n\n### Rules \u548C Knowledge \u6CE8\u5165\u793A\u4F8B\n\n\u7F16\u6392 Agent \u5728\u542F\u52A8 subagent \u65F6\u7684 prompt \u793A\u4F8B\uFF1A\n\n```markdown\n## Rules \u548C Knowledge \u4E0A\u4E0B\u6587\uFF08\u5FC5\u987B\u9075\u5FAA\uFF09\n\n### \u76F8\u5173 Rules\n[\u6839\u636E @skill \u6807\u6CE8\u6CE8\u5165\u5BF9\u5E94 rules \u5185\u5BB9\uFF0C\u5982 api-design.md]\n\n### Knowledge - \u6700\u4F73\u5B9E\u8DF5\n[\u6CE8\u5165 best-practices \u5185\u5BB9]\n\n### Knowledge - \u8E29\u5751\u8B66\u544A\n[\u6CE8\u5165 troubleshooting \u5185\u5BB9\uFF0C\u5982\u6709]\n\n\u26A0\uFE0F **\u91CD\u8981**: \u4EE5\u4E0B rules \u548C knowledge MUST \u5728\u5B9E\u65BD\u8FC7\u7A0B\u4E2D\u9075\u5FAA\u3002\n\u5982\u6709\u4EFB\u4F55\u4E0D\u786E\u5B9A\uFF0C\u62A5\u544A NEEDS_CONTEXT \u72B6\u6001\u3002\n```\n";
2
2
  //# sourceMappingURL=agents-template.d.ts.map
@@ -214,9 +214,11 @@ Wave: W/N | Phase: Apply
214
214
  - **无 case 模式**:普通 spec-driven 工作流,用户未提供测试 case 相关信息
215
215
 
216
216
  **【有 case 模式】**(必须执行以下步骤):
217
- - 获取测试 case 来源:
218
- * 通过 taskId/bicId 获取测试 case(使用 MCP 工具 \`zzcase_get_api_report_queryBaseCase\`)
219
- * 手动录入测试 case
217
+ - **【强制】获取测试 case 的方式**:
218
+ * 如果用户提供的是**链接**(如 zzcase 平台 URL):使用 \`@skill:zzcase-data-fetcher\` skill 直接读取
219
+ * 如果用户提供 **taskId/bicId**:使用 \`@skill:zzcase-data-fetcher\` skill 通过参数获取
220
+ * **禁止**使用 MCP 工具 \`zzcase_get_api_report_queryBaseCase\` 获取测试 case
221
+ * 或手动录入测试 case
220
222
  - **【强制】创建 test-cases.md 文件**:
221
223
  * 使用 \`getTestCasesTemplate\` 模板(从 \`src/core/templates/index.ts\` 导出)
222
224
  * 文件路径:\`changes/<change-id>/test-cases.md\`
@@ -306,6 +308,7 @@ Wave: W/N | Phase: Apply
306
308
  - **阶段职责要求**:Apply 阶段不生成单测文件;单测统一在 Review 阶段生成与验证。
307
309
  5. **确认完成** - 在更新状态之前确保 \`tasks.md\` 中的每个项目都已完成
308
310
  6. **更新清单** - 所有工作完成后,将每个任务设置为 \`- [x]\`
311
+ 7. **触发审查门禁** - 所有任务完成后选项式提问用户是否进入 Review 阶段,选择是则执行 \`zhuanspec review <change-id>\` 默认当前提案
309
312
 
310
313
 
311
314
  ### 阶段 3:Review
@@ -143,7 +143,10 @@ const proposalSteps = `**步骤**
143
143
  - 用户选择处理:
144
144
  * 选择"提供测试 case":
145
145
  - 启用 **TDD 模式**:先获取测试 case,再基于 case 设计 spec 和任务
146
- - 通过 taskId/bicId 获取测试 case(使用 MCP 工具 \`zzcase_get_api_report_queryBaseCase\`)
146
+ - **【强制】获取测试 case 的方式**:
147
+ * 如果用户提供的是**链接**(如 zzcase 平台 URL):使用 \`@skill:zzcase-data-fetcher\` skill 直接读取
148
+ * 如果用户提供 **taskId/bicId**:使用 \`@skill:zzcase-data-fetcher\` skill 通过参数获取
149
+ * **禁止**使用 MCP 工具 \`zzcase_get_api_report_queryBaseCase\` 获取测试 case
147
150
  - 或手动录入测试 case
148
151
  - **【强制】创建 test-cases.md 文件**:
149
152
  * 使用 \`getTestCasesTemplate\` 模板(从 \`src/core/templates/index.ts\` 导出)
@@ -243,11 +246,8 @@ const applySteps = `**步骤**
243
246
  - **DONE_WITH_CONCERNS**:记录 concerns 并评估是否需要修复
244
247
  - **BLOCKED**:评估 blocker 类型并决定处理策略(提供上下文/换更强模型/拆分任务)
245
248
  - **NEEDS_CONTEXT**:提供缺失信息并重新启动 subagent
246
- 7. **代码审查**(必选) - 必须执行 \`zhuanspec review <change-id>\`,并确认三项门禁全部通过后才可归档:
247
- - 代码审查通过(Critical=0)
248
- - 单测生成与验证通过
249
- - Spec-Code consistency 通过
250
- 8. 需要额外上下文时,参考 \`zhuanspec list\` 或 \`zhuanspec show <item>\`。`;
249
+ 8. 需要额外上下文时,参考 \`zhuanspec list\` \`zhuanspec show <item>\`。
250
+ 9. **触发审查门禁** - 所有任务完成后选项式提问用户是否进入 Review 阶段,选择是则执行 \`zhuanspec review <change-id>\` 默认当前提案 必须!!`;
251
251
  const applyGuardrails = `${baseGuardrails}\n- **Wave 并行执行**:当 tasks.md 包含 \`@depends\` 时,按 Wave 编号串行执行,Wave 内任务通过 Agent tool 并行启动 subagent。
252
252
  - **Agent 类型选择**:根据任务 \`@test-case\` 标注选择 subagent 类型:
253
253
  * 无 \`@test-case\` 标注 → \`applyAgent\`(普通模式,单测在 Review 阶段)
@@ -119,11 +119,6 @@ Wave assignment logic:
119
119
  - 示例:退货退款 > 创建售后 > 三选一页面 > 组装机 > 退货退款 > 点击后,显示组装机弹窗
120
120
  -->
121
121
 
122
- ## Quality Gates
123
-
124
- - [ ] Apply 全部任务完成后自动执行一次 \`zhuanspec review <change-id>\`(如失败则手动补执行)
125
- - [ ] **测试 case 已设计并覆盖所有关键场景**
126
-
127
122
  ## Workflow Diagram
128
123
 
129
124
  <!-- Auto-generated by zhuanspec validate --strict -->
@@ -171,11 +166,6 @@ Status: COMPLETED
171
166
  Wave assignment logic:
172
167
  - Wave 1: No dependencies
173
168
  - Wave 2: Depends on Wave 1
174
-
175
- ## Quality Gates
176
-
177
- - [ ] Apply 全部任务完成后自动执行一次 \`zhuanspec review <change-id>\`(如失败则手动补执行)
178
- - [ ] 单元测试命令已执行且测试通过(如 \`npm test\` / \`mvn test\`)
179
169
  `;
180
170
  }
181
171
  export default {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhuan-ai/zhuanspec",
3
- "version": "2.4.8",
3
+ "version": "2.5.0",
4
4
  "description": "AI-native system for spec-driven development",
5
5
  "keywords": [
6
6
  "zhuanspec",
@@ -39,6 +39,26 @@
39
39
  "!dist/**/__tests__",
40
40
  "!dist/**/*.map"
41
41
  ],
42
+ "scripts": {
43
+ "lint": "eslint src/",
44
+ "build": "node build.js",
45
+ "dev": "tsc --watch",
46
+ "dev:cli": "pnpm build && node bin/zhuanspec.js",
47
+ "test": "vitest run",
48
+ "test:watch": "vitest",
49
+ "test:ui": "vitest --ui",
50
+ "test:coverage": "vitest --coverage",
51
+ "test:postinstall": "node scripts/postinstall.js",
52
+ "prepare": "npm run build",
53
+ "prepublishOnly": "npm run build",
54
+ "postinstall": "node scripts/postinstall.js",
55
+ "check:pack-version": "node scripts/pack-version-check.mjs",
56
+ "diagnose:cursor": "node scripts/diagnose-cursor-commands.js",
57
+ "release": "pnpm run release:ci",
58
+ "release:ci": "pnpm run check:pack-version && pnpm exec changeset publish",
59
+ "release:local": "pnpm exec changeset version && pnpm run check:pack-version && pnpm exec changeset publish",
60
+ "changeset": "changeset"
61
+ },
42
62
  "engines": {
43
63
  "node": ">=20.19.0"
44
64
  },
@@ -60,23 +80,5 @@
60
80
  "ora": "^8.2.0",
61
81
  "yaml": "^2.8.2",
62
82
  "zod": "^4.0.17"
63
- },
64
- "scripts": {
65
- "lint": "eslint src/",
66
- "build": "node build.js",
67
- "dev": "tsc --watch",
68
- "dev:cli": "pnpm build && node bin/zhuanspec.js",
69
- "test": "vitest run",
70
- "test:watch": "vitest",
71
- "test:ui": "vitest --ui",
72
- "test:coverage": "vitest --coverage",
73
- "test:postinstall": "node scripts/postinstall.js",
74
- "postinstall": "node scripts/postinstall.js",
75
- "check:pack-version": "node scripts/pack-version-check.mjs",
76
- "diagnose:cursor": "node scripts/diagnose-cursor-commands.js",
77
- "release": "pnpm run release:ci",
78
- "release:ci": "pnpm run check:pack-version && pnpm exec changeset publish",
79
- "release:local": "pnpm exec changeset version && pnpm run check:pack-version && pnpm exec changeset publish",
80
- "changeset": "changeset"
81
83
  }
82
- }
84
+ }