openspec-mcp 0.3.4 → 0.3.6

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.
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Revision Tools
3
+ * 设计变更记录工具
4
+ */
5
+ import { z } from 'zod';
6
+ export function registerRevisionTools(server, manager) {
7
+ /**
8
+ * 记录设计变更
9
+ * AI 在修复 bug 或调整设计时应调用此工具
10
+ */
11
+ server.registerTool('openspec_record_revision', {
12
+ description: 'Record a design revision when fixing bugs or adjusting design that deviates from the original proposal/design. Call this when your changes affect the documented design.',
13
+ inputSchema: {
14
+ changeId: z.string().describe('Change ID'),
15
+ description: z.string().describe('Description of the design change (e.g., "Simplified approval states from 6 to 5")'),
16
+ reason: z.string().optional().describe('Reason for the change (e.g., "UI was too complex")'),
17
+ },
18
+ }, async ({ changeId, description, reason }) => {
19
+ try {
20
+ const revision = await manager.recordRevision(changeId, description, { reason });
21
+ return {
22
+ content: [
23
+ {
24
+ type: 'text',
25
+ text: `✅ Revision recorded for "${changeId}"\n\n**ID**: ${revision.id}\n**Description**: ${revision.description}\n**Reason**: ${revision.reason || '-'}\n**Time**: ${revision.createdAt}`,
26
+ },
27
+ ],
28
+ };
29
+ }
30
+ catch (error) {
31
+ return {
32
+ content: [
33
+ {
34
+ type: 'text',
35
+ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,
36
+ },
37
+ ],
38
+ isError: true,
39
+ };
40
+ }
41
+ });
42
+ /**
43
+ * 列出设计变更
44
+ */
45
+ server.registerTool('openspec_list_revisions', {
46
+ description: 'List all recorded design revisions for a change',
47
+ inputSchema: {
48
+ changeId: z.string().describe('Change ID'),
49
+ },
50
+ }, async ({ changeId }) => {
51
+ try {
52
+ const revisions = await manager.listRevisions(changeId);
53
+ if (revisions.length === 0) {
54
+ return {
55
+ content: [
56
+ {
57
+ type: 'text',
58
+ text: `No revisions recorded for "${changeId}".`,
59
+ },
60
+ ],
61
+ };
62
+ }
63
+ let output = `## Revisions for "${changeId}"\n\n`;
64
+ output += `Total: ${revisions.length}\n\n`;
65
+ output += '| Date | Description | Reason |\n';
66
+ output += '|------|-------------|--------|\n';
67
+ for (const rev of revisions) {
68
+ const date = rev.createdAt.slice(0, 10);
69
+ output += `| ${date} | ${rev.description} | ${rev.reason || '-'} |\n`;
70
+ }
71
+ return {
72
+ content: [{ type: 'text', text: output }],
73
+ };
74
+ }
75
+ catch (error) {
76
+ return {
77
+ content: [
78
+ {
79
+ type: 'text',
80
+ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,
81
+ },
82
+ ],
83
+ isError: true,
84
+ };
85
+ }
86
+ });
87
+ /**
88
+ * 同步变更到文档
89
+ */
90
+ server.registerTool('openspec_sync_revisions', {
91
+ description: 'Sync recorded revisions to design.md or proposal.md before archiving',
92
+ inputSchema: {
93
+ changeId: z.string().describe('Change ID'),
94
+ },
95
+ }, async ({ changeId }) => {
96
+ try {
97
+ const result = await manager.syncToDocument(changeId);
98
+ if (result.count === 0) {
99
+ return {
100
+ content: [
101
+ {
102
+ type: 'text',
103
+ text: `No revisions to sync for "${changeId}".`,
104
+ },
105
+ ],
106
+ };
107
+ }
108
+ return {
109
+ content: [
110
+ {
111
+ type: 'text',
112
+ text: `✅ Synced ${result.count} revision(s) to ${result.targetFile}`,
113
+ },
114
+ ],
115
+ };
116
+ }
117
+ catch (error) {
118
+ return {
119
+ content: [
120
+ {
121
+ type: 'text',
122
+ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,
123
+ },
124
+ ],
125
+ isError: true,
126
+ };
127
+ }
128
+ });
129
+ }
130
+ //# sourceMappingURL=revision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revision.js","sourceRoot":"","sources":["../../../src/server/tools/revision.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openspec-mcp",
3
- "version": "0.3.4",
3
+ "version": "0.3.6",
4
4
  "description": "MCP server for OpenSpec - spec-driven development with real-time dashboard and approval workflow",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",