spect8-mcp 0.1.0 → 0.1.2
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/dist/cli.js +56 -17
- package/dist/cli.js.map +1 -1
- package/package.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
import { writeFileSync, mkdirSync, existsSync, readFileSync } from "fs";
|
|
3
3
|
import { join } from "path";
|
|
4
4
|
import { homedir } from "os";
|
|
5
|
+
import { createServer } from "http";
|
|
6
|
+
import { exec } from "child_process";
|
|
7
|
+
import { URL } from "url";
|
|
5
8
|
const RULES_CONTENT = `# Spect8 AI Proficiency Rules
|
|
6
9
|
You are integrated with the Spect8 Telemetry system. To maintain logical density tracking, you MUST:
|
|
7
10
|
1. Call \`mcp_spect8_start_task\` at the beginning of every user request.
|
|
@@ -60,23 +63,17 @@ function enforceCopilot(targetDir) {
|
|
|
60
63
|
}
|
|
61
64
|
}
|
|
62
65
|
}
|
|
63
|
-
function setupGlobalMcpConfig() {
|
|
66
|
+
function setupGlobalMcpConfig(apiKey, ingestUrl) {
|
|
64
67
|
const mcpConfigDir = join(homedir(), ".spect8");
|
|
65
68
|
mkdirSync(mcpConfigDir, { recursive: true });
|
|
66
69
|
const configPath = join(mcpConfigDir, "config.json");
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
writeFileSync(configPath, JSON.stringify(baseConfig, null, 2));
|
|
75
|
-
log("✅ Created base ~/.spect8/config.json");
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
log("⚡ ~/.spect8/config.json already exists");
|
|
79
|
-
}
|
|
70
|
+
const config = {
|
|
71
|
+
api_key: apiKey || "PASTE_YOUR_KEY_HERE",
|
|
72
|
+
ingest_url: ingestUrl || "https://spect8-production.up.railway.app",
|
|
73
|
+
ide_name: "auto"
|
|
74
|
+
};
|
|
75
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
76
|
+
log(`✅ Configured ~/.spect8/config.json with ${config.ingest_url}`);
|
|
80
77
|
}
|
|
81
78
|
function main() {
|
|
82
79
|
const args = process.argv.slice(2);
|
|
@@ -87,15 +84,57 @@ function main() {
|
|
|
87
84
|
enforceCursor(targetDir);
|
|
88
85
|
enforceKiro(targetDir);
|
|
89
86
|
enforceCopilot(targetDir);
|
|
90
|
-
// Also try to ensure global config exists
|
|
91
|
-
setupGlobalMcpConfig();
|
|
92
87
|
log("✨ Project is now Spect8-compliant.");
|
|
93
88
|
}
|
|
89
|
+
else if (command === "setup") {
|
|
90
|
+
const apiKey = args[1];
|
|
91
|
+
if (apiKey) {
|
|
92
|
+
// Manual setup
|
|
93
|
+
setupGlobalMcpConfig(apiKey);
|
|
94
|
+
log("✨ Global configuration complete.");
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
// Interactive Browser Auth
|
|
98
|
+
const PORT = 9090;
|
|
99
|
+
const server = createServer((req, res) => {
|
|
100
|
+
// Set CORS for the frontend to hit this local server
|
|
101
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
102
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS');
|
|
103
|
+
const url = new URL(req.url || "", `http://localhost:${PORT}`);
|
|
104
|
+
if (url.pathname === "/callback") {
|
|
105
|
+
const key = url.searchParams.get("api_key");
|
|
106
|
+
if (key) {
|
|
107
|
+
setupGlobalMcpConfig(key);
|
|
108
|
+
res.writeHead(200, { 'Content-Type': 'text/plain' });
|
|
109
|
+
res.end('Success! You can close this tab.');
|
|
110
|
+
log("✨ Authentication successful! API key saved.");
|
|
111
|
+
process.exit(0);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
res.writeHead(404);
|
|
115
|
+
res.end();
|
|
116
|
+
});
|
|
117
|
+
server.listen(PORT, () => {
|
|
118
|
+
const authUrl = `https://www.spect8ai.tech/connect?port=${PORT}`;
|
|
119
|
+
log("Logging you in via browser...");
|
|
120
|
+
log(`If it doesn't open automatically, visit: ${authUrl}`);
|
|
121
|
+
// Open browser based on OS
|
|
122
|
+
const start = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
|
|
123
|
+
exec(`${start} ${authUrl}`);
|
|
124
|
+
});
|
|
125
|
+
// Timeout after 5 minutes
|
|
126
|
+
setTimeout(() => {
|
|
127
|
+
log("❌ Setup timed out. Please try again.");
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}, 5 * 60 * 1000);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
94
132
|
else {
|
|
95
133
|
console.log(`
|
|
96
134
|
Spect8 CLI
|
|
97
135
|
Usage:
|
|
98
|
-
spect8
|
|
136
|
+
spect8 setup <api_key> [ingest_url] - Configure your global API key and backend URL.
|
|
137
|
+
spect8 init - Inject AI telemetry rules into the current project.
|
|
99
138
|
`);
|
|
100
139
|
}
|
|
101
140
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spect8-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Spect8 local MCP server: captures tool events + token usage from Cursor and Claude Code, posts HMAC-signed batches to the Spect8 ingest API.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/server.js",
|
|
@@ -50,4 +50,4 @@
|
|
|
50
50
|
"publishConfig": {
|
|
51
51
|
"access": "public"
|
|
52
52
|
}
|
|
53
|
-
}
|
|
53
|
+
}
|