midas-mcp 5.43.11 → 5.44.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.
- package/README.md +42 -1
- package/dist/auth.d.ts +59 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +198 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli.d.ts +2 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +44 -0
- package/dist/cli.js.map +1 -1
- package/dist/cloud.d.ts +45 -0
- package/dist/cloud.d.ts.map +1 -0
- package/dist/cloud.js +319 -0
- package/dist/cloud.js.map +1 -0
- package/dist/docs/index.html +1177 -0
- package/dist/docs/vercel.json +5 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +5 -3
- package/dist/tui.js.map +1 -1
- package/docs/index.html +1177 -0
- package/docs/vercel.json +5 -0
- package/package.json +1 -1
package/dist/cloud.js
ADDED
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud Sync - Turso Database Integration
|
|
3
|
+
*
|
|
4
|
+
* Syncs local Midas state to Turso for web dashboard access.
|
|
5
|
+
* Uses libsql HTTP API for serverless-friendly connections.
|
|
6
|
+
*/
|
|
7
|
+
import { isAuthenticated, getAuthenticatedUser } from './auth.js';
|
|
8
|
+
import { loadState } from './state/phase.js';
|
|
9
|
+
import { loadTracker } from './tracker.js';
|
|
10
|
+
import { sanitizePath } from './security.js';
|
|
11
|
+
import { basename } from 'path';
|
|
12
|
+
// Turso configuration - shared database for all Midas users
|
|
13
|
+
// Users can override with env vars for self-hosted setups
|
|
14
|
+
const DEFAULT_TURSO_URL = 'libsql://midas-christiancattaneo.aws-us-east-1.turso.io';
|
|
15
|
+
const DEFAULT_TURSO_TOKEN = 'eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NzAwNzY5OTAsImlkIjoiMzdiMTQ4NjEtNzFhZi00ZDgyLTg1ZDItYmY5OThhM2VmZjUxIiwicmlkIjoiNDQyMDJmMzItNWQ5YS00MTgyLTllM2ItNjE3MWUyNDk4ODY2In0.pm1VW_o8ARe25fwx8HrXyOAKAUnMxZrWrD_kIc0zk2wfC2qLjf6nxUSptSpV6jbDkIMQXK2TsV1o5HgAjpdBAw';
|
|
16
|
+
const TURSO_URL_RAW = process.env.TURSO_DATABASE_URL || DEFAULT_TURSO_URL;
|
|
17
|
+
const TURSO_AUTH_TOKEN = process.env.TURSO_AUTH_TOKEN || DEFAULT_TURSO_TOKEN;
|
|
18
|
+
// Convert libsql:// URL to https:// for HTTP API
|
|
19
|
+
function getTursoHttpUrl() {
|
|
20
|
+
if (!TURSO_URL_RAW)
|
|
21
|
+
return '';
|
|
22
|
+
// libsql://db-name.turso.io -> https://db-name.turso.io
|
|
23
|
+
return TURSO_URL_RAW.replace('libsql://', 'https://');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Execute SQL against Turso using HTTP API (v2/pipeline)
|
|
27
|
+
*/
|
|
28
|
+
async function executeSQL(sql, args = []) {
|
|
29
|
+
const tursoUrl = getTursoHttpUrl();
|
|
30
|
+
if (!tursoUrl || !TURSO_AUTH_TOKEN) {
|
|
31
|
+
throw new Error('Turso not configured. Set TURSO_DATABASE_URL and TURSO_AUTH_TOKEN.');
|
|
32
|
+
}
|
|
33
|
+
// Convert args to Turso format
|
|
34
|
+
const tursoArgs = args.map(arg => {
|
|
35
|
+
if (arg === null)
|
|
36
|
+
return { type: 'null', value: null };
|
|
37
|
+
if (typeof arg === 'number')
|
|
38
|
+
return { type: 'integer', value: String(arg) };
|
|
39
|
+
if (typeof arg === 'boolean')
|
|
40
|
+
return { type: 'integer', value: arg ? '1' : '0' };
|
|
41
|
+
return { type: 'text', value: String(arg) };
|
|
42
|
+
});
|
|
43
|
+
const response = await fetch(`${tursoUrl}/v2/pipeline`, {
|
|
44
|
+
method: 'POST',
|
|
45
|
+
headers: {
|
|
46
|
+
'Authorization': `Bearer ${TURSO_AUTH_TOKEN}`,
|
|
47
|
+
'Content-Type': 'application/json',
|
|
48
|
+
},
|
|
49
|
+
body: JSON.stringify({
|
|
50
|
+
requests: [
|
|
51
|
+
{ type: 'execute', stmt: { sql, args: tursoArgs } },
|
|
52
|
+
{ type: 'close' }
|
|
53
|
+
]
|
|
54
|
+
}),
|
|
55
|
+
});
|
|
56
|
+
if (!response.ok) {
|
|
57
|
+
const text = await response.text();
|
|
58
|
+
throw new Error(`Turso error: ${response.status} - ${text}`);
|
|
59
|
+
}
|
|
60
|
+
const data = await response.json();
|
|
61
|
+
// Extract columns and rows from the response
|
|
62
|
+
const result = data.results[0]?.response?.result;
|
|
63
|
+
if (!result) {
|
|
64
|
+
return { columns: [], rows: [] };
|
|
65
|
+
}
|
|
66
|
+
const columns = result.cols.map(c => c.name);
|
|
67
|
+
const rows = result.rows.map(row => row.map(cell => cell.value));
|
|
68
|
+
return { columns, rows };
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Initialize database schema
|
|
72
|
+
*/
|
|
73
|
+
export async function initSchema() {
|
|
74
|
+
// Projects table
|
|
75
|
+
await executeSQL(`
|
|
76
|
+
CREATE TABLE IF NOT EXISTS projects (
|
|
77
|
+
id TEXT PRIMARY KEY,
|
|
78
|
+
github_user_id INTEGER NOT NULL,
|
|
79
|
+
github_username TEXT NOT NULL,
|
|
80
|
+
name TEXT NOT NULL,
|
|
81
|
+
local_path TEXT NOT NULL,
|
|
82
|
+
current_phase TEXT DEFAULT 'IDLE',
|
|
83
|
+
current_step TEXT DEFAULT '',
|
|
84
|
+
progress INTEGER DEFAULT 0,
|
|
85
|
+
last_synced TEXT,
|
|
86
|
+
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
87
|
+
UNIQUE(github_user_id, local_path)
|
|
88
|
+
)
|
|
89
|
+
`);
|
|
90
|
+
// Phase history table
|
|
91
|
+
await executeSQL(`
|
|
92
|
+
CREATE TABLE IF NOT EXISTS phase_history (
|
|
93
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
94
|
+
project_id TEXT NOT NULL,
|
|
95
|
+
phase TEXT NOT NULL,
|
|
96
|
+
step TEXT,
|
|
97
|
+
entered_at TEXT NOT NULL,
|
|
98
|
+
exited_at TEXT,
|
|
99
|
+
duration_minutes INTEGER,
|
|
100
|
+
FOREIGN KEY (project_id) REFERENCES projects(id)
|
|
101
|
+
)
|
|
102
|
+
`);
|
|
103
|
+
// Events table (for activity feed)
|
|
104
|
+
await executeSQL(`
|
|
105
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
106
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
107
|
+
project_id TEXT NOT NULL,
|
|
108
|
+
event_type TEXT NOT NULL,
|
|
109
|
+
event_data TEXT,
|
|
110
|
+
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
111
|
+
FOREIGN KEY (project_id) REFERENCES projects(id)
|
|
112
|
+
)
|
|
113
|
+
`);
|
|
114
|
+
// Gates status table
|
|
115
|
+
await executeSQL(`
|
|
116
|
+
CREATE TABLE IF NOT EXISTS gates (
|
|
117
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
118
|
+
project_id TEXT NOT NULL,
|
|
119
|
+
compiles INTEGER,
|
|
120
|
+
tests_pass INTEGER,
|
|
121
|
+
lints_pass INTEGER,
|
|
122
|
+
checked_at TEXT,
|
|
123
|
+
FOREIGN KEY (project_id) REFERENCES projects(id)
|
|
124
|
+
)
|
|
125
|
+
`);
|
|
126
|
+
// Suggestions table (for learning patterns)
|
|
127
|
+
await executeSQL(`
|
|
128
|
+
CREATE TABLE IF NOT EXISTS suggestions (
|
|
129
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
130
|
+
project_id TEXT NOT NULL,
|
|
131
|
+
suggestion TEXT NOT NULL,
|
|
132
|
+
accepted INTEGER DEFAULT 0,
|
|
133
|
+
user_prompt TEXT,
|
|
134
|
+
rejection_reason TEXT,
|
|
135
|
+
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
136
|
+
FOREIGN KEY (project_id) REFERENCES projects(id)
|
|
137
|
+
)
|
|
138
|
+
`);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Generate a unique project ID
|
|
142
|
+
*/
|
|
143
|
+
function generateProjectId(userId, projectPath) {
|
|
144
|
+
const pathHash = Buffer.from(projectPath).toString('base64url').slice(0, 12);
|
|
145
|
+
return `${userId}-${pathHash}`;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Calculate progress percentage from phase/step
|
|
149
|
+
*/
|
|
150
|
+
function calculateProgress(phase) {
|
|
151
|
+
const phaseOrder = ['IDLE', 'PLAN', 'BUILD', 'SHIP', 'GROW'];
|
|
152
|
+
const stepCounts = {
|
|
153
|
+
IDLE: 1,
|
|
154
|
+
PLAN: 5, // IDEA, RESEARCH, BRAINLIFT, PRD, GAMEPLAN
|
|
155
|
+
BUILD: 7, // RULES, INDEX, READ, RESEARCH, IMPLEMENT, TEST, DEBUG
|
|
156
|
+
SHIP: 3, // REVIEW, DEPLOY, MONITOR
|
|
157
|
+
GROW: 3, // FEEDBACK, ANALYZE, ITERATE
|
|
158
|
+
};
|
|
159
|
+
const phaseSteps = {
|
|
160
|
+
PLAN: ['IDEA', 'RESEARCH', 'BRAINLIFT', 'PRD', 'GAMEPLAN'],
|
|
161
|
+
BUILD: ['RULES', 'INDEX', 'READ', 'RESEARCH', 'IMPLEMENT', 'TEST', 'DEBUG'],
|
|
162
|
+
SHIP: ['REVIEW', 'DEPLOY', 'MONITOR'],
|
|
163
|
+
GROW: ['FEEDBACK', 'ANALYZE', 'ITERATE'],
|
|
164
|
+
};
|
|
165
|
+
if (phase.phase === 'IDLE')
|
|
166
|
+
return 0;
|
|
167
|
+
const phaseIdx = phaseOrder.indexOf(phase.phase);
|
|
168
|
+
let completedSteps = 0;
|
|
169
|
+
// Count completed phases
|
|
170
|
+
for (let i = 1; i < phaseIdx; i++) {
|
|
171
|
+
completedSteps += stepCounts[phaseOrder[i]];
|
|
172
|
+
}
|
|
173
|
+
// Add current phase progress
|
|
174
|
+
if ('step' in phase && phaseSteps[phase.phase]) {
|
|
175
|
+
const stepIdx = phaseSteps[phase.phase].indexOf(phase.step);
|
|
176
|
+
completedSteps += stepIdx;
|
|
177
|
+
}
|
|
178
|
+
const totalSteps = 5 + 7 + 3 + 3; // PLAN + BUILD + SHIP + GROW
|
|
179
|
+
return Math.round((completedSteps / totalSteps) * 100);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Sync project state to cloud
|
|
183
|
+
*/
|
|
184
|
+
export async function syncProject(projectPath) {
|
|
185
|
+
const safePath = sanitizePath(projectPath);
|
|
186
|
+
// Check authentication
|
|
187
|
+
if (!isAuthenticated()) {
|
|
188
|
+
return { success: false, error: 'Not authenticated. Run: midas login' };
|
|
189
|
+
}
|
|
190
|
+
const user = getAuthenticatedUser();
|
|
191
|
+
if (!user) {
|
|
192
|
+
return { success: false, error: 'User info not available' };
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
// Load local state
|
|
196
|
+
const state = loadState(safePath);
|
|
197
|
+
const tracker = loadTracker(safePath);
|
|
198
|
+
const projectName = basename(safePath);
|
|
199
|
+
const projectId = generateProjectId(user.userId, safePath);
|
|
200
|
+
const progress = calculateProgress(state.current);
|
|
201
|
+
const now = new Date().toISOString();
|
|
202
|
+
// Upsert project
|
|
203
|
+
await executeSQL(`
|
|
204
|
+
INSERT INTO projects (id, github_user_id, github_username, name, local_path, current_phase, current_step, progress, last_synced)
|
|
205
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
206
|
+
ON CONFLICT(github_user_id, local_path) DO UPDATE SET
|
|
207
|
+
current_phase = excluded.current_phase,
|
|
208
|
+
current_step = excluded.current_step,
|
|
209
|
+
progress = excluded.progress,
|
|
210
|
+
last_synced = excluded.last_synced
|
|
211
|
+
`, [
|
|
212
|
+
projectId,
|
|
213
|
+
user.userId,
|
|
214
|
+
user.username,
|
|
215
|
+
projectName,
|
|
216
|
+
safePath,
|
|
217
|
+
state.current.phase,
|
|
218
|
+
'step' in state.current ? state.current.step : '',
|
|
219
|
+
progress,
|
|
220
|
+
now,
|
|
221
|
+
]);
|
|
222
|
+
// Sync recent events
|
|
223
|
+
if (tracker.recentToolCalls.length > 0) {
|
|
224
|
+
const recentCall = tracker.recentToolCalls[0];
|
|
225
|
+
await executeSQL(`
|
|
226
|
+
INSERT INTO events (project_id, event_type, event_data, created_at)
|
|
227
|
+
VALUES (?, 'tool_call', ?, ?)
|
|
228
|
+
`, [
|
|
229
|
+
projectId,
|
|
230
|
+
JSON.stringify({ tool: recentCall.tool, args: recentCall.args }),
|
|
231
|
+
new Date(recentCall.timestamp).toISOString(),
|
|
232
|
+
]);
|
|
233
|
+
}
|
|
234
|
+
// Sync gates status
|
|
235
|
+
if (tracker.gates.compiledAt || tracker.gates.testedAt || tracker.gates.lintedAt) {
|
|
236
|
+
await executeSQL(`
|
|
237
|
+
INSERT INTO gates (project_id, compiles, tests_pass, lints_pass, checked_at)
|
|
238
|
+
VALUES (?, ?, ?, ?, ?)
|
|
239
|
+
`, [
|
|
240
|
+
projectId,
|
|
241
|
+
tracker.gates.compiles === null ? null : tracker.gates.compiles ? 1 : 0,
|
|
242
|
+
tracker.gates.testsPass === null ? null : tracker.gates.testsPass ? 1 : 0,
|
|
243
|
+
tracker.gates.lintsPass === null ? null : tracker.gates.lintsPass ? 1 : 0,
|
|
244
|
+
now,
|
|
245
|
+
]);
|
|
246
|
+
}
|
|
247
|
+
// Sync recent suggestions
|
|
248
|
+
for (const suggestion of tracker.suggestionHistory.slice(0, 5)) {
|
|
249
|
+
await executeSQL(`
|
|
250
|
+
INSERT INTO suggestions (project_id, suggestion, accepted, user_prompt, rejection_reason, created_at)
|
|
251
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
252
|
+
`, [
|
|
253
|
+
projectId,
|
|
254
|
+
suggestion.suggestion,
|
|
255
|
+
suggestion.accepted ? 1 : 0,
|
|
256
|
+
suggestion.userPrompt || null,
|
|
257
|
+
suggestion.rejectionReason || null,
|
|
258
|
+
new Date(suggestion.timestamp).toISOString(),
|
|
259
|
+
]);
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
success: true,
|
|
263
|
+
projectId,
|
|
264
|
+
syncedAt: now,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
return {
|
|
269
|
+
success: false,
|
|
270
|
+
error: error instanceof Error ? error.message : String(error),
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Get all projects for authenticated user
|
|
276
|
+
*/
|
|
277
|
+
export async function getProjects() {
|
|
278
|
+
const user = getAuthenticatedUser();
|
|
279
|
+
if (!user)
|
|
280
|
+
return [];
|
|
281
|
+
const result = await executeSQL(`
|
|
282
|
+
SELECT * FROM projects WHERE github_user_id = ? ORDER BY last_synced DESC
|
|
283
|
+
`, [user.userId]);
|
|
284
|
+
return result.rows.map(row => ({
|
|
285
|
+
id: row[0],
|
|
286
|
+
github_user_id: row[1],
|
|
287
|
+
github_username: row[2],
|
|
288
|
+
name: row[3],
|
|
289
|
+
local_path: row[4],
|
|
290
|
+
current_phase: row[5],
|
|
291
|
+
current_step: row[6],
|
|
292
|
+
progress: row[7],
|
|
293
|
+
last_synced: row[8],
|
|
294
|
+
created_at: row[9],
|
|
295
|
+
}));
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Check if cloud sync is configured
|
|
299
|
+
*/
|
|
300
|
+
export function isCloudConfigured() {
|
|
301
|
+
return !!TURSO_URL_RAW && !!TURSO_AUTH_TOKEN;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* CLI command to sync
|
|
305
|
+
*/
|
|
306
|
+
export async function runSync(projectPath) {
|
|
307
|
+
console.log('\n Syncing to cloud...\n');
|
|
308
|
+
const result = await syncProject(projectPath);
|
|
309
|
+
if (result.success) {
|
|
310
|
+
console.log(` ✓ Synced successfully`);
|
|
311
|
+
console.log(` Project ID: ${result.projectId}`);
|
|
312
|
+
console.log(` Synced at: ${result.syncedAt}\n`);
|
|
313
|
+
console.log(` View at: https://dashboard.midasmcp.com\n`);
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
console.log(` ✗ Sync failed: ${result.error}\n`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=cloud.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud.js","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"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"}
|