openspec-mcp 0.3.2 → 0.3.4

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 (57) hide show
  1. package/README.md +14 -15
  2. package/dist/api/routes/kanban.d.ts.map +1 -1
  3. package/dist/api/routes/kanban.js +11 -16
  4. package/dist/api/routes/kanban.js.map +1 -1
  5. package/dist/api/server.d.ts.map +1 -1
  6. package/dist/api/server.js +30 -3
  7. package/dist/api/server.js.map +1 -1
  8. package/dist/core/approval-manager.d.ts +0 -4
  9. package/dist/core/approval-manager.d.ts.map +1 -1
  10. package/dist/core/approval-manager.js +5 -25
  11. package/dist/core/approval-manager.js.map +1 -1
  12. package/dist/core/approval-manager.test.js +6 -9
  13. package/dist/core/approval-manager.test.js.map +1 -1
  14. package/dist/index.js +0 -21
  15. package/dist/index.js.map +1 -1
  16. package/dist/server/tools/approval.js +4 -2
  17. package/dist/server/tools/approval.js.map +1 -1
  18. package/dist/server/tools/context.d.ts.map +1 -1
  19. package/dist/server/tools/context.js +0 -38
  20. package/dist/server/tools/context.js.map +1 -1
  21. package/dist/server/tools/critique.d.ts.map +1 -1
  22. package/dist/server/tools/critique.js +29 -42
  23. package/dist/server/tools/critique.js.map +1 -1
  24. package/dist/server/tools/generator.d.ts.map +1 -1
  25. package/dist/server/tools/generator.js +0 -23
  26. package/dist/server/tools/generator.js.map +1 -1
  27. package/dist/server/tools/reviews.d.ts.map +1 -1
  28. package/dist/server/tools/reviews.js +0 -25
  29. package/dist/server/tools/reviews.js.map +1 -1
  30. package/dist/types/openspec.d.ts +1 -1
  31. package/dist/types/openspec.d.ts.map +1 -1
  32. package/dist/utils/constants.d.ts +2 -3
  33. package/dist/utils/constants.d.ts.map +1 -1
  34. package/dist/utils/constants.js +2 -3
  35. package/dist/utils/constants.js.map +1 -1
  36. package/package.json +1 -1
  37. package/web/dist/assets/index-C5tEIOBf.css +1 -0
  38. package/web/dist/assets/index-D4LCY_M0.js +244 -0
  39. package/web/dist/index.html +2 -2
  40. package/dist/api/routes/qa.d.ts +0 -8
  41. package/dist/api/routes/qa.d.ts.map +0 -1
  42. package/dist/api/routes/qa.js +0 -98
  43. package/dist/api/routes/qa.js.map +0 -1
  44. package/dist/core/prompt-manager.d.ts +0 -50
  45. package/dist/core/prompt-manager.d.ts.map +0 -1
  46. package/dist/core/prompt-manager.js +0 -186
  47. package/dist/core/prompt-manager.js.map +0 -1
  48. package/dist/core/qa-runner.d.ts +0 -134
  49. package/dist/core/qa-runner.d.ts.map +0 -1
  50. package/dist/core/qa-runner.js +0 -299
  51. package/dist/core/qa-runner.js.map +0 -1
  52. package/dist/server/tools/qa.d.ts +0 -12
  53. package/dist/server/tools/qa.d.ts.map +0 -1
  54. package/dist/server/tools/qa.js +0 -248
  55. package/dist/server/tools/qa.js.map +0 -1
  56. package/web/dist/assets/index-Bf5mzJti.css +0 -1
  57. package/web/dist/assets/index-W9UMaaAn.js +0 -244
@@ -5,8 +5,8 @@
5
5
  <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>OpenSpec MCP Dashboard</title>
8
- <script type="module" crossorigin src="/assets/index-W9UMaaAn.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-Bf5mzJti.css">
8
+ <script type="module" crossorigin src="/assets/index-D4LCY_M0.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-C5tEIOBf.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
@@ -1,8 +0,0 @@
1
- /**
2
- * QA REST API 路由
3
- * 提供 QA Runner 的 REST 接口
4
- */
5
- import type { FastifyInstance } from 'fastify';
6
- import type { ApiContext } from '../server.js';
7
- export declare function registerQARoutes(fastify: FastifyInstance, ctx: ApiContext): void;
8
- //# sourceMappingURL=qa.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"qa.d.ts","sourceRoot":"","sources":["../../../src/api/routes/qa.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI,CA+GhF"}
@@ -1,98 +0,0 @@
1
- /**
2
- * QA REST API 路由
3
- * 提供 QA Runner 的 REST 接口
4
- */
5
- import { QARunner } from '../../core/qa-runner.js';
6
- export function registerQARoutes(fastify, ctx) {
7
- // 创建 QARunner 实例
8
- const qaRunner = new QARunner({ cwd: ctx.cwd });
9
- /**
10
- * GET /api/qa/status/:changeName - 获取指定变更的 QA 状态
11
- */
12
- fastify.get('/qa/status/:changeName', async (request) => {
13
- const { changeName } = request.params;
14
- const status = await qaRunner.getQAStatus(changeName);
15
- return { status };
16
- });
17
- /**
18
- * GET /api/qa/history/:changeName - 获取指定变更的 QA 历史
19
- */
20
- fastify.get('/qa/history/:changeName', async (request) => {
21
- const { changeName } = request.params;
22
- const { limit } = request.query;
23
- const history = await qaRunner.getQAHistory(changeName, limit ? parseInt(limit, 10) : 10);
24
- return { history };
25
- });
26
- /**
27
- * GET /api/qa/summary - 获取所有变更的 QA 摘要统计
28
- */
29
- fastify.get('/qa/summary', async () => {
30
- const summary = await qaRunner.getQASummary();
31
- return summary;
32
- });
33
- /**
34
- * POST /api/qa/run/:changeName - 触发指定变更的 QA 运行
35
- */
36
- fastify.post('/qa/run/:changeName', async (request, reply) => {
37
- const { changeName } = request.params;
38
- const { checks } = request.body;
39
- // 检查是否已有运行中的 QA
40
- if (qaRunner.isRunning(changeName)) {
41
- return reply.status(409).send({
42
- error: 'A QA check is already running for this change',
43
- changeName
44
- });
45
- }
46
- // 异步运行 QA,立即返回
47
- const runPromise = qaRunner.runQA(changeName, { checks });
48
- // 广播开始事件
49
- ctx.broadcast('qa:started', { changeName, checks });
50
- // 后台处理结果
51
- runPromise.then(result => {
52
- ctx.broadcast('qa:completed', {
53
- changeName,
54
- status: result.status,
55
- summary: result.summary
56
- });
57
- }).catch(error => {
58
- ctx.broadcast('qa:error', {
59
- changeName,
60
- error: error instanceof Error ? error.message : 'Unknown error'
61
- });
62
- });
63
- return {
64
- message: 'QA check started',
65
- changeName,
66
- checks: checks || ['typecheck', 'lint', 'test']
67
- };
68
- });
69
- /**
70
- * POST /api/qa/stop/:changeName - 停止运行中的 QA
71
- */
72
- fastify.post('/qa/stop/:changeName', async (request, reply) => {
73
- const { changeName } = request.params;
74
- if (!qaRunner.isRunning(changeName)) {
75
- return reply.status(400).send({
76
- error: 'No QA check is currently running for this change',
77
- changeName
78
- });
79
- }
80
- const stopped = await qaRunner.stopQA(changeName);
81
- if (stopped) {
82
- ctx.broadcast('qa:stopped', { changeName });
83
- return { message: 'QA check stopped', changeName };
84
- }
85
- else {
86
- return reply.status(500).send({ error: 'Failed to stop QA check' });
87
- }
88
- });
89
- /**
90
- * GET /api/qa/running - 获取所有正在运行的 QA
91
- */
92
- fastify.get('/qa/running', async () => {
93
- const summary = await qaRunner.getQASummary();
94
- const running = summary.changes.filter(c => c.status === 'running');
95
- return { running };
96
- });
97
- }
98
- //# sourceMappingURL=qa.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"qa.js","sourceRoot":"","sources":["../../../src/api/routes/qa.ts"],"names":[],"mappings":"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"}
@@ -1,50 +0,0 @@
1
- /**
2
- * Prompt Manager
3
- * 管理和生成 MCP Prompts
4
- */
5
- export interface PromptDefinition {
6
- name: string;
7
- description: string;
8
- arguments?: Array<{
9
- name: string;
10
- description: string;
11
- required?: boolean;
12
- }>;
13
- }
14
- export interface PromptMessage {
15
- role: 'user' | 'assistant';
16
- content: {
17
- type: 'text' | 'image' | 'resource';
18
- text?: string;
19
- resource?: {
20
- uri: string;
21
- mimeType?: string;
22
- text?: string;
23
- };
24
- };
25
- }
26
- export declare class PromptManager {
27
- private analyzer;
28
- private cli;
29
- private qaRunner;
30
- constructor(options: {
31
- cwd: string;
32
- });
33
- /**
34
- * 获取所有可用的 Prompts 定义
35
- */
36
- getPrompts(): PromptDefinition[];
37
- /**
38
- * 生成 Prompt 内容
39
- */
40
- getPrompt(name: string, args?: Record<string, string>): Promise<PromptMessage[]>;
41
- /**
42
- * 生成 analyze-project prompt
43
- */
44
- private generateAnalyzeProjectPrompt;
45
- /**
46
- * 生成 review-change prompt
47
- */
48
- private generateReviewChangePrompt;
49
- }
50
- //# sourceMappingURL=prompt-manager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt-manager.d.ts","sourceRoot":"","sources":["../../src/core/prompt-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;QACpC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE;YACT,GAAG,EAAE,MAAM,CAAC;YACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,IAAI,CAAC,EAAE,MAAM,CAAC;SACf,CAAC;KACH,CAAC;CACH;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,QAAQ,CAAW;gBAEf,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE;IAMpC;;OAEG;IACH,UAAU,IAAI,gBAAgB,EAAE;IA2BhC;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAc1F;;OAEG;YACW,4BAA4B;IA4D1C;;OAEG;YACW,0BAA0B;CAiEzC"}
@@ -1,186 +0,0 @@
1
- /**
2
- * Prompt Manager
3
- * 管理和生成 MCP Prompts
4
- */
5
- import { ContextAnalyzer } from './context-analyzer.js';
6
- import { OpenSpecCli } from './openspec-cli.js';
7
- import { QARunner } from './qa-runner.js';
8
- import path from 'path';
9
- import fs from 'fs/promises';
10
- export class PromptManager {
11
- analyzer;
12
- cli;
13
- qaRunner;
14
- constructor(options) {
15
- this.analyzer = new ContextAnalyzer({ cwd: options.cwd });
16
- this.cli = new OpenSpecCli({ cwd: options.cwd });
17
- this.qaRunner = new QARunner({ cwd: options.cwd });
18
- }
19
- /**
20
- * 获取所有可用的 Prompts 定义
21
- */
22
- getPrompts() {
23
- return [
24
- {
25
- name: 'analyze-project',
26
- description: '深度分析当前项目架构、技术栈和改进建议',
27
- arguments: [
28
- {
29
- name: 'focus',
30
- description: '分析重点: overview(默认), architecture, improvements, conventions',
31
- required: false,
32
- },
33
- ],
34
- },
35
- {
36
- name: 'review-change',
37
- description: '审查指定的变更 (Change),包含 Proposal, Specs 和 Tasks',
38
- arguments: [
39
- {
40
- name: 'changeId',
41
- description: 'Change ID (例如: feat-login)',
42
- required: true,
43
- },
44
- ],
45
- },
46
- ];
47
- }
48
- /**
49
- * 生成 Prompt 内容
50
- */
51
- async getPrompt(name, args = {}) {
52
- switch (name) {
53
- case 'analyze-project':
54
- return this.generateAnalyzeProjectPrompt(args.focus || 'overview');
55
- case 'review-change':
56
- if (!args.changeId) {
57
- throw new Error('Missing required argument: changeId');
58
- }
59
- return this.generateReviewChangePrompt(args.changeId);
60
- default:
61
- throw new Error(`Unknown prompt: ${name}`);
62
- }
63
- }
64
- /**
65
- * 生成 analyze-project prompt
66
- */
67
- async generateAnalyzeProjectPrompt(focus) {
68
- // 1. 获取静态分析结果
69
- const context = await this.analyzer.analyze();
70
- const projectMd = await this.analyzer.getProjectMd();
71
- const keyFiles = await this.analyzer.getKeyFiles();
72
- // 2. 构建上下文描述
73
- let contextDescription = `
74
- # Project Context
75
-
76
- ## Tech Stack
77
- - Languages: ${context.stack.languages.map(l => `${l.name} (${l.percentage}%)`).join(', ')}
78
- - Frameworks: ${context.stack.frameworks.join(', ')}
79
- - Package Manager: ${context.stack.packageManager}
80
- - Build Tools: ${context.stack.buildTools.join(', ')}
81
-
82
- ## Directory Structure
83
- ${context.structure.mainDirectories.map(d => `- ${d.name}/: ${d.purpose} (${d.fileCount} files)`).join('\n')}
84
-
85
- ## Patterns
86
- - Architecture: ${context.patterns.architecture}
87
- - Conventions: ${context.patterns.conventions.join(', ')}
88
- `;
89
- if (projectMd) {
90
- contextDescription += `\n## Current project.md\n\n${projectMd}\n`;
91
- }
92
- // 3. 构建用户指令
93
- let instruction = '';
94
- switch (focus) {
95
- case 'architecture':
96
- instruction = '请分析项目的整体架构风格、模块划分和依赖关系。指出潜在的架构风险和改进点。';
97
- break;
98
- case 'improvements':
99
- instruction = '请根据当前的技术栈和代码结构,提出具体的代码质量、性能或可维护性方面的改进建议。';
100
- break;
101
- case 'conventions':
102
- instruction = '请分析项目的目录结构和文件命名,总结当前的开发约定,并建议是否需要制定更严格的规范。';
103
- break;
104
- case 'overview':
105
- default:
106
- instruction = '请作为一名资深技术专家,对该项目进行全面的技术评审。请总结项目的核心功能、技术亮点,并给出后续开发的建议。如果项目缺少 `project.md`,请帮我生成一个。';
107
- break;
108
- }
109
- // 4. 组装消息
110
- const messages = [
111
- {
112
- role: 'user',
113
- content: {
114
- type: 'text',
115
- text: `${contextDescription}\n\nKey Files Content:\n${Object.entries(keyFiles).map(([path, content]) => `--- ${path} ---\n${content}\n`).join('\n')}\n\nTask: ${instruction}`,
116
- },
117
- },
118
- ];
119
- return messages;
120
- }
121
- /**
122
- * 生成 review-change prompt
123
- */
124
- async generateReviewChangePrompt(changeId) {
125
- // 1. 获取 Change 详情
126
- const change = await this.cli.showChange(changeId);
127
- if (!change) {
128
- throw new Error(`Change not found: ${changeId}`);
129
- }
130
- // 2. 获取 Specs
131
- const specsDir = path.join(this.cli['getOpenSpecDir'](), 'changes', changeId, 'specs');
132
- let specsContent = '';
133
- try {
134
- const entries = await fs.readdir(specsDir, { withFileTypes: true });
135
- for (const entry of entries) {
136
- if (entry.isFile() && entry.name.endsWith('.md')) {
137
- const content = await fs.readFile(path.join(specsDir, entry.name), 'utf-8');
138
- specsContent += `\n--- Spec: ${entry.name} ---\n${content}\n`;
139
- }
140
- }
141
- }
142
- catch {
143
- specsContent = 'No specs found.';
144
- }
145
- // 3. 获取 QA 状态
146
- const qaResult = await this.qaRunner.getLatestQAResult(changeId);
147
- const qaSummary = qaResult
148
- ? `QA Status: ${qaResult.summary.passed} passed, ${qaResult.summary.failed} failed. Last run: ${qaResult.startedAt}`
149
- : 'QA Status: Never run.';
150
- // 4. 构建上下文
151
- const contextDescription = `
152
- # Change Review: ${changeId}
153
-
154
- ## Metadata
155
- - Type: ${change.type || 'unknown'}
156
- - Status: ${change.status}
157
- - Created: ${change.createdAt}
158
-
159
- ## Proposal
160
- ${change.proposal}
161
-
162
- ${change.design ? `## Design\n${change.design}` : ''}
163
-
164
- ## Tasks
165
- ${change.tasks}
166
-
167
- ## Specs
168
- ${specsContent}
169
-
170
- ## Quality Assurance
171
- ${qaSummary}
172
- `;
173
- // 5. 组装消息
174
- const messages = [
175
- {
176
- role: 'user',
177
- content: {
178
- type: 'text',
179
- text: `${contextDescription}\n\nTask: 请审查这个变更 (Change)。\n1. 检查 Proposal 和 Specs 之间的一致性。\n2. 评估 Design 是否满足需求。\n3.基于 Tasks 列表,评估实施计划的完整性。\n4. 如果有 QA 失败,请给出修复建议。`,
180
- },
181
- },
182
- ];
183
- return messages;
184
- }
185
- }
186
- //# sourceMappingURL=prompt-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt-manager.js","sourceRoot":"","sources":["../../src/core/prompt-manager.ts"],"names":[],"mappings":"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"}
@@ -1,134 +0,0 @@
1
- /**
2
- * QA Runner - 质量循环模块
3
- *
4
- * 自动运行验证检查,发现问题后可触发修复循环:
5
- * - 语法检查 (syntax)
6
- * - 类型检查 (typecheck)
7
- * - Lint 检查 (lint)
8
- * - 测试运行 (test)
9
- * - 构建验证 (build)
10
- */
11
- /**
12
- * QA 检查类型
13
- */
14
- export type QACheckType = 'syntax' | 'typecheck' | 'lint' | 'test' | 'build';
15
- /**
16
- * QA 配置
17
- */
18
- export interface QAConfig {
19
- maxIterations: number;
20
- checks: QACheckType[];
21
- autoFix: boolean;
22
- timeout: number;
23
- commands?: Partial<Record<QACheckType, string>>;
24
- }
25
- /**
26
- * 单次检查结果
27
- */
28
- export interface QACheckResult {
29
- type: QACheckType;
30
- status: 'passed' | 'failed' | 'skipped' | 'timeout';
31
- output?: string;
32
- errors?: string[];
33
- duration: number;
34
- }
35
- /**
36
- * QA 运行状态
37
- */
38
- export type QAStatus = 'pending' | 'running' | 'passed' | 'failed' | 'fixing' | 'timeout' | 'stopped';
39
- /**
40
- * QA 运行结果
41
- */
42
- export interface QAResult {
43
- id: string;
44
- changeName: string;
45
- status: QAStatus;
46
- iteration: number;
47
- maxIterations: number;
48
- checks: QACheckResult[];
49
- startedAt: string;
50
- completedAt?: string;
51
- summary: {
52
- total: number;
53
- passed: number;
54
- failed: number;
55
- skipped: number;
56
- };
57
- }
58
- /**
59
- * QARunner 主类
60
- */
61
- export declare class QARunner {
62
- private cwd;
63
- private config;
64
- private runningQA;
65
- constructor(options?: {
66
- cwd?: string;
67
- config?: Partial<QAConfig>;
68
- });
69
- /**
70
- * 获取 QA 结果存储目录
71
- */
72
- private getQADir;
73
- /**
74
- * 获取变更目录
75
- */
76
- private getChangeDir;
77
- /**
78
- * ID 安全校验
79
- */
80
- private ensureSafeId;
81
- /**
82
- * 确保目录存在
83
- */
84
- private ensureDir;
85
- /**
86
- * 运行 QA 检查
87
- */
88
- runQA(changeName: string, options?: {
89
- checks?: QACheckType[];
90
- }): Promise<QAResult>;
91
- /**
92
- * 运行单个检查
93
- */
94
- private runCheck;
95
- /**
96
- * 获取 QA 状态
97
- */
98
- getQAStatus(changeName: string): Promise<QAResult | null>;
99
- /**
100
- * 获取 QA 历史
101
- */
102
- getQAHistory(changeName: string, limit?: number): Promise<QAResult[]>;
103
- /**
104
- * 获取最新 QA 结果
105
- */
106
- getLatestQAResult(changeName: string): Promise<QAResult | null>;
107
- /**
108
- * 停止正在运行的 QA
109
- */
110
- stopQA(changeName: string): Promise<boolean>;
111
- /**
112
- * 检查 QA 是否正在运行
113
- */
114
- isRunning(changeName: string): boolean;
115
- /**
116
- * 保存 QA 结果
117
- */
118
- private saveQAResult;
119
- /**
120
- * 获取进度汇总(所有变更)
121
- */
122
- getQASummary(): Promise<{
123
- total: number;
124
- passed: number;
125
- failed: number;
126
- running: number;
127
- changes: Array<{
128
- name: string;
129
- status: QAStatus;
130
- lastRun?: string;
131
- }>;
132
- }>;
133
- }
134
- //# sourceMappingURL=qa-runner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"qa-runner.d.ts","sourceRoot":"","sources":["../../src/core/qa-runner.ts"],"names":[],"mappings":"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"}