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.
- package/LICENSE +21 -0
- package/README.md +205 -0
- package/README.zh.md +205 -0
- package/dist/api/routes/approvals.d.ts +7 -0
- package/dist/api/routes/approvals.d.ts.map +1 -0
- package/dist/api/routes/approvals.js +99 -0
- package/dist/api/routes/approvals.js.map +1 -0
- package/dist/api/routes/changes.d.ts +7 -0
- package/dist/api/routes/changes.d.ts.map +1 -0
- package/dist/api/routes/changes.js +55 -0
- package/dist/api/routes/changes.js.map +1 -0
- package/dist/api/routes/specs.d.ts +7 -0
- package/dist/api/routes/specs.d.ts.map +1 -0
- package/dist/api/routes/specs.js +34 -0
- package/dist/api/routes/specs.js.map +1 -0
- package/dist/api/routes/tasks.d.ts +7 -0
- package/dist/api/routes/tasks.d.ts.map +1 -0
- package/dist/api/routes/tasks.js +61 -0
- package/dist/api/routes/tasks.js.map +1 -0
- package/dist/api/server.d.ts +23 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +142 -0
- package/dist/api/server.js.map +1 -0
- package/dist/core/approval-manager.d.ts +69 -0
- package/dist/core/approval-manager.d.ts.map +1 -0
- package/dist/core/approval-manager.js +268 -0
- package/dist/core/approval-manager.js.map +1 -0
- package/dist/core/file-watcher.d.ts +38 -0
- package/dist/core/file-watcher.d.ts.map +1 -0
- package/dist/core/file-watcher.js +128 -0
- package/dist/core/file-watcher.js.map +1 -0
- package/dist/core/openspec-cli.d.ts +94 -0
- package/dist/core/openspec-cli.d.ts.map +1 -0
- package/dist/core/openspec-cli.js +436 -0
- package/dist/core/openspec-cli.js.map +1 -0
- package/dist/core/task-parser.d.ts +48 -0
- package/dist/core/task-parser.d.ts.map +1 -0
- package/dist/core/task-parser.js +172 -0
- package/dist/core/task-parser.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/dist/server/tools/approval.d.ts +8 -0
- package/dist/server/tools/approval.d.ts.map +1 -0
- package/dist/server/tools/approval.js +197 -0
- package/dist/server/tools/approval.js.map +1 -0
- package/dist/server/tools/archive.d.ts +8 -0
- package/dist/server/tools/archive.d.ts.map +1 -0
- package/dist/server/tools/archive.js +41 -0
- package/dist/server/tools/archive.js.map +1 -0
- package/dist/server/tools/guides.d.ts +8 -0
- package/dist/server/tools/guides.d.ts.map +1 -0
- package/dist/server/tools/guides.js +25 -0
- package/dist/server/tools/guides.js.map +1 -0
- package/dist/server/tools/management.d.ts +8 -0
- package/dist/server/tools/management.d.ts.map +1 -0
- package/dist/server/tools/management.js +96 -0
- package/dist/server/tools/management.js.map +1 -0
- package/dist/server/tools/tasks.d.ts +8 -0
- package/dist/server/tools/tasks.d.ts.map +1 -0
- package/dist/server/tools/tasks.js +124 -0
- package/dist/server/tools/tasks.js.map +1 -0
- package/dist/server/tools/validation.d.ts +8 -0
- package/dist/server/tools/validation.d.ts.map +1 -0
- package/dist/server/tools/validation.js +119 -0
- package/dist/server/tools/validation.js.map +1 -0
- package/dist/types/openspec.d.ts +141 -0
- package/dist/types/openspec.d.ts.map +1 -0
- package/dist/types/openspec.js +5 -0
- package/dist/types/openspec.js.map +1 -0
- package/package.json +58 -0
- package/web/dist/assets/index--LppUKpS.js +67 -0
- package/web/dist/assets/index-DdJQfs9Z.css +1 -0
- 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":"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"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"openspec.js","sourceRoot":"","sources":["../../src/types/openspec.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|