openspec-mcp 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -6
- package/README.zh.md +36 -1
- package/dist/api/routes/changes.d.ts.map +1 -1
- package/dist/api/routes/changes.js +42 -0
- package/dist/api/routes/changes.js.map +1 -1
- package/dist/api/routes/context.d.ts +8 -0
- package/dist/api/routes/context.d.ts.map +1 -0
- package/dist/api/routes/context.js +45 -0
- package/dist/api/routes/context.js.map +1 -0
- package/dist/api/routes/kanban.d.ts +8 -0
- package/dist/api/routes/kanban.d.ts.map +1 -0
- package/dist/api/routes/kanban.js +181 -0
- package/dist/api/routes/kanban.js.map +1 -0
- package/dist/api/routes/qa.d.ts +8 -0
- package/dist/api/routes/qa.d.ts.map +1 -0
- package/dist/api/routes/qa.js +98 -0
- package/dist/api/routes/qa.js.map +1 -0
- package/dist/api/server.d.ts +1 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +7 -0
- package/dist/api/server.js.map +1 -1
- package/dist/core/approval-manager.d.ts.map +1 -1
- package/dist/core/approval-manager.js +9 -1
- package/dist/core/approval-manager.js.map +1 -1
- package/dist/core/approval-manager.test.js +14 -0
- package/dist/core/approval-manager.test.js.map +1 -1
- package/dist/core/context-analyzer.d.ts +116 -0
- package/dist/core/context-analyzer.d.ts.map +1 -0
- package/dist/core/context-analyzer.js +495 -0
- package/dist/core/context-analyzer.js.map +1 -0
- package/dist/core/prompt-manager.d.ts +50 -0
- package/dist/core/prompt-manager.d.ts.map +1 -0
- package/dist/core/prompt-manager.js +186 -0
- package/dist/core/prompt-manager.js.map +1 -0
- package/dist/core/qa-runner.d.ts +134 -0
- package/dist/core/qa-runner.d.ts.map +1 -0
- package/dist/core/qa-runner.js +299 -0
- package/dist/core/qa-runner.js.map +1 -0
- package/dist/core/spec-critic.d.ts +118 -0
- package/dist/core/spec-critic.d.ts.map +1 -0
- package/dist/core/spec-critic.js +478 -0
- package/dist/core/spec-critic.js.map +1 -0
- package/dist/core/spec-critic.test.d.ts +5 -0
- package/dist/core/spec-critic.test.d.ts.map +1 -0
- package/dist/core/spec-critic.test.js +152 -0
- package/dist/core/spec-critic.test.js.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -1
- package/dist/server/tools/ai-context.d.ts +13 -0
- package/dist/server/tools/ai-context.d.ts.map +1 -0
- package/dist/server/tools/ai-context.js +212 -0
- package/dist/server/tools/ai-context.js.map +1 -0
- package/dist/server/tools/approval.d.ts.map +1 -1
- package/dist/server/tools/approval.js +33 -18
- package/dist/server/tools/approval.js.map +1 -1
- package/dist/server/tools/archive.d.ts.map +1 -1
- package/dist/server/tools/archive.js +9 -6
- package/dist/server/tools/archive.js.map +1 -1
- package/dist/server/tools/context.d.ts +12 -0
- package/dist/server/tools/context.d.ts.map +1 -0
- package/dist/server/tools/context.js +145 -0
- package/dist/server/tools/context.js.map +1 -0
- package/dist/server/tools/critique.d.ts +12 -0
- package/dist/server/tools/critique.d.ts.map +1 -0
- package/dist/server/tools/critique.js +194 -0
- package/dist/server/tools/critique.js.map +1 -0
- package/dist/server/tools/cross-service.d.ts.map +1 -1
- package/dist/server/tools/cross-service.js +11 -5
- package/dist/server/tools/cross-service.js.map +1 -1
- package/dist/server/tools/generator.d.ts.map +1 -1
- package/dist/server/tools/generator.js +27 -18
- package/dist/server/tools/generator.js.map +1 -1
- package/dist/server/tools/guides.d.ts.map +1 -1
- package/dist/server/tools/guides.js +8 -2
- package/dist/server/tools/guides.js.map +1 -1
- package/dist/server/tools/hooks.d.ts.map +1 -1
- package/dist/server/tools/hooks.js +7 -4
- package/dist/server/tools/hooks.js.map +1 -1
- package/dist/server/tools/management.d.ts.map +1 -1
- package/dist/server/tools/management.js +26 -14
- package/dist/server/tools/management.js.map +1 -1
- package/dist/server/tools/qa.d.ts +12 -0
- package/dist/server/tools/qa.d.ts.map +1 -0
- package/dist/server/tools/qa.js +248 -0
- package/dist/server/tools/qa.js.map +1 -0
- package/dist/server/tools/reviews.d.ts.map +1 -1
- package/dist/server/tools/reviews.js +55 -37
- package/dist/server/tools/reviews.js.map +1 -1
- package/dist/server/tools/tasks.d.ts.map +1 -1
- package/dist/server/tools/tasks.js +29 -17
- package/dist/server/tools/tasks.js.map +1 -1
- package/dist/server/tools/templates.d.ts.map +1 -1
- package/dist/server/tools/templates.js +26 -17
- package/dist/server/tools/templates.js.map +1 -1
- package/dist/server/tools/validation.d.ts.map +1 -1
- package/dist/server/tools/validation.js +31 -22
- package/dist/server/tools/validation.js.map +1 -1
- package/package.json +1 -1
- package/web/dist/assets/index-Bf5mzJti.css +1 -0
- package/web/dist/assets/index-W9UMaaAn.js +244 -0
- package/web/dist/index.html +2 -2
- package/web/dist/assets/index-CCYunmpc.css +0 -1
- package/web/dist/assets/index-wgGN6sVJ.js +0 -244
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec Critic Tests
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
5
|
+
import { SpecCritic } from './spec-critic.js';
|
|
6
|
+
import * as fs from 'fs/promises';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import * as os from 'os';
|
|
9
|
+
describe('SpecCritic', () => {
|
|
10
|
+
let tempDir;
|
|
11
|
+
let critic;
|
|
12
|
+
beforeEach(async () => {
|
|
13
|
+
// 创建临时目录
|
|
14
|
+
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'spec-critic-test-'));
|
|
15
|
+
critic = new SpecCritic({ cwd: tempDir });
|
|
16
|
+
// 创建 openspec 目录结构
|
|
17
|
+
const changeDir = path.join(tempDir, 'openspec', 'changes', 'test-change');
|
|
18
|
+
await fs.mkdir(changeDir, { recursive: true });
|
|
19
|
+
});
|
|
20
|
+
describe('critiqueProposal', () => {
|
|
21
|
+
it('should detect missing problem description', async () => {
|
|
22
|
+
// 创建缺少问题描述的 proposal
|
|
23
|
+
const proposalPath = path.join(tempDir, 'openspec', 'changes', 'test-change', 'proposal.md');
|
|
24
|
+
await fs.writeFile(proposalPath, `
|
|
25
|
+
# Solution
|
|
26
|
+
|
|
27
|
+
This is the solution.
|
|
28
|
+
`);
|
|
29
|
+
const result = await critic.critiqueProposal('test-change');
|
|
30
|
+
expect(result.changeName).toBe('test-change');
|
|
31
|
+
expect(result.documentType).toBe('proposal');
|
|
32
|
+
expect(result.critiques.some(c => c.id.length > 0)).toBe(true);
|
|
33
|
+
// 应该检测到缺少问题描述
|
|
34
|
+
const missingProblem = result.critiques.find(c => c.category === 'completeness' && c.title.includes('问题'));
|
|
35
|
+
expect(missingProblem).toBeDefined();
|
|
36
|
+
});
|
|
37
|
+
it('should detect missing solution', async () => {
|
|
38
|
+
const proposalPath = path.join(tempDir, 'openspec', 'changes', 'test-change', 'proposal.md');
|
|
39
|
+
await fs.writeFile(proposalPath, `
|
|
40
|
+
# Problem
|
|
41
|
+
|
|
42
|
+
This is the problem.
|
|
43
|
+
`);
|
|
44
|
+
const result = await critic.critiqueProposal('test-change');
|
|
45
|
+
// 应该检测到缺少解决方案
|
|
46
|
+
const missingSolution = result.critiques.find(c => c.category === 'completeness' && c.title.includes('解决方案'));
|
|
47
|
+
expect(missingSolution).toBeDefined();
|
|
48
|
+
});
|
|
49
|
+
it('should detect TODO placeholders', async () => {
|
|
50
|
+
const proposalPath = path.join(tempDir, 'openspec', 'changes', 'test-change', 'proposal.md');
|
|
51
|
+
await fs.writeFile(proposalPath, `
|
|
52
|
+
# Problem
|
|
53
|
+
|
|
54
|
+
We need to fix this issue.
|
|
55
|
+
|
|
56
|
+
# Solution
|
|
57
|
+
|
|
58
|
+
TODO: Implement the solution
|
|
59
|
+
|
|
60
|
+
TBD: Decide on the approach
|
|
61
|
+
`);
|
|
62
|
+
const result = await critic.critiqueProposal('test-change');
|
|
63
|
+
// 应该检测到 TODO
|
|
64
|
+
const todoFound = result.critiques.find(c => c.category === 'feasibility' && c.title.includes('TODO'));
|
|
65
|
+
expect(todoFound).toBeDefined();
|
|
66
|
+
});
|
|
67
|
+
it('should detect short documents', async () => {
|
|
68
|
+
const proposalPath = path.join(tempDir, 'openspec', 'changes', 'test-change', 'proposal.md');
|
|
69
|
+
await fs.writeFile(proposalPath, 'Short doc.');
|
|
70
|
+
const result = await critic.critiqueProposal('test-change');
|
|
71
|
+
// 应该检测到文档过短
|
|
72
|
+
const tooShort = result.critiques.find(c => c.category === 'clarity' && c.title.includes('过短'));
|
|
73
|
+
expect(tooShort).toBeDefined();
|
|
74
|
+
});
|
|
75
|
+
it('should give high score for complete document', async () => {
|
|
76
|
+
const proposalPath = path.join(tempDir, 'openspec', 'changes', 'test-change', 'proposal.md');
|
|
77
|
+
await fs.writeFile(proposalPath, `
|
|
78
|
+
# Problem
|
|
79
|
+
|
|
80
|
+
We have a significant issue with our authentication system. Users are experiencing slow login times due to synchronous database queries. This affects user experience and increases server load during peak hours.
|
|
81
|
+
|
|
82
|
+
# Solution
|
|
83
|
+
|
|
84
|
+
We will implement asynchronous authentication with Redis caching:
|
|
85
|
+
1. Cache user sessions in Redis
|
|
86
|
+
2. Use async/await for database queries
|
|
87
|
+
3. Add connection pooling
|
|
88
|
+
|
|
89
|
+
## Impact
|
|
90
|
+
|
|
91
|
+
This change affects:
|
|
92
|
+
- login.ts - Main authentication handler
|
|
93
|
+
- session-manager.ts - Session storage
|
|
94
|
+
- redis-client.ts - Cache layer
|
|
95
|
+
|
|
96
|
+
## Error Handling
|
|
97
|
+
|
|
98
|
+
We handle errors by:
|
|
99
|
+
- Retry logic for Redis connection failures
|
|
100
|
+
- Fallback to database if cache miss
|
|
101
|
+
- Proper exception propagation
|
|
102
|
+
|
|
103
|
+
## Security
|
|
104
|
+
|
|
105
|
+
Authentication tokens are:
|
|
106
|
+
- Encrypted with AES-256
|
|
107
|
+
- Rotated every 24 hours
|
|
108
|
+
- Validated server-side
|
|
109
|
+
`);
|
|
110
|
+
const result = await critic.critiqueProposal('test-change');
|
|
111
|
+
// 完整文档应该得高分
|
|
112
|
+
expect(result.overallScore).toBeGreaterThanOrEqual(7);
|
|
113
|
+
expect(result.summary.critical).toBe(0);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe('getCritiqueHistory', () => {
|
|
117
|
+
it('should return empty array when no history', async () => {
|
|
118
|
+
const history = await critic.getCritiqueHistory('nonexistent-change');
|
|
119
|
+
expect(history).toEqual([]);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
describe('saveCritiqueResult', () => {
|
|
123
|
+
it('should save and retrieve critique result', async () => {
|
|
124
|
+
const result = {
|
|
125
|
+
changeName: 'test-change',
|
|
126
|
+
documentType: 'proposal',
|
|
127
|
+
overallScore: 7.5,
|
|
128
|
+
critiques: [],
|
|
129
|
+
suggestions: ['Test suggestion'],
|
|
130
|
+
summary: {
|
|
131
|
+
total: 0,
|
|
132
|
+
critical: 0,
|
|
133
|
+
warning: 0,
|
|
134
|
+
info: 0,
|
|
135
|
+
byCategory: {
|
|
136
|
+
completeness: 0,
|
|
137
|
+
feasibility: 0,
|
|
138
|
+
security: 0,
|
|
139
|
+
edge_case: 0,
|
|
140
|
+
clarity: 0,
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
createdAt: new Date().toISOString(),
|
|
144
|
+
};
|
|
145
|
+
await critic.saveCritiqueResult(result);
|
|
146
|
+
const history = await critic.getCritiqueHistory('test-change');
|
|
147
|
+
expect(history.length).toBe(1);
|
|
148
|
+
expect(history[0].overallScore).toBe(7.5);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
//# sourceMappingURL=spec-critic.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-critic.test.js","sourceRoot":"","sources":["../../src/core/spec-critic.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -25,8 +25,17 @@ import { registerTemplatesTools } from './server/tools/templates.js';
|
|
|
25
25
|
import { registerHooksTools } from './server/tools/hooks.js';
|
|
26
26
|
import { registerGeneratorTools } from './server/tools/generator.js';
|
|
27
27
|
import { registerCrossServiceTools } from './server/tools/cross-service.js';
|
|
28
|
+
import { registerCritiqueTools } from './server/tools/critique.js';
|
|
29
|
+
import { registerQATools } from './server/tools/qa.js';
|
|
30
|
+
import { registerContextTools } from './server/tools/context.js';
|
|
31
|
+
import { registerAIContextTools } from './server/tools/ai-context.js';
|
|
28
32
|
import { CrossServiceManager } from './core/cross-service-manager.js';
|
|
33
|
+
import { SpecCritic } from './core/spec-critic.js';
|
|
34
|
+
import { QARunner } from './core/qa-runner.js';
|
|
35
|
+
import { ContextAnalyzer } from './core/context-analyzer.js';
|
|
29
36
|
import { VERSION } from './utils/version.js';
|
|
37
|
+
import { PromptManager } from './core/prompt-manager.js';
|
|
38
|
+
import { ListPromptsRequestSchema, GetPromptRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
30
39
|
/**
|
|
31
40
|
* 创建并配置 MCP Server
|
|
32
41
|
*/
|
|
@@ -56,6 +65,30 @@ function createMcpServer(cwd) {
|
|
|
56
65
|
// 跨服务文档管理
|
|
57
66
|
const crossServiceManager = new CrossServiceManager({ cwd });
|
|
58
67
|
registerCrossServiceTools(server, crossServiceManager);
|
|
68
|
+
// 规格评审
|
|
69
|
+
const specCritic = new SpecCritic({ cwd });
|
|
70
|
+
registerCritiqueTools(server, specCritic);
|
|
71
|
+
// 质量检查
|
|
72
|
+
const qaRunner = new QARunner({ cwd });
|
|
73
|
+
registerQATools(server, qaRunner);
|
|
74
|
+
// 项目上下文分析
|
|
75
|
+
const contextAnalyzer = new ContextAnalyzer({ cwd });
|
|
76
|
+
registerContextTools(server, contextAnalyzer);
|
|
77
|
+
registerAIContextTools(server, contextAnalyzer);
|
|
78
|
+
// 注册 Prompts
|
|
79
|
+
const promptManager = new PromptManager({ cwd });
|
|
80
|
+
// 尝试注册 Prompt Handlers (通过底层 server 实例)
|
|
81
|
+
const coreServer = server.server;
|
|
82
|
+
if (coreServer && typeof coreServer.setRequestHandler === 'function') {
|
|
83
|
+
coreServer.setRequestHandler(ListPromptsRequestSchema, async () => {
|
|
84
|
+
return { prompts: promptManager.getPrompts() };
|
|
85
|
+
});
|
|
86
|
+
coreServer.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
87
|
+
const { name, arguments: args } = request.params;
|
|
88
|
+
const messages = await promptManager.getPrompt(name, args);
|
|
89
|
+
return { messages };
|
|
90
|
+
});
|
|
91
|
+
}
|
|
59
92
|
return server;
|
|
60
93
|
}
|
|
61
94
|
/**
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Context Tools - AI 增强的项目上下文分析
|
|
3
|
+
*
|
|
4
|
+
* 利用 MCP Sampling 能力调用 Client AI 进行深度分析
|
|
5
|
+
* 并给出 project.md 更新建议
|
|
6
|
+
*/
|
|
7
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
import { ContextAnalyzer } from '../../core/context-analyzer.js';
|
|
9
|
+
/**
|
|
10
|
+
* 注册 AI Context 相关工具
|
|
11
|
+
*/
|
|
12
|
+
export declare function registerAIContextTools(server: McpServer, analyzer: ContextAnalyzer): void;
|
|
13
|
+
//# sourceMappingURL=ai-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-context.d.ts","sourceRoot":"","sources":["../../../src/server/tools/ai-context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAkB,MAAM,gCAAgC,CAAC;AAEjF;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,eAAe,GACxB,IAAI,CA2DN"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Context Tools - AI 增强的项目上下文分析
|
|
3
|
+
*
|
|
4
|
+
* 利用 MCP Sampling 能力调用 Client AI 进行深度分析
|
|
5
|
+
* 并给出 project.md 更新建议
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
/**
|
|
9
|
+
* 注册 AI Context 相关工具
|
|
10
|
+
*/
|
|
11
|
+
export function registerAIContextTools(server, analyzer) {
|
|
12
|
+
/**
|
|
13
|
+
* AI 深度分析项目上下文
|
|
14
|
+
*/
|
|
15
|
+
server.registerTool('openspec_ai_analyze_context', {
|
|
16
|
+
description: `使用 AI 深度分析项目上下文并给出 project.md 更新建议。
|
|
17
|
+
利用 MCP Client 的 AI 能力进行分析。`,
|
|
18
|
+
inputSchema: z.object({
|
|
19
|
+
focus: z
|
|
20
|
+
.enum(['overview', 'architecture', 'improvements', 'conventions'])
|
|
21
|
+
.optional()
|
|
22
|
+
.describe('分析重点:overview(总览), architecture(架构), improvements(改进建议), conventions(约定规范)'),
|
|
23
|
+
}),
|
|
24
|
+
}, async ({ focus = 'overview' }) => {
|
|
25
|
+
try {
|
|
26
|
+
// 1. 收集上下文
|
|
27
|
+
const staticContext = await analyzer.analyze();
|
|
28
|
+
const projectMd = await analyzer.getProjectMd();
|
|
29
|
+
const keyFiles = await analyzer.getKeyFiles();
|
|
30
|
+
// 2. 构建分析 Prompt
|
|
31
|
+
const prompt = buildAnalysisPrompt(staticContext, projectMd, keyFiles, focus);
|
|
32
|
+
// 3. 使用 MCP Sampling 请求 Client AI
|
|
33
|
+
// 注意:这需要 Client 支持 sampling 能力
|
|
34
|
+
const samplingResult = await requestSampling(server, prompt);
|
|
35
|
+
if (!samplingResult.success) {
|
|
36
|
+
// Sampling 不可用,返回静态分析结果
|
|
37
|
+
return {
|
|
38
|
+
content: [
|
|
39
|
+
{
|
|
40
|
+
type: 'text',
|
|
41
|
+
text: `${formatStaticContext(staticContext, projectMd)}\n\n> ⚠️ 注意: AI 深度分析不可用(${samplingResult.error})。以上为静态分析结果。`,
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
content: [
|
|
48
|
+
{
|
|
49
|
+
type: 'text',
|
|
50
|
+
text: samplingResult.response,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
57
|
+
return {
|
|
58
|
+
content: [{ type: 'text', text: `❌ 分析失败: ${message}` }],
|
|
59
|
+
isError: true,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 构建分析 Prompt
|
|
66
|
+
*/
|
|
67
|
+
function buildAnalysisPrompt(context, projectMd, keyFiles, focus) {
|
|
68
|
+
const languagesSummary = context.stack.languages
|
|
69
|
+
.slice(0, 5)
|
|
70
|
+
.map((l) => `${l.name}: ${l.percentage}%`)
|
|
71
|
+
.join(', ');
|
|
72
|
+
const directoriesSummary = context.structure.mainDirectories
|
|
73
|
+
.slice(0, 8)
|
|
74
|
+
.map((d) => `${d.name}/ (${d.purpose}, ${d.fileCount} files)`)
|
|
75
|
+
.join('\n');
|
|
76
|
+
const focusInstructions = {
|
|
77
|
+
overview: '请给出项目的整体概述和架构理解',
|
|
78
|
+
architecture: '请深入分析项目架构设计,包括分层、模块划分、依赖关系',
|
|
79
|
+
improvements: '请找出项目中可以改进的地方,包括代码组织、最佳实践、潜在问题',
|
|
80
|
+
conventions: '请分析项目的编码约定和规范,建议补充缺失的约定',
|
|
81
|
+
};
|
|
82
|
+
return `你是一个资深软件架构师,请分析以下项目并给出见解。
|
|
83
|
+
|
|
84
|
+
## 分析重点
|
|
85
|
+
${focusInstructions[focus] || focusInstructions.overview}
|
|
86
|
+
|
|
87
|
+
## 当前 project.md
|
|
88
|
+
\`\`\`markdown
|
|
89
|
+
${projectMd || '(尚未创建 openspec/project.md)'}
|
|
90
|
+
\`\`\`
|
|
91
|
+
|
|
92
|
+
## 静态分析结果
|
|
93
|
+
|
|
94
|
+
### 技术栈
|
|
95
|
+
- 语言分布: ${languagesSummary}
|
|
96
|
+
- 框架: ${context.stack.frameworks.join(', ') || '未检测到'}
|
|
97
|
+
- 包管理器: ${context.stack.packageManager}
|
|
98
|
+
- 构建工具: ${context.stack.buildTools.join(', ') || '无'}
|
|
99
|
+
- 测试框架: ${context.stack.testFramework || '未检测到'}
|
|
100
|
+
|
|
101
|
+
### 目录结构
|
|
102
|
+
${directoriesSummary}
|
|
103
|
+
|
|
104
|
+
### 统计
|
|
105
|
+
- 文件总数: ${context.stats.totalFiles}
|
|
106
|
+
- 预估代码行数: ${context.stats.totalLines}
|
|
107
|
+
|
|
108
|
+
### 关键文件
|
|
109
|
+
${Object.entries(keyFiles)
|
|
110
|
+
.map(([name, content]) => `#### ${name}\n\`\`\`\n${content.slice(0, 500)}${content.length > 500 ? '\n...(truncated)' : ''}\n\`\`\``)
|
|
111
|
+
.join('\n\n')}
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
请按以下格式输出:
|
|
116
|
+
|
|
117
|
+
## 项目分析
|
|
118
|
+
(你对项目的理解和分析)
|
|
119
|
+
|
|
120
|
+
## project.md 更新建议
|
|
121
|
+
(如果 project.md 已存在,使用 diff 格式标注增删;如果不存在,给出完整的推荐内容)
|
|
122
|
+
|
|
123
|
+
\`\`\`markdown
|
|
124
|
+
(更新后的 project.md 内容或 diff)
|
|
125
|
+
\`\`\`
|
|
126
|
+
`;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 请求 MCP Sampling
|
|
130
|
+
*/
|
|
131
|
+
async function requestSampling(server, prompt) {
|
|
132
|
+
try {
|
|
133
|
+
// 检查 server 是否支持 createMessage
|
|
134
|
+
if (typeof server.createMessage !== 'function') {
|
|
135
|
+
return {
|
|
136
|
+
success: false,
|
|
137
|
+
error: 'MCP Server 不支持 sampling,请确保 Client 支持此功能',
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const result = await server.createMessage({
|
|
141
|
+
messages: [
|
|
142
|
+
{
|
|
143
|
+
role: 'user',
|
|
144
|
+
content: {
|
|
145
|
+
type: 'text',
|
|
146
|
+
text: prompt,
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
maxTokens: 3000,
|
|
151
|
+
modelPreferences: {
|
|
152
|
+
hints: [{ name: 'claude-3-5-sonnet' }],
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
// 提取响应文本
|
|
156
|
+
const responseText = typeof result.content === 'string'
|
|
157
|
+
? result.content
|
|
158
|
+
: result.content?.text || JSON.stringify(result.content);
|
|
159
|
+
return { success: true, response: responseText };
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
const message = error instanceof Error ? error.message : 'Unknown sampling error';
|
|
163
|
+
return { success: false, error: message };
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* 格式化静态上下文(Sampling 不可用时的备选)
|
|
168
|
+
* 提供完整的静态分析结果和 project.md 模板建议
|
|
169
|
+
*/
|
|
170
|
+
function formatStaticContext(context, projectMd) {
|
|
171
|
+
const primaryLang = context.stack.languages[0];
|
|
172
|
+
const langList = context.stack.languages.slice(0, 5).map(l => `${l.name} (${l.percentage}%)`).join(', ');
|
|
173
|
+
const sections = [
|
|
174
|
+
// 技术栈分析
|
|
175
|
+
`## 项目分析(静态)`,
|
|
176
|
+
'',
|
|
177
|
+
`### 技术栈`,
|
|
178
|
+
`| 项目 | 信息 |`,
|
|
179
|
+
`|------|------|`,
|
|
180
|
+
`| **主要语言** | ${primaryLang?.name || '未知'} (${primaryLang?.percentage || 0}%) |`,
|
|
181
|
+
`| **语言分布** | ${langList} |`,
|
|
182
|
+
`| **框架** | ${context.stack.frameworks.join(', ') || '未检测到'} |`,
|
|
183
|
+
`| **包管理器** | ${context.stack.packageManager} |`,
|
|
184
|
+
`| **构建工具** | ${context.stack.buildTools.join(', ') || '无'} |`,
|
|
185
|
+
`| **测试框架** | ${context.stack.testFramework || '未检测到'} |`,
|
|
186
|
+
'',
|
|
187
|
+
// 目录结构
|
|
188
|
+
`### 目录结构`,
|
|
189
|
+
'',
|
|
190
|
+
...context.structure.mainDirectories.slice(0, 10).map(d => `- \`${d.name}/\` - ${d.purpose} (${d.fileCount} 文件)`),
|
|
191
|
+
'',
|
|
192
|
+
// 统计信息
|
|
193
|
+
`### 统计`,
|
|
194
|
+
`- **文件总数**: ${context.stats.totalFiles.toLocaleString()}`,
|
|
195
|
+
`- **预估代码行**: ${context.stats.totalLines.toLocaleString()}`,
|
|
196
|
+
'',
|
|
197
|
+
// 架构模式
|
|
198
|
+
`### 检测到的模式`,
|
|
199
|
+
`- **架构风格**: ${context.patterns.architecture}`,
|
|
200
|
+
`- **代码风格**: ${context.patterns.codeStyle.join(', ') || '未配置'}`,
|
|
201
|
+
`- **约定规范**: ${context.patterns.conventions.join(', ') || '无'}`,
|
|
202
|
+
];
|
|
203
|
+
// 如果 project.md 不存在,生成模板
|
|
204
|
+
if (!projectMd) {
|
|
205
|
+
sections.push('', `---`, '', `## project.md 模板建议`, '', `你尚未创建 \`openspec/project.md\`。以下是基于静态分析的推荐模板:`, '', '```markdown', `# ${context.projectName}`, '', `## 项目概述`, `<!-- 描述项目的目的和主要功能 -->`, '', `## 技术栈`, `- **主要语言**: ${primaryLang?.name || '未知'}`, `- **框架**: ${context.stack.frameworks.join(', ') || '无'}`, `- **包管理器**: ${context.stack.packageManager}`, context.stack.testFramework ? `- **测试框架**: ${context.stack.testFramework}` : '', '', `## 项目结构`, ...context.structure.mainDirectories.slice(0, 6).map(d => `- \`${d.name}/\` - ${d.purpose}`), '', `## 开发约定`, `<!-- 描述编码规范、提交消息格式等 -->`, '', `## 外部依赖`, `<!-- 列出重要的外部服务或 API -->`, '```', '', `> 💡 将上述内容保存到 \`openspec/project.md\`,然后再次运行分析获取更好的结果。`);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
sections.push('', `---`, '', `## project.md 状态`, `✅ 已存在 \`openspec/project.md\`(${projectMd.length} 字符)`);
|
|
209
|
+
}
|
|
210
|
+
return sections.filter(Boolean).join('\n');
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=ai-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-context.js","sourceRoot":"","sources":["../../../src/server/tools/ai-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval.d.ts","sourceRoot":"","sources":["../../../src/server/tools/approval.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,eAAe,EAAE,eAAe,GAC/B,IAAI,
|
|
1
|
+
{"version":3,"file":"approval.d.ts","sourceRoot":"","sources":["../../../src/server/tools/approval.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,eAAe,EAAE,eAAe,GAC/B,IAAI,CA6ON"}
|
|
@@ -7,8 +7,11 @@ export function registerApprovalTools(server, approvalManager) {
|
|
|
7
7
|
/**
|
|
8
8
|
* 获取审批状态
|
|
9
9
|
*/
|
|
10
|
-
server.
|
|
11
|
-
|
|
10
|
+
server.registerTool('openspec_get_approval_status', {
|
|
11
|
+
description: 'Get approval status for a change',
|
|
12
|
+
inputSchema: {
|
|
13
|
+
changeId: z.string().describe('Change ID'),
|
|
14
|
+
},
|
|
12
15
|
}, async ({ changeId }) => {
|
|
13
16
|
const record = await approvalManager.getApprovalStatus(changeId);
|
|
14
17
|
if (!record) {
|
|
@@ -55,13 +58,16 @@ export function registerApprovalTools(server, approvalManager) {
|
|
|
55
58
|
/**
|
|
56
59
|
* 请求审批
|
|
57
60
|
*/
|
|
58
|
-
server.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
server.registerTool('openspec_request_approval', {
|
|
62
|
+
description: 'Request approval for a change',
|
|
63
|
+
inputSchema: {
|
|
64
|
+
changeId: z.string().describe('Change ID'),
|
|
65
|
+
requestedBy: z.string().describe('Who is requesting approval'),
|
|
66
|
+
reviewers: z
|
|
67
|
+
.array(z.string())
|
|
68
|
+
.optional()
|
|
69
|
+
.describe('List of reviewers'),
|
|
70
|
+
},
|
|
65
71
|
}, async ({ changeId, requestedBy, reviewers }) => {
|
|
66
72
|
try {
|
|
67
73
|
const record = await approvalManager.requestApproval(changeId, requestedBy, reviewers);
|
|
@@ -90,10 +96,13 @@ export function registerApprovalTools(server, approvalManager) {
|
|
|
90
96
|
/**
|
|
91
97
|
* 审批通过
|
|
92
98
|
*/
|
|
93
|
-
server.
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
99
|
+
server.registerTool('openspec_approve_change', {
|
|
100
|
+
description: 'Approve a change',
|
|
101
|
+
inputSchema: {
|
|
102
|
+
changeId: z.string().describe('Change ID'),
|
|
103
|
+
approver: z.string().describe('Who is approving'),
|
|
104
|
+
comment: z.string().optional().describe('Optional approval comment'),
|
|
105
|
+
},
|
|
97
106
|
}, async ({ changeId, approver, comment }) => {
|
|
98
107
|
try {
|
|
99
108
|
const record = await approvalManager.approve(changeId, approver, comment);
|
|
@@ -122,10 +131,13 @@ export function registerApprovalTools(server, approvalManager) {
|
|
|
122
131
|
/**
|
|
123
132
|
* 审批拒绝
|
|
124
133
|
*/
|
|
125
|
-
server.
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
134
|
+
server.registerTool('openspec_reject_change', {
|
|
135
|
+
description: 'Reject a change',
|
|
136
|
+
inputSchema: {
|
|
137
|
+
changeId: z.string().describe('Change ID'),
|
|
138
|
+
rejector: z.string().describe('Who is rejecting'),
|
|
139
|
+
reason: z.string().describe('Rejection reason'),
|
|
140
|
+
},
|
|
129
141
|
}, async ({ changeId, rejector, reason }) => {
|
|
130
142
|
try {
|
|
131
143
|
const record = await approvalManager.reject(changeId, rejector, reason);
|
|
@@ -152,7 +164,10 @@ export function registerApprovalTools(server, approvalManager) {
|
|
|
152
164
|
/**
|
|
153
165
|
* 列出待审批的变更
|
|
154
166
|
*/
|
|
155
|
-
server.
|
|
167
|
+
server.registerTool('openspec_list_pending_approvals', {
|
|
168
|
+
description: 'List all changes pending approval',
|
|
169
|
+
inputSchema: {},
|
|
170
|
+
}, async () => {
|
|
156
171
|
const pending = await approvalManager.listPendingApprovals();
|
|
157
172
|
if (pending.length === 0) {
|
|
158
173
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval.js","sourceRoot":"","sources":["../../../src/server/tools/approval.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,eAAgC;IAEhC;;OAEG;IACH,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"approval.js","sourceRoot":"","sources":["../../../src/server/tools/approval.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/server/tools/archive.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/server/tools/archive.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAyC9E"}
|
|
@@ -7,12 +7,15 @@ export function registerArchiveTools(server, cli) {
|
|
|
7
7
|
/**
|
|
8
8
|
* 归档变更
|
|
9
9
|
*/
|
|
10
|
-
server.
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
.
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
server.registerTool('openspec_archive_change', {
|
|
11
|
+
description: 'Archive a completed change proposal',
|
|
12
|
+
inputSchema: {
|
|
13
|
+
changeId: z.string().describe('Change ID to archive'),
|
|
14
|
+
skipSpecs: z
|
|
15
|
+
.boolean()
|
|
16
|
+
.optional()
|
|
17
|
+
.describe('Skip merging delta specs into main specs'),
|
|
18
|
+
},
|
|
16
19
|
}, async ({ changeId, skipSpecs }) => {
|
|
17
20
|
const result = await cli.archiveChange(changeId, { skipSpecs });
|
|
18
21
|
if (result.success) {
|
|
@@ -1 +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,
|
|
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,YAAY,CACjB,yBAAyB,EACzB;QACE,WAAW,EAAE,qCAAqC;QAClD,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YACrD,SAAS,EAAE,CAAC;iBACT,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,0CAA0C,CAAC;SACxD;KACF,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"}
|