@mengzf/skillflow-mcp 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +238 -2
  3. package/dist/adapters/workbuddy.sniffer.d.ts +22 -0
  4. package/dist/adapters/workbuddy.sniffer.d.ts.map +1 -0
  5. package/dist/adapters/workbuddy.sniffer.js +143 -0
  6. package/dist/adapters/workbuddy.sniffer.js.map +1 -0
  7. package/dist/config.d.ts +9 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +33 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/db/index.d.ts +4 -0
  12. package/dist/db/index.d.ts.map +1 -0
  13. package/dist/db/index.js +39 -0
  14. package/dist/db/index.js.map +1 -0
  15. package/dist/db/schema.d.ts +3 -0
  16. package/dist/db/schema.d.ts.map +1 -0
  17. package/dist/db/schema.js +103 -0
  18. package/dist/db/schema.js.map +1 -0
  19. package/dist/db/seed.d.ts +15 -0
  20. package/dist/db/seed.d.ts.map +1 -0
  21. package/dist/db/seed.js +128 -0
  22. package/dist/db/seed.js.map +1 -0
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +51 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/server.d.ts +7 -0
  28. package/dist/server.d.ts.map +1 -0
  29. package/dist/server.js +368 -0
  30. package/dist/server.js.map +1 -0
  31. package/dist/services/benchmark.service.d.ts +27 -0
  32. package/dist/services/benchmark.service.d.ts.map +1 -0
  33. package/dist/services/benchmark.service.js +94 -0
  34. package/dist/services/benchmark.service.js.map +1 -0
  35. package/dist/services/dashboard.service.d.ts +12 -0
  36. package/dist/services/dashboard.service.d.ts.map +1 -0
  37. package/dist/services/dashboard.service.js +191 -0
  38. package/dist/services/dashboard.service.js.map +1 -0
  39. package/dist/services/impact.service.d.ts +20 -0
  40. package/dist/services/impact.service.d.ts.map +1 -0
  41. package/dist/services/impact.service.js +114 -0
  42. package/dist/services/impact.service.js.map +1 -0
  43. package/dist/services/telemetry.service.d.ts +33 -0
  44. package/dist/services/telemetry.service.d.ts.map +1 -0
  45. package/dist/services/telemetry.service.js +175 -0
  46. package/dist/services/telemetry.service.js.map +1 -0
  47. package/dist/types/index.d.ts +3 -0
  48. package/dist/types/index.d.ts.map +1 -0
  49. package/dist/types/index.js +3 -0
  50. package/dist/types/index.js.map +1 -0
  51. package/dist/types/models.d.ts +61 -0
  52. package/dist/types/models.d.ts.map +1 -0
  53. package/dist/types/models.js +2 -0
  54. package/dist/types/models.js.map +1 -0
  55. package/dist/types/tools.d.ts +134 -0
  56. package/dist/types/tools.d.ts.map +1 -0
  57. package/dist/types/tools.js +149 -0
  58. package/dist/types/tools.js.map +1 -0
  59. package/dist/utils/ascii-chart.d.ts +9 -0
  60. package/dist/utils/ascii-chart.d.ts.map +1 -0
  61. package/dist/utils/ascii-chart.js +29 -0
  62. package/dist/utils/ascii-chart.js.map +1 -0
  63. package/dist/utils/formatter.d.ts +6 -0
  64. package/dist/utils/formatter.d.ts.map +1 -0
  65. package/dist/utils/formatter.js +29 -0
  66. package/dist/utils/formatter.js.map +1 -0
  67. package/dist/utils/hours.d.ts +3 -0
  68. package/dist/utils/hours.d.ts.map +1 -0
  69. package/dist/utils/hours.js +15 -0
  70. package/dist/utils/hours.js.map +1 -0
  71. package/dist/utils/pricing.d.ts +19 -0
  72. package/dist/utils/pricing.d.ts.map +1 -0
  73. package/dist/utils/pricing.js +96 -0
  74. package/dist/utils/pricing.js.map +1 -0
  75. package/dist/utils/quality.d.ts +15 -0
  76. package/dist/utils/quality.d.ts.map +1 -0
  77. package/dist/utils/quality.js +47 -0
  78. package/dist/utils/quality.js.map +1 -0
  79. package/dist/web/render.d.ts +2 -0
  80. package/dist/web/render.d.ts.map +1 -0
  81. package/dist/web/render.js +593 -0
  82. package/dist/web/render.js.map +1 -0
  83. package/dist/web/server.d.ts +10 -0
  84. package/dist/web/server.d.ts.map +1 -0
  85. package/dist/web/server.js +136 -0
  86. package/dist/web/server.js.map +1 -0
  87. package/package.json +51 -4
@@ -0,0 +1,136 @@
1
+ import http from 'node:http';
2
+ import { renderDashboardHtml } from './render.js';
3
+ import { DashboardService } from '../services/dashboard.service.js';
4
+ import { BenchmarkService } from '../services/benchmark.service.js';
5
+ import { WorkBuddySniffer } from '../adapters/workbuddy.sniffer.js';
6
+ export function startWebServer(db, preferredPort = 3000, maxAttempts = 10) {
7
+ const dashboardService = new DashboardService(db);
8
+ const benchmarkService = new BenchmarkService(db);
9
+ const sniffer = new WorkBuddySniffer(db);
10
+ // Initial sync on startup
11
+ try {
12
+ const initSync = sniffer.sync();
13
+ if (initSync.syncedCount > 0) {
14
+ process.stderr.write(`[SkillFlow Sniffer] Auto-synced ${initSync.syncedCount} WorkBuddy skills: ${initSync.syncedSkills.join(', ')}\n`);
15
+ }
16
+ }
17
+ catch { }
18
+ return new Promise((resolve, reject) => {
19
+ let currentPort = preferredPort;
20
+ let attempts = 0;
21
+ function tryListen() {
22
+ attempts++;
23
+ const server = http.createServer((req, res) => {
24
+ try {
25
+ const urlObj = new URL(req.url || '/', `http://localhost:${currentPort}`);
26
+ const pathname = urlObj.pathname;
27
+ // CORS headers for local querying
28
+ res.setHeader('Access-Control-Allow-Origin', '*');
29
+ res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS');
30
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
31
+ if (req.method === 'OPTIONS') {
32
+ res.writeHead(204);
33
+ res.end();
34
+ return;
35
+ }
36
+ // 1. Web Dashboard UI
37
+ if (pathname === '/' || pathname === '/index.html') {
38
+ try {
39
+ sniffer.sync();
40
+ }
41
+ catch { }
42
+ const html = renderDashboardHtml();
43
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
44
+ res.end(html);
45
+ return;
46
+ }
47
+ // 2. API: Dashboard aggregation
48
+ if (pathname === '/api/dashboard') {
49
+ try {
50
+ sniffer.sync();
51
+ }
52
+ catch { }
53
+ const timeRange = urlObj.searchParams.get('time_range') || 'all';
54
+ const agentName = urlObj.searchParams.get('agent_name') || undefined;
55
+ const skillId = urlObj.searchParams.get('skill_id') || undefined;
56
+ const dash = dashboardService.getDashboard({
57
+ time_range: timeRange,
58
+ agent_name: agentName,
59
+ skill_id: skillId,
60
+ });
61
+ res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
62
+ res.end(JSON.stringify(dash.data));
63
+ return;
64
+ }
65
+ // 3. API: Recent Invocations
66
+ if (pathname === '/api/invocations') {
67
+ try {
68
+ sniffer.sync();
69
+ }
70
+ catch { }
71
+ const parsedLimit = parseInt(urlObj.searchParams.get('limit') || '20', 10);
72
+ const limit = isNaN(parsedLimit) ? 20 : Math.min(100, Math.max(1, parsedLimit));
73
+ const rows = db
74
+ .prepare(`
75
+ SELECT
76
+ i.*,
77
+ s.skill_name,
78
+ s.category
79
+ FROM invocations i
80
+ LEFT JOIN skills_manifest s ON i.skill_id = s.skill_id
81
+ ORDER BY i.timestamp DESC
82
+ LIMIT ?
83
+ `)
84
+ .all(limit);
85
+ res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
86
+ res.end(JSON.stringify({ invocations: rows }));
87
+ return;
88
+ }
89
+ // 4. API: Registered Skills Manifest
90
+ if (pathname === '/api/skills') {
91
+ const category = urlObj.searchParams.get('category') || undefined;
92
+ const list = benchmarkService.listBenchmarks(category);
93
+ res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
94
+ res.end(JSON.stringify({ skills: list }));
95
+ return;
96
+ }
97
+ // 5. Health check
98
+ if (pathname === '/api/health') {
99
+ res.writeHead(200, { 'Content-Type': 'application/json' });
100
+ res.end(JSON.stringify({ status: 'ok', uptime: process.uptime() }));
101
+ return;
102
+ }
103
+ res.writeHead(404, { 'Content-Type': 'application/json' });
104
+ res.end(JSON.stringify({ error: 'Not Found' }));
105
+ }
106
+ catch (err) {
107
+ res.writeHead(500, { 'Content-Type': 'application/json' });
108
+ res.end(JSON.stringify({ error: err.message }));
109
+ }
110
+ });
111
+ server.listen(currentPort, () => {
112
+ const url = `http://localhost:${currentPort}`;
113
+ process.stderr.write(`[SkillFlow Web] Visual dashboard live at ${url}\n`);
114
+ resolve({
115
+ server,
116
+ port: currentPort,
117
+ url,
118
+ close: () => new Promise((resClose) => {
119
+ server.close(() => resClose());
120
+ }),
121
+ });
122
+ });
123
+ server.on('error', (err) => {
124
+ if (err.code === 'EADDRINUSE' && attempts < maxAttempts) {
125
+ currentPort++;
126
+ tryListen();
127
+ }
128
+ else {
129
+ reject(err);
130
+ }
131
+ });
132
+ }
133
+ tryListen();
134
+ });
135
+ }
136
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,53 @@
1
1
  {
2
2
  "name": "@mengzf/skillflow-mcp",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0",
4
+ "description": "Unified MCP Server and Analytics Engine for Agent Skills",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "skillflow-mcp": "dist/index.js"
9
+ },
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "README.md",
16
+ "LICENSE"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "start": "node dist/index.js",
21
+ "web": "node dist/index.js",
22
+ "dev": "tsx src/index.ts",
23
+ "test": "tsx --test test/**/*.test.ts",
24
+ "lint": "tsc --noEmit",
25
+ "prepublishOnly": "npm run build && npm test"
26
+ },
27
+ "keywords": [
28
+ "mcp",
29
+ "modelcontextprotocol",
30
+ "skills",
31
+ "analytics",
32
+ "claude",
33
+ "trae",
34
+ "qoder",
35
+ "workbuddy",
36
+ "codex",
37
+ "dsh"
38
+ ],
39
+ "author": "mengzf",
40
+ "license": "MIT",
41
+ "dependencies": {
42
+ "@modelcontextprotocol/sdk": "^1.32.2",
43
+ "zod": "^3.24.2"
44
+ },
45
+ "devDependencies": {
46
+ "@types/node": "^24.0.0",
47
+ "tsx": "^4.19.3",
48
+ "typescript": "^5.7.3"
49
+ },
50
+ "engines": {
51
+ "node": ">=24.0.0"
52
+ }
53
+ }