openspec-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +205 -0
  3. package/README.zh.md +205 -0
  4. package/dist/api/routes/approvals.d.ts +7 -0
  5. package/dist/api/routes/approvals.d.ts.map +1 -0
  6. package/dist/api/routes/approvals.js +99 -0
  7. package/dist/api/routes/approvals.js.map +1 -0
  8. package/dist/api/routes/changes.d.ts +7 -0
  9. package/dist/api/routes/changes.d.ts.map +1 -0
  10. package/dist/api/routes/changes.js +55 -0
  11. package/dist/api/routes/changes.js.map +1 -0
  12. package/dist/api/routes/specs.d.ts +7 -0
  13. package/dist/api/routes/specs.d.ts.map +1 -0
  14. package/dist/api/routes/specs.js +34 -0
  15. package/dist/api/routes/specs.js.map +1 -0
  16. package/dist/api/routes/tasks.d.ts +7 -0
  17. package/dist/api/routes/tasks.d.ts.map +1 -0
  18. package/dist/api/routes/tasks.js +61 -0
  19. package/dist/api/routes/tasks.js.map +1 -0
  20. package/dist/api/server.d.ts +23 -0
  21. package/dist/api/server.d.ts.map +1 -0
  22. package/dist/api/server.js +142 -0
  23. package/dist/api/server.js.map +1 -0
  24. package/dist/core/approval-manager.d.ts +69 -0
  25. package/dist/core/approval-manager.d.ts.map +1 -0
  26. package/dist/core/approval-manager.js +268 -0
  27. package/dist/core/approval-manager.js.map +1 -0
  28. package/dist/core/file-watcher.d.ts +38 -0
  29. package/dist/core/file-watcher.d.ts.map +1 -0
  30. package/dist/core/file-watcher.js +128 -0
  31. package/dist/core/file-watcher.js.map +1 -0
  32. package/dist/core/openspec-cli.d.ts +94 -0
  33. package/dist/core/openspec-cli.d.ts.map +1 -0
  34. package/dist/core/openspec-cli.js +436 -0
  35. package/dist/core/openspec-cli.js.map +1 -0
  36. package/dist/core/task-parser.d.ts +48 -0
  37. package/dist/core/task-parser.d.ts.map +1 -0
  38. package/dist/core/task-parser.js +172 -0
  39. package/dist/core/task-parser.js.map +1 -0
  40. package/dist/index.d.ts +9 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +95 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/server/tools/approval.d.ts +8 -0
  45. package/dist/server/tools/approval.d.ts.map +1 -0
  46. package/dist/server/tools/approval.js +197 -0
  47. package/dist/server/tools/approval.js.map +1 -0
  48. package/dist/server/tools/archive.d.ts +8 -0
  49. package/dist/server/tools/archive.d.ts.map +1 -0
  50. package/dist/server/tools/archive.js +41 -0
  51. package/dist/server/tools/archive.js.map +1 -0
  52. package/dist/server/tools/guides.d.ts +8 -0
  53. package/dist/server/tools/guides.d.ts.map +1 -0
  54. package/dist/server/tools/guides.js +25 -0
  55. package/dist/server/tools/guides.js.map +1 -0
  56. package/dist/server/tools/management.d.ts +8 -0
  57. package/dist/server/tools/management.d.ts.map +1 -0
  58. package/dist/server/tools/management.js +96 -0
  59. package/dist/server/tools/management.js.map +1 -0
  60. package/dist/server/tools/tasks.d.ts +8 -0
  61. package/dist/server/tools/tasks.d.ts.map +1 -0
  62. package/dist/server/tools/tasks.js +124 -0
  63. package/dist/server/tools/tasks.js.map +1 -0
  64. package/dist/server/tools/validation.d.ts +8 -0
  65. package/dist/server/tools/validation.d.ts.map +1 -0
  66. package/dist/server/tools/validation.js +119 -0
  67. package/dist/server/tools/validation.js.map +1 -0
  68. package/dist/types/openspec.d.ts +141 -0
  69. package/dist/types/openspec.d.ts.map +1 -0
  70. package/dist/types/openspec.js +5 -0
  71. package/dist/types/openspec.js.map +1 -0
  72. package/package.json +58 -0
  73. package/web/dist/assets/index--LppUKpS.js +67 -0
  74. package/web/dist/assets/index-DdJQfs9Z.css +1 -0
  75. package/web/dist/index.html +14 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../../src/server/tools/archive.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,GAAgB;IACtE;;OAEG;IACH,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,qCAAqC,EACrC;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACrD,SAAS,EAAE,CAAC;aACT,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,0CAA0C,CAAC;KACxD,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;QAChC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAEhE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,mCAAmC,QAAQ,oBAAoB,MAAM,CAAC,YAAY,EAAE;qBAC3F;iBACF;aACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,+BAA+B,QAAQ,cAAc,MAAM,CAAC,KAAK,EAAE;qBAC1E;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Guides 类工具
3
+ * 提供 OpenSpec 使用指南和项目上下文
4
+ */
5
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
+ import { OpenSpecCli } from '../../core/openspec-cli.js';
7
+ export declare function registerGuidesTools(server: McpServer, cli: OpenSpecCli): void;
8
+ //# sourceMappingURL=guides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guides.d.ts","sourceRoot":"","sources":["../../../src/server/tools/guides.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CA8B7E"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Guides 类工具
3
+ * 提供 OpenSpec 使用指南和项目上下文
4
+ */
5
+ export function registerGuidesTools(server, cli) {
6
+ /**
7
+ * 获取 OpenSpec 使用指南 (AGENTS.md)
8
+ */
9
+ server.tool('openspec_get_instructions', 'Get OpenSpec usage instructions from AGENTS.md', {}, async () => {
10
+ const content = await cli.getInstructions();
11
+ return {
12
+ content: [{ type: 'text', text: content }],
13
+ };
14
+ });
15
+ /**
16
+ * 获取项目上下文 (project.md)
17
+ */
18
+ server.tool('openspec_get_project_context', 'Get project context from project.md', {}, async () => {
19
+ const content = await cli.getProjectContext();
20
+ return {
21
+ content: [{ type: 'text', text: content }],
22
+ };
23
+ });
24
+ }
25
+ //# sourceMappingURL=guides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guides.js","sourceRoot":"","sources":["../../../src/server/tools/guides.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,GAAgB;IACrE;;OAEG;IACH,MAAM,CAAC,IAAI,CACT,2BAA2B,EAC3B,gDAAgD,EAChD,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,eAAe,EAAE,CAAC;QAC5C,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;SAC3C,CAAC;IACJ,CAAC,CACF,CAAC;IAEF;;OAEG;IACH,MAAM,CAAC,IAAI,CACT,8BAA8B,EAC9B,qCAAqC,EACrC,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAC9C,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;SAC3C,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Management 类工具
3
+ * 列表和查看规格、变更
4
+ */
5
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
+ import { OpenSpecCli } from '../../core/openspec-cli.js';
7
+ export declare function registerManagementTools(server: McpServer, cli: OpenSpecCli): void;
8
+ //# sourceMappingURL=management.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"management.d.ts","sourceRoot":"","sources":["../../../src/server/tools/management.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAoHjF"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Management 类工具
3
+ * 列表和查看规格、变更
4
+ */
5
+ import { z } from 'zod';
6
+ export function registerManagementTools(server, cli) {
7
+ /**
8
+ * 列出所有变更
9
+ */
10
+ server.tool('openspec_list_changes', 'List all OpenSpec change proposals', {
11
+ includeArchived: z
12
+ .boolean()
13
+ .optional()
14
+ .describe('Include archived changes in the list'),
15
+ }, async ({ includeArchived }) => {
16
+ const changes = await cli.listChanges({ includeArchived });
17
+ return {
18
+ content: [
19
+ {
20
+ type: 'text',
21
+ text: JSON.stringify(changes, null, 2),
22
+ },
23
+ ],
24
+ };
25
+ });
26
+ /**
27
+ * 列出所有规格
28
+ */
29
+ server.tool('openspec_list_specs', 'List all OpenSpec specifications', {}, async () => {
30
+ const specs = await cli.listSpecs();
31
+ return {
32
+ content: [
33
+ {
34
+ type: 'text',
35
+ text: JSON.stringify(specs, null, 2),
36
+ },
37
+ ],
38
+ };
39
+ });
40
+ /**
41
+ * 显示变更详情
42
+ */
43
+ server.tool('openspec_show_change', 'Show details of a specific change proposal', {
44
+ changeId: z.string().describe('Change ID (e.g., add-lite-effect-trial-binding)'),
45
+ deltasOnly: z.boolean().optional().describe('Show only delta specs'),
46
+ }, async ({ changeId, deltasOnly }) => {
47
+ const change = await cli.showChange(changeId, { deltasOnly });
48
+ if (!change) {
49
+ return {
50
+ content: [
51
+ {
52
+ type: 'text',
53
+ text: `Change not found: ${changeId}`,
54
+ },
55
+ ],
56
+ isError: true,
57
+ };
58
+ }
59
+ return {
60
+ content: [
61
+ {
62
+ type: 'text',
63
+ text: JSON.stringify(change, null, 2),
64
+ },
65
+ ],
66
+ };
67
+ });
68
+ /**
69
+ * 显示规格详情
70
+ */
71
+ server.tool('openspec_show_spec', 'Show details of a specific specification', {
72
+ specId: z.string().describe('Spec ID (e.g., offline-message)'),
73
+ }, async ({ specId }) => {
74
+ const spec = await cli.showSpec(specId);
75
+ if (!spec) {
76
+ return {
77
+ content: [
78
+ {
79
+ type: 'text',
80
+ text: `Spec not found: ${specId}`,
81
+ },
82
+ ],
83
+ isError: true,
84
+ };
85
+ }
86
+ return {
87
+ content: [
88
+ {
89
+ type: 'text',
90
+ text: JSON.stringify(spec, null, 2),
91
+ },
92
+ ],
93
+ };
94
+ });
95
+ }
96
+ //# sourceMappingURL=management.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"management.js","sourceRoot":"","sources":["../../../src/server/tools/management.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tasks 类工具
3
+ * 任务追踪和进度管理
4
+ */
5
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
+ import { OpenSpecCli } from '../../core/openspec-cli.js';
7
+ export declare function registerTasksTools(server: McpServer, cli: OpenSpecCli): void;
8
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../src/server/tools/tasks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAGzD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CA6I5E"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Tasks 类工具
3
+ * 任务追踪和进度管理
4
+ */
5
+ import { z } from 'zod';
6
+ export function registerTasksTools(server, cli) {
7
+ /**
8
+ * 获取变更的任务列表和进度
9
+ */
10
+ server.tool('openspec_get_tasks', 'Get tasks and progress for a change', {
11
+ changeId: z.string().describe('Change ID'),
12
+ }, async ({ changeId }) => {
13
+ const { tasks, progress } = await cli.getTasks(changeId);
14
+ // 格式化输出
15
+ let text = `Tasks for: ${changeId}\n`;
16
+ text += `========================\n\n`;
17
+ text += `Progress: ${progress.percentage}% (${progress.completed}/${progress.total})\n`;
18
+ text += ` ✅ Completed: ${progress.completed}\n`;
19
+ text += ` 🔄 In Progress: ${progress.inProgress}\n`;
20
+ text += ` ⏳ Pending: ${progress.pending}\n\n`;
21
+ if (tasks.length > 0) {
22
+ text += `Tasks:\n`;
23
+ let currentSection = '';
24
+ for (const task of tasks) {
25
+ if (task.section !== currentSection) {
26
+ currentSection = task.section;
27
+ text += `\n### ${currentSection}\n`;
28
+ }
29
+ const statusIcon = task.status === 'done' ? '✅' : task.status === 'in_progress' ? '🔄' : '⏳';
30
+ text += `${statusIcon} [${task.id}] ${task.title}\n`;
31
+ }
32
+ }
33
+ else {
34
+ text += `No tasks found.\n`;
35
+ }
36
+ return {
37
+ content: [{ type: 'text', text }],
38
+ };
39
+ });
40
+ /**
41
+ * 更新任务状态
42
+ */
43
+ server.tool('openspec_update_task', 'Update task status', {
44
+ changeId: z.string().describe('Change ID'),
45
+ taskId: z.string().describe('Task ID (e.g., 1.1, 2.3)'),
46
+ status: z
47
+ .enum(['pending', 'in_progress', 'done'])
48
+ .describe('New status'),
49
+ }, async ({ changeId, taskId, status }) => {
50
+ const result = await cli.updateTaskStatus(changeId, taskId, status);
51
+ if (result.success) {
52
+ const statusIcon = status === 'done' ? '✅' : status === 'in_progress' ? '🔄' : '⏳';
53
+ return {
54
+ content: [
55
+ {
56
+ type: 'text',
57
+ text: `${statusIcon} Task ${taskId} updated to: ${status}`,
58
+ },
59
+ ],
60
+ };
61
+ }
62
+ else {
63
+ return {
64
+ content: [
65
+ {
66
+ type: 'text',
67
+ text: `❌ Failed to update task: ${result.error}`,
68
+ },
69
+ ],
70
+ isError: true,
71
+ };
72
+ }
73
+ });
74
+ /**
75
+ * 获取所有变更的进度汇总
76
+ */
77
+ server.tool('openspec_get_progress_summary', 'Get progress summary for all changes', {}, async () => {
78
+ const changes = await cli.listChanges();
79
+ const summaries = [];
80
+ for (const change of changes) {
81
+ const { progress } = await cli.getTasks(change.id);
82
+ summaries.push({
83
+ changeId: change.id,
84
+ title: change.title,
85
+ progress,
86
+ });
87
+ }
88
+ // 格式化输出
89
+ let text = `Progress Summary\n`;
90
+ text += `================\n\n`;
91
+ if (summaries.length === 0) {
92
+ text += `No active changes found.\n`;
93
+ }
94
+ else {
95
+ // 按进度排序
96
+ summaries.sort((a, b) => b.progress.percentage - a.progress.percentage);
97
+ for (const summary of summaries) {
98
+ const bar = renderProgressBar(summary.progress.percentage);
99
+ text += `${summary.title}\n`;
100
+ text += ` ${bar} ${summary.progress.percentage}%\n`;
101
+ text += ` (${summary.progress.completed}/${summary.progress.total} tasks)\n\n`;
102
+ }
103
+ // 总体统计
104
+ const totalTasks = summaries.reduce((sum, s) => sum + s.progress.total, 0);
105
+ const completedTasks = summaries.reduce((sum, s) => sum + s.progress.completed, 0);
106
+ const overallPercentage = totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0;
107
+ text += `---\n`;
108
+ text += `Overall: ${completedTasks}/${totalTasks} tasks (${overallPercentage}%)\n`;
109
+ }
110
+ return {
111
+ content: [{ type: 'text', text }],
112
+ };
113
+ });
114
+ }
115
+ /**
116
+ * 渲染进度条
117
+ */
118
+ function renderProgressBar(percentage) {
119
+ const total = 20;
120
+ const filled = Math.round((percentage / 100) * total);
121
+ const empty = total - filled;
122
+ return '[' + '█'.repeat(filled) + '░'.repeat(empty) + ']';
123
+ }
124
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/server/tools/tasks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,GAAgB;IACpE;;OAEG;IACH,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,qCAAqC,EACrC;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;KAC3C,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEzD,QAAQ;QACR,IAAI,IAAI,GAAG,cAAc,QAAQ,IAAI,CAAC;QACtC,IAAI,IAAI,8BAA8B,CAAC;QACvC,IAAI,IAAI,aAAa,QAAQ,CAAC,UAAU,MAAM,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,KAAK,KAAK,CAAC;QACxF,IAAI,IAAI,kBAAkB,QAAQ,CAAC,SAAS,IAAI,CAAC;QACjD,IAAI,IAAI,qBAAqB,QAAQ,CAAC,UAAU,IAAI,CAAC;QACrD,IAAI,IAAI,gBAAgB,QAAQ,CAAC,OAAO,MAAM,CAAC;QAE/C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,IAAI,UAAU,CAAC;YACnB,IAAI,cAAc,GAAG,EAAE,CAAC;YAExB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;oBACpC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC;oBAC9B,IAAI,IAAI,SAAS,cAAc,IAAI,CAAC;gBACtC,CAAC;gBAED,MAAM,UAAU,GACd,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC5E,IAAI,IAAI,GAAG,UAAU,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC;YACvD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,mBAAmB,CAAC;QAC9B,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAClC,CAAC;IACJ,CAAC,CACF,CAAC;IAEF;;OAEG;IACH,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,oBAAoB,EACpB;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC1C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACvD,MAAM,EAAE,CAAC;aACN,IAAI,CAAC,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;aACxC,QAAQ,CAAC,YAAY,CAAC;KAC1B,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAEpE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,UAAU,GACd,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YAClE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,GAAG,UAAU,SAAS,MAAM,gBAAgB,MAAM,EAAE;qBAC3D;iBACF;aACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,4BAA4B,MAAM,CAAC,KAAK,EAAE;qBACjD;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF;;OAEG;IACH,MAAM,CAAC,IAAI,CACT,+BAA+B,EAC/B,sCAAsC,EACtC,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,SAAS,GAAsB,EAAE,CAAC;QAExC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnD,SAAS,CAAC,IAAI,CAAC;gBACb,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;QAED,QAAQ;QACR,IAAI,IAAI,GAAG,oBAAoB,CAAC;QAChC,IAAI,IAAI,sBAAsB,CAAC;QAE/B,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,IAAI,4BAA4B,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,QAAQ;YACR,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAExE,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;gBAChC,MAAM,GAAG,GAAG,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAC3D,IAAI,IAAI,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC;gBAC7B,IAAI,IAAI,KAAK,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,KAAK,CAAC;gBACrD,IAAI,IAAI,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,aAAa,CAAC;YAClF,CAAC;YAED,OAAO;YACP,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC3E,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CACrC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,SAAS,EACtC,CAAC,CACF,CAAC;YACF,MAAM,iBAAiB,GACrB,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAEvE,IAAI,IAAI,OAAO,CAAC;YAChB,IAAI,IAAI,YAAY,cAAc,IAAI,UAAU,WAAW,iBAAiB,MAAM,CAAC;QACrF,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAClC,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,UAAkB;IAC3C,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC7B,OAAO,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Validation 类工具
3
+ * 验证规格和变更
4
+ */
5
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
+ import { OpenSpecCli } from '../../core/openspec-cli.js';
7
+ export declare function registerValidationTools(server: McpServer, cli: OpenSpecCli): void;
8
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/server/tools/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CA6IjF"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Validation 类工具
3
+ * 验证规格和变更
4
+ */
5
+ import { z } from 'zod';
6
+ export function registerValidationTools(server, cli) {
7
+ /**
8
+ * 验证单个变更
9
+ */
10
+ server.tool('openspec_validate_change', 'Validate a change proposal', {
11
+ changeId: z.string().describe('Change ID to validate'),
12
+ strict: z
13
+ .boolean()
14
+ .optional()
15
+ .describe('Use strict validation mode'),
16
+ }, async ({ changeId, strict }) => {
17
+ const result = await cli.validateChange(changeId, { strict });
18
+ const statusText = result.valid ? '✅ Valid' : '❌ Invalid';
19
+ let text = `${statusText}\n\nChange: ${changeId}\n`;
20
+ if (result.errors.length > 0) {
21
+ text += '\nErrors:\n';
22
+ for (const error of result.errors) {
23
+ const prefix = error.type === 'error' ? '❌' : '⚠️';
24
+ text += `${prefix} ${error.message}\n`;
25
+ if (error.location) {
26
+ text += ` Location: ${error.location}\n`;
27
+ }
28
+ }
29
+ }
30
+ return {
31
+ content: [{ type: 'text', text }],
32
+ };
33
+ });
34
+ /**
35
+ * 验证单个规格
36
+ */
37
+ server.tool('openspec_validate_spec', 'Validate a specification', {
38
+ specId: z.string().describe('Spec ID to validate'),
39
+ strict: z
40
+ .boolean()
41
+ .optional()
42
+ .describe('Use strict validation mode'),
43
+ }, async ({ specId, strict }) => {
44
+ const result = await cli.validateSpec(specId, { strict });
45
+ const statusText = result.valid ? '✅ Valid' : '❌ Invalid';
46
+ let text = `${statusText}\n\nSpec: ${specId}\n`;
47
+ if (result.errors.length > 0) {
48
+ text += '\nErrors:\n';
49
+ for (const error of result.errors) {
50
+ const prefix = error.type === 'error' ? '❌' : '⚠️';
51
+ text += `${prefix} ${error.message}\n`;
52
+ if (error.location) {
53
+ text += ` Location: ${error.location}\n`;
54
+ }
55
+ }
56
+ }
57
+ return {
58
+ content: [{ type: 'text', text }],
59
+ };
60
+ });
61
+ /**
62
+ * 批量验证
63
+ */
64
+ server.tool('openspec_validate_all', 'Validate all changes and/or specs', {
65
+ type: z
66
+ .enum(['changes', 'specs', 'all'])
67
+ .optional()
68
+ .default('all')
69
+ .describe('What to validate: changes, specs, or all'),
70
+ strict: z
71
+ .boolean()
72
+ .optional()
73
+ .describe('Use strict validation mode'),
74
+ }, async ({ type, strict }) => {
75
+ const results = [];
76
+ // 验证变更
77
+ if (type === 'changes' || type === 'all') {
78
+ const changes = await cli.listChanges();
79
+ for (const change of changes) {
80
+ const result = await cli.validateChange(change.id, { strict });
81
+ results.push({
82
+ item: `change:${change.id}`,
83
+ valid: result.valid,
84
+ errorCount: result.errors.length,
85
+ });
86
+ }
87
+ }
88
+ // 验证规格
89
+ if (type === 'specs' || type === 'all') {
90
+ const specs = await cli.listSpecs();
91
+ for (const spec of specs) {
92
+ const result = await cli.validateSpec(spec.id, { strict });
93
+ results.push({
94
+ item: `spec:${spec.id}`,
95
+ valid: result.valid,
96
+ errorCount: result.errors.length,
97
+ });
98
+ }
99
+ }
100
+ // 汇总
101
+ const validCount = results.filter((r) => r.valid).length;
102
+ const invalidCount = results.filter((r) => !r.valid).length;
103
+ let text = `Validation Summary\n`;
104
+ text += `==================\n`;
105
+ text += `✅ Valid: ${validCount}\n`;
106
+ text += `❌ Invalid: ${invalidCount}\n`;
107
+ text += `Total: ${results.length}\n\n`;
108
+ if (invalidCount > 0) {
109
+ text += `Invalid items:\n`;
110
+ for (const r of results.filter((r) => !r.valid)) {
111
+ text += ` - ${r.item} (${r.errorCount} errors)\n`;
112
+ }
113
+ }
114
+ return {
115
+ content: [{ type: 'text', text }],
116
+ };
117
+ });
118
+ }
119
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/server/tools/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * OpenSpec 类型定义
3
+ */
4
+ export type ChangeStatus = 'active' | 'archived';
5
+ export type TaskStatus = 'pending' | 'in_progress' | 'done';
6
+ export type ApprovalStatus = 'draft' | 'pending_approval' | 'approved' | 'rejected' | 'implementing' | 'completed';
7
+ export type DeltaOperation = 'ADDED' | 'MODIFIED' | 'REMOVED' | 'RENAMED';
8
+ /**
9
+ * 变更提案
10
+ */
11
+ export interface Change {
12
+ id: string;
13
+ title: string;
14
+ status: ChangeStatus;
15
+ tasksCompleted: number;
16
+ tasksTotal: number;
17
+ createdAt: string;
18
+ updatedAt: string;
19
+ }
20
+ /**
21
+ * 变更详情
22
+ */
23
+ export interface ChangeDetail extends Change {
24
+ proposal: string;
25
+ design?: string;
26
+ tasks: Task[];
27
+ deltas: Delta[];
28
+ }
29
+ /**
30
+ * 规格
31
+ */
32
+ export interface Spec {
33
+ id: string;
34
+ title: string;
35
+ requirementsCount: number;
36
+ updatedAt: string;
37
+ }
38
+ /**
39
+ * 规格详情
40
+ */
41
+ export interface SpecDetail extends Spec {
42
+ content: string;
43
+ requirements: Requirement[];
44
+ }
45
+ /**
46
+ * 任务
47
+ */
48
+ export interface Task {
49
+ id: string;
50
+ section: string;
51
+ title: string;
52
+ status: TaskStatus;
53
+ line: number;
54
+ children?: Task[];
55
+ }
56
+ /**
57
+ * 进度统计
58
+ */
59
+ export interface Progress {
60
+ total: number;
61
+ completed: number;
62
+ inProgress: number;
63
+ pending: number;
64
+ percentage: number;
65
+ }
66
+ /**
67
+ * Delta(变更差异)
68
+ */
69
+ export interface Delta {
70
+ specName: string;
71
+ operation: DeltaOperation;
72
+ requirements: Requirement[];
73
+ }
74
+ /**
75
+ * 需求
76
+ */
77
+ export interface Requirement {
78
+ id: number;
79
+ title: string;
80
+ content: string;
81
+ scenarios: Scenario[];
82
+ }
83
+ /**
84
+ * 场景
85
+ */
86
+ export interface Scenario {
87
+ name: string;
88
+ when: string;
89
+ then: string;
90
+ }
91
+ /**
92
+ * 验证错误
93
+ */
94
+ export interface ValidationError {
95
+ type: 'error' | 'warning';
96
+ message: string;
97
+ location?: string;
98
+ }
99
+ /**
100
+ * 验证结果
101
+ */
102
+ export interface ValidationResult {
103
+ valid: boolean;
104
+ errors: ValidationError[];
105
+ }
106
+ /**
107
+ * 审批记录
108
+ */
109
+ export interface ApprovalRecord {
110
+ changeId: string;
111
+ status: ApprovalStatus;
112
+ requestedAt?: string;
113
+ requestedBy?: string;
114
+ reviewers?: string[];
115
+ approvals: {
116
+ approver: string;
117
+ approvedAt: string;
118
+ comment?: string;
119
+ }[];
120
+ rejections: {
121
+ rejector: string;
122
+ rejectedAt: string;
123
+ reason: string;
124
+ }[];
125
+ history: {
126
+ action: string;
127
+ by: string;
128
+ at: string;
129
+ details?: string;
130
+ }[];
131
+ }
132
+ /**
133
+ * 进度汇总
134
+ */
135
+ export interface ProgressSummary {
136
+ changeId: string;
137
+ title: string;
138
+ progress: Progress;
139
+ approvalStatus?: ApprovalStatus;
140
+ }
141
+ //# sourceMappingURL=openspec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openspec.d.ts","sourceRoot":"","sources":["../../src/types/openspec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * OpenSpec 类型定义
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=openspec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openspec.js","sourceRoot":"","sources":["../../src/types/openspec.ts"],"names":[],"mappings":"AAAA;;GAEG"}