@mengzf/skillflow-mcp 0.0.0-stage → 1.0.1

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 (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +279 -2
  3. package/dist/adapters/claude-code.adapter.d.ts +10 -0
  4. package/dist/adapters/claude-code.adapter.d.ts.map +1 -0
  5. package/dist/adapters/claude-code.adapter.js +166 -0
  6. package/dist/adapters/claude-code.adapter.js.map +1 -0
  7. package/dist/adapters/codex.adapter.d.ts +10 -0
  8. package/dist/adapters/codex.adapter.d.ts.map +1 -0
  9. package/dist/adapters/codex.adapter.js +109 -0
  10. package/dist/adapters/codex.adapter.js.map +1 -0
  11. package/dist/adapters/dsh.adapter.d.ts +7 -0
  12. package/dist/adapters/dsh.adapter.d.ts.map +1 -0
  13. package/dist/adapters/dsh.adapter.js +60 -0
  14. package/dist/adapters/dsh.adapter.js.map +1 -0
  15. package/dist/adapters/qoder.adapter.d.ts +10 -0
  16. package/dist/adapters/qoder.adapter.d.ts.map +1 -0
  17. package/dist/adapters/qoder.adapter.js +119 -0
  18. package/dist/adapters/qoder.adapter.js.map +1 -0
  19. package/dist/adapters/trae.adapter.d.ts +8 -0
  20. package/dist/adapters/trae.adapter.d.ts.map +1 -0
  21. package/dist/adapters/trae.adapter.js +104 -0
  22. package/dist/adapters/trae.adapter.js.map +1 -0
  23. package/dist/adapters/types.d.ts +25 -0
  24. package/dist/adapters/types.d.ts.map +1 -0
  25. package/dist/adapters/types.js +2 -0
  26. package/dist/adapters/types.js.map +1 -0
  27. package/dist/adapters/universal.sync.d.ts +22 -0
  28. package/dist/adapters/universal.sync.d.ts.map +1 -0
  29. package/dist/adapters/universal.sync.js +140 -0
  30. package/dist/adapters/universal.sync.js.map +1 -0
  31. package/dist/adapters/workbuddy.sniffer.d.ts +22 -0
  32. package/dist/adapters/workbuddy.sniffer.d.ts.map +1 -0
  33. package/dist/adapters/workbuddy.sniffer.js +148 -0
  34. package/dist/adapters/workbuddy.sniffer.js.map +1 -0
  35. package/dist/config.d.ts +9 -0
  36. package/dist/config.d.ts.map +1 -0
  37. package/dist/config.js +33 -0
  38. package/dist/config.js.map +1 -0
  39. package/dist/db/index.d.ts +4 -0
  40. package/dist/db/index.d.ts.map +1 -0
  41. package/dist/db/index.js +39 -0
  42. package/dist/db/index.js.map +1 -0
  43. package/dist/db/invocation-filter.d.ts +29 -0
  44. package/dist/db/invocation-filter.d.ts.map +1 -0
  45. package/dist/db/invocation-filter.js +78 -0
  46. package/dist/db/invocation-filter.js.map +1 -0
  47. package/dist/db/schema.d.ts +3 -0
  48. package/dist/db/schema.d.ts.map +1 -0
  49. package/dist/db/schema.js +129 -0
  50. package/dist/db/schema.js.map +1 -0
  51. package/dist/db/seed.d.ts +15 -0
  52. package/dist/db/seed.d.ts.map +1 -0
  53. package/dist/db/seed.js +128 -0
  54. package/dist/db/seed.js.map +1 -0
  55. package/dist/index.d.ts +3 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +51 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/server.d.ts +7 -0
  60. package/dist/server.d.ts.map +1 -0
  61. package/dist/server.js +372 -0
  62. package/dist/server.js.map +1 -0
  63. package/dist/services/benchmark.service.d.ts +27 -0
  64. package/dist/services/benchmark.service.d.ts.map +1 -0
  65. package/dist/services/benchmark.service.js +94 -0
  66. package/dist/services/benchmark.service.js.map +1 -0
  67. package/dist/services/dashboard.service.d.ts +14 -0
  68. package/dist/services/dashboard.service.d.ts.map +1 -0
  69. package/dist/services/dashboard.service.js +296 -0
  70. package/dist/services/dashboard.service.js.map +1 -0
  71. package/dist/services/filter.service.d.ts +26 -0
  72. package/dist/services/filter.service.d.ts.map +1 -0
  73. package/dist/services/filter.service.js +103 -0
  74. package/dist/services/filter.service.js.map +1 -0
  75. package/dist/services/impact.service.d.ts +20 -0
  76. package/dist/services/impact.service.d.ts.map +1 -0
  77. package/dist/services/impact.service.js +114 -0
  78. package/dist/services/impact.service.js.map +1 -0
  79. package/dist/services/telemetry.service.d.ts +41 -0
  80. package/dist/services/telemetry.service.d.ts.map +1 -0
  81. package/dist/services/telemetry.service.js +244 -0
  82. package/dist/services/telemetry.service.js.map +1 -0
  83. package/dist/types/index.d.ts +3 -0
  84. package/dist/types/index.d.ts.map +1 -0
  85. package/dist/types/index.js +3 -0
  86. package/dist/types/index.js.map +1 -0
  87. package/dist/types/models.d.ts +73 -0
  88. package/dist/types/models.d.ts.map +1 -0
  89. package/dist/types/models.js +2 -0
  90. package/dist/types/models.js.map +1 -0
  91. package/dist/types/tools.d.ts +173 -0
  92. package/dist/types/tools.d.ts.map +1 -0
  93. package/dist/types/tools.js +195 -0
  94. package/dist/types/tools.js.map +1 -0
  95. package/dist/utils/ascii-chart.d.ts +9 -0
  96. package/dist/utils/ascii-chart.d.ts.map +1 -0
  97. package/dist/utils/ascii-chart.js +29 -0
  98. package/dist/utils/ascii-chart.js.map +1 -0
  99. package/dist/utils/formatter.d.ts +6 -0
  100. package/dist/utils/formatter.d.ts.map +1 -0
  101. package/dist/utils/formatter.js +29 -0
  102. package/dist/utils/formatter.js.map +1 -0
  103. package/dist/utils/governance.d.ts +25 -0
  104. package/dist/utils/governance.d.ts.map +1 -0
  105. package/dist/utils/governance.js +70 -0
  106. package/dist/utils/governance.js.map +1 -0
  107. package/dist/utils/hours.d.ts +3 -0
  108. package/dist/utils/hours.d.ts.map +1 -0
  109. package/dist/utils/hours.js +15 -0
  110. package/dist/utils/hours.js.map +1 -0
  111. package/dist/utils/pricing.d.ts +19 -0
  112. package/dist/utils/pricing.d.ts.map +1 -0
  113. package/dist/utils/pricing.js +96 -0
  114. package/dist/utils/pricing.js.map +1 -0
  115. package/dist/utils/quality.d.ts +15 -0
  116. package/dist/utils/quality.d.ts.map +1 -0
  117. package/dist/utils/quality.js +47 -0
  118. package/dist/utils/quality.js.map +1 -0
  119. package/dist/web/render.d.ts +2 -0
  120. package/dist/web/render.d.ts.map +1 -0
  121. package/dist/web/render.js +1919 -0
  122. package/dist/web/render.js.map +1 -0
  123. package/dist/web/server.d.ts +10 -0
  124. package/dist/web/server.d.ts.map +1 -0
  125. package/dist/web/server.js +160 -0
  126. package/dist/web/server.js.map +1 -0
  127. package/package.json +51 -4
@@ -0,0 +1,128 @@
1
+ export const DEFAULT_SKILL_BENCHMARKS = [
2
+ {
3
+ skill_id: 'frontend-design',
4
+ skill_name: 'Frontend Design',
5
+ category: 'design',
6
+ description: 'Production-grade UI, responsive styling, and accessibility standards',
7
+ baseline_steps: 10,
8
+ baseline_tokens: 5000,
9
+ default_saved_steps: 8,
10
+ default_saved_tokens: 3800,
11
+ tags: ['ui', 'frontend', 'css', 'react', 'design'],
12
+ },
13
+ {
14
+ skill_id: 'code-review',
15
+ skill_name: 'Code Review',
16
+ category: 'engineering',
17
+ description: 'Multi-file defect scan, cleanups, and architectural checklist',
18
+ baseline_steps: 12,
19
+ baseline_tokens: 6500,
20
+ default_saved_steps: 10,
21
+ default_saved_tokens: 5000,
22
+ tags: ['review', 'quality', 'clean-code', 'bugs'],
23
+ },
24
+ {
25
+ skill_id: 'simplify',
26
+ skill_name: 'Code Simplification',
27
+ category: 'engineering',
28
+ description: 'Refactoring, dead-code removal, and structural clarity cleanups',
29
+ baseline_steps: 8,
30
+ baseline_tokens: 4000,
31
+ default_saved_steps: 6,
32
+ default_saved_tokens: 2800,
33
+ tags: ['refactor', 'simplify', 'clean-code'],
34
+ },
35
+ {
36
+ skill_id: 'security-review',
37
+ skill_name: 'Security Review',
38
+ category: 'security',
39
+ description: 'Vulnerability audit, permission verification, and dependency checks',
40
+ baseline_steps: 14,
41
+ baseline_tokens: 7500,
42
+ default_saved_steps: 12,
43
+ default_saved_tokens: 5800,
44
+ tags: ['security', 'audit', 'vulnerabilities', 'auth'],
45
+ },
46
+ {
47
+ skill_id: 'docx',
48
+ skill_name: 'Word Document Generator',
49
+ category: 'documentation',
50
+ description: 'Formatted DOCX generation with tables, headings, and document styling',
51
+ baseline_steps: 8,
52
+ baseline_tokens: 4200,
53
+ default_saved_steps: 6,
54
+ default_saved_tokens: 3000,
55
+ tags: ['docx', 'document', 'report', 'office'],
56
+ },
57
+ {
58
+ skill_id: 'xlsx',
59
+ skill_name: 'Excel Spreadsheet Generator',
60
+ category: 'data',
61
+ description: 'Spreadsheet creation with formulas, number formatting, and multi-sheet layouts',
62
+ baseline_steps: 8,
63
+ baseline_tokens: 4200,
64
+ default_saved_steps: 6,
65
+ default_saved_tokens: 3000,
66
+ tags: ['excel', 'xlsx', 'spreadsheet', 'data'],
67
+ },
68
+ {
69
+ skill_id: 'pptx',
70
+ skill_name: 'Presentation Builder',
71
+ category: 'presentation',
72
+ description: 'Multi-slide presentation deck creation with structured templates',
73
+ baseline_steps: 10,
74
+ baseline_tokens: 5500,
75
+ default_saved_steps: 8,
76
+ default_saved_tokens: 4200,
77
+ tags: ['pptx', 'slides', 'presentation', 'pitch'],
78
+ },
79
+ {
80
+ skill_id: 'pdf-reading',
81
+ skill_name: 'PDF Inspector & Extractor',
82
+ category: 'analysis',
83
+ description: 'Page range extraction, structured table parsing, and layout OCR',
84
+ baseline_steps: 6,
85
+ baseline_tokens: 3500,
86
+ default_saved_steps: 4,
87
+ default_saved_tokens: 2400,
88
+ tags: ['pdf', 'parser', 'ocr', 'document'],
89
+ },
90
+ {
91
+ skill_id: 'dataviz',
92
+ skill_name: 'Data Visualization Engine',
93
+ category: 'visualization',
94
+ description: 'Branded charts, responsive SVGs, and data dashboard code generation',
95
+ baseline_steps: 9,
96
+ baseline_tokens: 4800,
97
+ default_saved_steps: 7,
98
+ default_saved_tokens: 3500,
99
+ tags: ['charts', 'graphs', 'dashboard', 'dataviz', 'svg'],
100
+ },
101
+ {
102
+ skill_id: 'workflow-authoring',
103
+ skill_name: 'Workflow Script Author',
104
+ category: 'automation',
105
+ description: 'Multi-agent orchestration scripts, resume hooks, and pipeline automation',
106
+ baseline_steps: 10,
107
+ baseline_tokens: 5000,
108
+ default_saved_steps: 8,
109
+ default_saved_tokens: 3800,
110
+ tags: ['workflow', 'automation', 'pipeline', 'multi-agent'],
111
+ },
112
+ ];
113
+ export function seedDefaultSkills(db) {
114
+ const countRow = db.prepare('SELECT COUNT(*) as count FROM skills_manifest').get();
115
+ if (countRow && countRow.count > 0) {
116
+ return; // Already seeded
117
+ }
118
+ const insertStmt = db.prepare(`
119
+ INSERT INTO skills_manifest (
120
+ skill_id, skill_name, category, description,
121
+ baseline_steps, baseline_tokens, default_saved_steps, default_saved_tokens, tags
122
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
123
+ `);
124
+ for (const s of DEFAULT_SKILL_BENCHMARKS) {
125
+ insertStmt.run(s.skill_id, s.skill_name, s.category, s.description, s.baseline_steps, s.baseline_tokens, s.default_saved_steps, s.default_saved_tokens, JSON.stringify(s.tags));
126
+ }
127
+ }
128
+ //# sourceMappingURL=seed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/db/seed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { getDatabase, closeDatabase } from './db/index.js';
4
+ import { createMcpServer } from './server.js';
5
+ import { getConfig } from './config.js';
6
+ import { startWebServer } from './web/server.js';
7
+ async function main() {
8
+ const config = getConfig();
9
+ process.stderr.write(`[SkillFlow MCP] Starting server with database: ${config.dbPath}\n`);
10
+ const db = getDatabase(config.dbPath);
11
+ let webInstance = null;
12
+ if (config.enableWeb) {
13
+ try {
14
+ webInstance = await startWebServer(db, config.webPort);
15
+ }
16
+ catch (err) {
17
+ process.stderr.write(`[SkillFlow Web] Warning: Failed to start web dashboard: ${err.message}\n`);
18
+ }
19
+ }
20
+ const server = createMcpServer(db, {
21
+ webUrl: webInstance ? webInstance.url : undefined,
22
+ });
23
+ const transport = new StdioServerTransport();
24
+ const shutdown = async () => {
25
+ process.stderr.write('[SkillFlow MCP] Shutting down gracefully...\n');
26
+ if (webInstance) {
27
+ await webInstance.close();
28
+ }
29
+ closeDatabase();
30
+ process.exit(0);
31
+ };
32
+ process.on('SIGINT', shutdown);
33
+ process.on('SIGTERM', shutdown);
34
+ try {
35
+ await server.connect(transport);
36
+ process.stderr.write('[SkillFlow MCP] Connected via stdio transport. Ready for requests.\n');
37
+ }
38
+ catch (error) {
39
+ process.stderr.write(`[SkillFlow MCP] Fatal connection error: ${error.message}\n`);
40
+ if (webInstance) {
41
+ await webInstance.close();
42
+ }
43
+ closeDatabase();
44
+ process.exit(1);
45
+ }
46
+ }
47
+ main().catch((err) => {
48
+ process.stderr.write(`[SkillFlow MCP] Unhandled startup exception: ${err.message}\n`);
49
+ process.exit(1);
50
+ });
51
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAqB,MAAM,iBAAiB,CAAC;AAEpE,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kDAAkD,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAE1F,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,WAAW,GAA6B,IAAI,CAAC;IAEjD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2DAA2D,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;QACnG,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,EAAE;QACjC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;KAClD,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACtE,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC;QACD,aAAa,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAC/F,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QACnF,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC;QACD,aAAa,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gDAAgD,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;IACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { DatabaseSync } from 'node:sqlite';
3
+ export interface McpServerOptions {
4
+ webUrl?: string;
5
+ }
6
+ export declare function createMcpServer(db: DatabaseSync, options?: McpServerOptions): McpServer;
7
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAS3C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,GAAE,gBAAqB,GAAG,SAAS,CA8Z3F"}
package/dist/server.js ADDED
@@ -0,0 +1,372 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { z } from 'zod';
3
+ import { TelemetryService } from './services/telemetry.service.js';
4
+ import { ImpactService } from './services/impact.service.js';
5
+ import { DashboardService } from './services/dashboard.service.js';
6
+ import { BenchmarkService } from './services/benchmark.service.js';
7
+ import { renderDashboardHtml } from './web/render.js';
8
+ import { UniversalHistorySync } from './adapters/universal.sync.js';
9
+ export function createMcpServer(db, options = {}) {
10
+ const server = new McpServer({
11
+ name: 'skillflow-mcp',
12
+ version: '1.0.0',
13
+ });
14
+ const telemetryService = new TelemetryService(db);
15
+ const impactService = new ImpactService(db);
16
+ const dashboardService = new DashboardService(db);
17
+ const benchmarkService = new BenchmarkService(db);
18
+ const universalSync = new UniversalHistorySync(db);
19
+ const webUrl = options.webUrl || 'http://localhost:3000';
20
+ // Initial auto-sync from host agents
21
+ try {
22
+ universalSync.syncAll();
23
+ }
24
+ catch { }
25
+ // -------------------------------------------------------------
26
+ // MCP Resources
27
+ // -------------------------------------------------------------
28
+ // 1. Resource: HTML Visual Dashboard
29
+ server.resource('dashboard-html', 'skillflow://dashboard', async (uri) => ({
30
+ contents: [
31
+ {
32
+ uri: uri.href,
33
+ text: renderDashboardHtml(),
34
+ mimeType: 'text/html',
35
+ },
36
+ ],
37
+ }));
38
+ // 2. Resource: Raw Analytics JSON
39
+ server.resource('analytics-json', 'skillflow://analytics.json', async (uri) => {
40
+ const data = dashboardService.getDashboard({ time_range: 'all' }).data;
41
+ return {
42
+ contents: [
43
+ {
44
+ uri: uri.href,
45
+ text: JSON.stringify(data, null, 2),
46
+ mimeType: 'application/json',
47
+ },
48
+ ],
49
+ };
50
+ });
51
+ // 3. Resource: Skills Manifest Catalog JSON
52
+ server.resource('skills-catalog', 'skillflow://skills', async (uri) => {
53
+ const list = benchmarkService.listBenchmarks();
54
+ return {
55
+ contents: [
56
+ {
57
+ uri: uri.href,
58
+ text: JSON.stringify(list, null, 2),
59
+ mimeType: 'application/json',
60
+ },
61
+ ],
62
+ };
63
+ });
64
+ // -------------------------------------------------------------
65
+ // MCP Tools
66
+ // -------------------------------------------------------------
67
+ // 1. Tool: record_skill_hit
68
+ server.tool('record_skill_hit', '主动记录或上报一次 Skill 激活命中事件,并根据预设基准模型自动核算节省的流程步骤与 Token', {
69
+ session_id: z.string().describe('唯一会话标识符 (例如 sess-20261111-01)'),
70
+ skill_id: z.string().describe("命中的 Skill 唯一标识 (例如 'code-review', 'frontend-design')"),
71
+ agent_name: z
72
+ .string()
73
+ .optional()
74
+ .describe("调用的 Agent 名称 (例如 'Claude Code', 'Trae', 'Qoder', 'WorkBuddy', 'Codex', 'DSH')"),
75
+ model_name: z
76
+ .string()
77
+ .optional()
78
+ .describe("调用的模型名称 (例如 'deepseek-v4.1-flash', 'claude-3-5-sonnet', 'gpt-4o')"),
79
+ round_index: z
80
+ .number()
81
+ .int()
82
+ .min(1)
83
+ .optional()
84
+ .describe('当前对话所在的轮次 (默认为 1 或自动递增)'),
85
+ status: z
86
+ .enum(['success', 'failed', 'partial', 'skipped'])
87
+ .optional()
88
+ .describe("执行结果状态: 'success'(成功), 'failed'(失败), 'partial'(部分完成), 'skipped'(跳过)"),
89
+ actual_tokens: z
90
+ .number()
91
+ .int()
92
+ .min(0)
93
+ .optional()
94
+ .describe('本次技能执行实际耗费的 Token (若不传默认为 0)'),
95
+ actual_steps: z
96
+ .number()
97
+ .int()
98
+ .min(0)
99
+ .optional()
100
+ .describe('本次技能执行花费的步骤数 (通常为 1)'),
101
+ saved_steps: z
102
+ .number()
103
+ .int()
104
+ .optional()
105
+ .describe('显式指定的节省步骤 (若不传则基于技能基准模型自动估算)'),
106
+ saved_tokens: z
107
+ .number()
108
+ .int()
109
+ .optional()
110
+ .describe('显式指定的节省 Token (若不传则基于技能基准模型自动估算)'),
111
+ execution_time_ms: z
112
+ .number()
113
+ .int()
114
+ .min(0)
115
+ .optional()
116
+ .describe('执行毫秒耗时'),
117
+ metadata: z
118
+ .record(z.any())
119
+ .optional()
120
+ .describe('附加元数据 (如目标文件、报错信息、Prompt 摘要等)'),
121
+ }, async (args) => {
122
+ try {
123
+ const result = telemetryService.recordHit({
124
+ session_id: args.session_id,
125
+ skill_id: args.skill_id,
126
+ agent_name: args.agent_name || 'unknown',
127
+ model_name: args.model_name || 'unknown',
128
+ round_index: args.round_index,
129
+ status: args.status || 'success',
130
+ actual_tokens: args.actual_tokens ?? 0,
131
+ actual_steps: args.actual_steps ?? 1,
132
+ saved_steps: args.saved_steps,
133
+ saved_tokens: args.saved_tokens,
134
+ execution_time_ms: args.execution_time_ms ?? 0,
135
+ metadata: args.metadata,
136
+ });
137
+ const textOutput = `✅ 已成功记录 Skill 命中事件 [${result.skill_name}]:
138
+ - 会话 ID: \`${result.session_id}\` (Round #${result.round_index})
139
+ - 宿主生态: \`${result.agent_name}\` (模型: \`${result.model_name}\`)
140
+ - 状态: \`${result.status}\`
141
+ - 流程与工时: 节省 **+${result.saved_steps} 步** | 节省人工约 **+${result.saved_hours} 小时**
142
+ - 价值折算: 节省 **+${result.saved_tokens} Tokens** (约 ¥${result.cost_saved_cny.toFixed(2)} / $${result.cost_saved_usd.toFixed(2)})
143
+ - 会话累计: 已触发 ${result.session.total_invocations} 次,累计节省 +${result.session.total_saved_steps} 步 / +${result.session.total_saved_tokens} Tokens`;
144
+ return {
145
+ content: [{ type: 'text', text: textOutput }],
146
+ };
147
+ }
148
+ catch (err) {
149
+ return {
150
+ isError: true,
151
+ content: [{ type: 'text', text: `❌ 记录 Skill 命中失败: ${err.message}` }],
152
+ };
153
+ }
154
+ });
155
+ // 2. Tool: get_round_skill_impact
156
+ server.tool('get_round_skill_impact', '查看当前会话或指定某轮对话中 Skill 的命中情况、命中了哪些技能,以及带来的流程步骤与 Token 节省收益报告', {
157
+ session_id: z
158
+ .string()
159
+ .optional()
160
+ .describe('要查询的会话 ID (若不传则自动取最近一次活跃会话)'),
161
+ round_index: z
162
+ .number()
163
+ .int()
164
+ .min(1)
165
+ .optional()
166
+ .describe('要查询的具体对话轮次 (若不传则查看最新一轮)'),
167
+ include_session_summary: z
168
+ .boolean()
169
+ .optional()
170
+ .describe('是否在报告末尾附加整个会话的累计效能看板 (默认 true)'),
171
+ }, async (args) => {
172
+ try {
173
+ universalSync.triggerBackgroundSync();
174
+ const result = impactService.getRoundImpact({
175
+ session_id: args.session_id,
176
+ round_index: args.round_index,
177
+ include_session_summary: args.include_session_summary ?? true,
178
+ });
179
+ return {
180
+ content: [{ type: 'text', text: result.markdown }],
181
+ };
182
+ }
183
+ catch (err) {
184
+ return {
185
+ isError: true,
186
+ content: [{ type: 'text', text: `❌ 获取轮次影响报告失败: ${err.message}` }],
187
+ };
188
+ }
189
+ });
190
+ // 3. Tool: get_skill_dashboard
191
+ server.tool('get_skill_dashboard', '获取全景 Skill 效能统计看板,支持按当前对话、今日、最近7天、全量历史等多时间维度,以及按 Agent (Trae, Claude Code, Qoder 等)、Skill、执行模型、执行状态筛选并分组统计', {
192
+ time_range: z
193
+ .enum(['current_session', 'today', '7days', '30days', 'all'])
194
+ .optional()
195
+ .describe("统计时间窗口: 'current_session'(当前会话), 'today'(今日), '7days'(近7天), '30days'(近30天), 'all'(全历史)"),
196
+ session_id: z
197
+ .string()
198
+ .optional()
199
+ .describe("指定会话 ID (当 time_range 为 'current_session' 时可指定)"),
200
+ agent_name: z
201
+ .string()
202
+ .optional()
203
+ .describe("按特定 Agent 筛选 (如 'Trae', 'Claude Code', 'Qoder', 'WorkBuddy')"),
204
+ skill_id: z
205
+ .string()
206
+ .optional()
207
+ .describe('按特定 Skill 筛选'),
208
+ model_name: z
209
+ .string()
210
+ .optional()
211
+ .describe("按执行模型筛选 (如 'claude-sonnet-4.5', 'gpt-5')"),
212
+ status: z
213
+ .enum(['success', 'failed', 'partial', 'skipped'])
214
+ .optional()
215
+ .describe('按执行状态筛选'),
216
+ group_by: z
217
+ .enum(['skill', 'agent', 'category', 'date'])
218
+ .optional()
219
+ .describe('主要聚合分组维度 (默认为 skill)'),
220
+ }, async (args) => {
221
+ try {
222
+ universalSync.triggerBackgroundSync();
223
+ const result = dashboardService.getDashboard({
224
+ time_range: args.time_range || 'all',
225
+ session_id: args.session_id,
226
+ agent_name: args.agent_name,
227
+ skill_id: args.skill_id,
228
+ model_name: args.model_name,
229
+ status: args.status,
230
+ group_by: args.group_by || 'skill',
231
+ });
232
+ return {
233
+ content: [{ type: 'text', text: result.markdown }],
234
+ };
235
+ }
236
+ catch (err) {
237
+ return {
238
+ isError: true,
239
+ content: [{ type: 'text', text: `❌ 获取效能看板失败: ${err.message}` }],
240
+ };
241
+ }
242
+ });
243
+ // 4. Tool: manage_skill_benchmark
244
+ server.tool('manage_skill_benchmark', '管理 Skill 基准模型库 (查看清单、更新基准步骤与 Token、新增自定义 Skill 基准配置)', {
245
+ action: z
246
+ .enum(['list', 'get', 'set', 'delete', 'reset_defaults'])
247
+ .describe("操作类型: 'list'(列表), 'get'(详情), 'set'(新增或更新), 'delete'(删除), 'reset_defaults'(恢复预设)"),
248
+ skill_id: z
249
+ .string()
250
+ .optional()
251
+ .describe("Skill ID (用于 get, set, delete)"),
252
+ skill_name: z
253
+ .string()
254
+ .optional()
255
+ .describe('Skill 显示名称'),
256
+ category: z
257
+ .string()
258
+ .optional()
259
+ .describe("分类 (如 'engineering', 'design', 'security', 'documentation', 'data', 'utility')"),
260
+ description: z
261
+ .string()
262
+ .optional()
263
+ .describe('技能职责描述'),
264
+ baseline_steps: z
265
+ .number()
266
+ .int()
267
+ .min(1)
268
+ .optional()
269
+ .describe('无此技能时人工/自主探索预估基准步骤数'),
270
+ baseline_tokens: z
271
+ .number()
272
+ .int()
273
+ .min(100)
274
+ .optional()
275
+ .describe('无此技能时预估消耗的基准 Token 量'),
276
+ default_saved_steps: z
277
+ .number()
278
+ .int()
279
+ .min(1)
280
+ .optional()
281
+ .describe('预计平均节省的步骤数'),
282
+ default_saved_tokens: z
283
+ .number()
284
+ .int()
285
+ .min(50)
286
+ .optional()
287
+ .describe('预计平均节省的 Token 数'),
288
+ tags: z
289
+ .array(z.string())
290
+ .optional()
291
+ .describe('标签列表'),
292
+ }, async (args) => {
293
+ try {
294
+ if (args.action === 'list') {
295
+ const list = benchmarkService.listBenchmarks(args.category);
296
+ let text = `### 📚 已注册 Skill 基准库 (${list.length} 个)\n\n`;
297
+ text += `| Skill ID | 名称 | 分类 | 基准步骤 | 基准 Token | 预设节省步骤 | 预设节省 Token |\n`;
298
+ text += `| :--- | :--- | :---: | :---: | :---: | :---: | :---: |\n`;
299
+ for (const s of list) {
300
+ text += `| \`${s.skill_id}\` | **${s.skill_name}** | ${s.category} | ${s.baseline_steps} 步 | ${s.baseline_tokens} Tokens | +${s.default_saved_steps} 步 | +${s.default_saved_tokens} Tokens |\n`;
301
+ }
302
+ return { content: [{ type: 'text', text }] };
303
+ }
304
+ if (args.action === 'get') {
305
+ if (!args.skill_id) {
306
+ return { isError: true, content: [{ type: 'text', text: "❌ 'get' 操作必须提供 skill_id" }] };
307
+ }
308
+ const item = benchmarkService.getBenchmark(args.skill_id);
309
+ if (!item) {
310
+ return { content: [{ type: 'text', text: `未找到 ID 为 \`${args.skill_id}\` 的 Skill 基准。` }] };
311
+ }
312
+ return {
313
+ content: [{ type: 'text', text: JSON.stringify(item, null, 2) }],
314
+ };
315
+ }
316
+ if (args.action === 'set') {
317
+ if (!args.skill_id) {
318
+ return { isError: true, content: [{ type: 'text', text: "❌ 'set' 操作必须提供 skill_id" }] };
319
+ }
320
+ const updated = benchmarkService.setBenchmark({
321
+ skill_id: args.skill_id,
322
+ skill_name: args.skill_name,
323
+ category: args.category,
324
+ description: args.description,
325
+ baseline_steps: args.baseline_steps,
326
+ baseline_tokens: args.baseline_tokens,
327
+ default_saved_steps: args.default_saved_steps,
328
+ default_saved_tokens: args.default_saved_tokens,
329
+ tags: args.tags,
330
+ });
331
+ return {
332
+ content: [{ type: 'text', text: `✅ 已成功配置 Skill 基准 [\`${updated.skill_id}\` - ${updated.skill_name}]` }],
333
+ };
334
+ }
335
+ if (args.action === 'delete') {
336
+ if (!args.skill_id) {
337
+ return { isError: true, content: [{ type: 'text', text: "❌ 'delete' 操作必须提供 skill_id" }] };
338
+ }
339
+ const delRes = benchmarkService.deleteBenchmark(args.skill_id);
340
+ return {
341
+ isError: !delRes.success,
342
+ content: [{ type: 'text', text: delRes.message }],
343
+ };
344
+ }
345
+ if (args.action === 'reset_defaults') {
346
+ const res = benchmarkService.resetDefaults();
347
+ return {
348
+ content: [{ type: 'text', text: `✅ 已重置为系统预设基准库 (共 ${res.resetCount} 个标准 Skill)` }],
349
+ };
350
+ }
351
+ return {
352
+ isError: true,
353
+ content: [{ type: 'text', text: `未知操作: ${args.action}` }],
354
+ };
355
+ }
356
+ catch (err) {
357
+ return {
358
+ isError: true,
359
+ content: [{ type: 'text', text: `❌ 管理基准库失败: ${err.message}` }],
360
+ };
361
+ }
362
+ });
363
+ // 5. Tool: get_web_dashboard_url
364
+ server.tool('get_web_dashboard_url', '获取 SkillFlow 本地 Web 可视化看板的访问地址及运行状态', {}, async () => {
365
+ const msg = `🌐 **SkillFlow Web 可视化看板**\n\n- **访问地址**: [${webUrl}](${webUrl})\n- **功能**: 交互式图表、实时调用流水、Top 技能步骤与 Token 节省排行、各 Agent 占比分布\n- **自动刷新**: 页面内置 5 秒实时刷新`;
366
+ return {
367
+ content: [{ type: 'text', text: msg }],
368
+ };
369
+ });
370
+ return server;
371
+ }
372
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { DatabaseSync } from 'node:sqlite';
2
+ import { SkillManifestRow } from '../types/models.js';
3
+ export declare class BenchmarkService {
4
+ private db;
5
+ constructor(db: DatabaseSync);
6
+ listBenchmarks(category?: string, search?: string): SkillManifestRow[];
7
+ getBenchmark(skillId: string): SkillManifestRow | undefined;
8
+ setBenchmark(data: {
9
+ skill_id: string;
10
+ skill_name?: string;
11
+ category?: string;
12
+ description?: string;
13
+ baseline_steps?: number;
14
+ baseline_tokens?: number;
15
+ default_saved_steps?: number;
16
+ default_saved_tokens?: number;
17
+ tags?: string[];
18
+ }): SkillManifestRow;
19
+ deleteBenchmark(skillId: string): {
20
+ success: boolean;
21
+ message: string;
22
+ };
23
+ resetDefaults(): {
24
+ resetCount: number;
25
+ };
26
+ }
27
+ //# sourceMappingURL=benchmark.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.service.d.ts","sourceRoot":"","sources":["../../src/services/benchmark.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,qBAAa,gBAAgB;IACf,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,YAAY;IAEpC,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAmBtE,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAM3D,YAAY,CAAC,IAAI,EAAE;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KACjB,GAAG,gBAAgB;IA6DpB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAqBvE,aAAa,IAAI;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE;CAKxC"}