@stackguide/mcp-server 3.2.0 → 3.8.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.
- package/README.md +315 -9
- package/dist/config/persistence.d.ts +16 -0
- package/dist/config/persistence.d.ts.map +1 -1
- package/dist/config/persistence.js +53 -0
- package/dist/config/persistence.js.map +1 -1
- package/dist/handlers/analyze.d.ts +11 -0
- package/dist/handlers/analyze.d.ts.map +1 -0
- package/dist/handlers/analyze.js +274 -0
- package/dist/handlers/analyze.js.map +1 -0
- package/dist/handlers/config.d.ts +1 -8
- package/dist/handlers/config.d.ts.map +1 -1
- package/dist/handlers/config.js +7 -1
- package/dist/handlers/config.js.map +1 -1
- package/dist/handlers/context.d.ts +1 -5
- package/dist/handlers/context.d.ts.map +1 -1
- package/dist/handlers/context.js +7 -1
- package/dist/handlers/context.js.map +1 -1
- package/dist/handlers/cursor.d.ts +1 -7
- package/dist/handlers/cursor.d.ts.map +1 -1
- package/dist/handlers/cursor.js +7 -1
- package/dist/handlers/cursor.js.map +1 -1
- package/dist/handlers/custom-rule.d.ts +1 -11
- package/dist/handlers/custom-rule.d.ts.map +1 -1
- package/dist/handlers/custom-rule.js +7 -1
- package/dist/handlers/custom-rule.js.map +1 -1
- package/dist/handlers/docs.d.ts +1 -8
- package/dist/handlers/docs.d.ts.map +1 -1
- package/dist/handlers/docs.js +7 -1
- package/dist/handlers/docs.js.map +1 -1
- package/dist/handlers/generate.d.ts +1 -13
- package/dist/handlers/generate.d.ts.map +1 -1
- package/dist/handlers/generate.js +6 -3
- package/dist/handlers/generate.js.map +1 -1
- package/dist/handlers/health.d.ts +1 -8
- package/dist/handlers/health.d.ts.map +1 -1
- package/dist/handlers/health.js +11 -3
- package/dist/handlers/health.js.map +1 -1
- package/dist/handlers/help.d.ts +1 -5
- package/dist/handlers/help.d.ts.map +1 -1
- package/dist/handlers/help.js +7 -1
- package/dist/handlers/help.js.map +1 -1
- package/dist/handlers/index.d.ts +1 -0
- package/dist/handlers/index.d.ts.map +1 -1
- package/dist/handlers/index.js +1 -0
- package/dist/handlers/index.js.map +1 -1
- package/dist/handlers/knowledge.d.ts +1 -8
- package/dist/handlers/knowledge.d.ts.map +1 -1
- package/dist/handlers/knowledge.js +7 -1
- package/dist/handlers/knowledge.js.map +1 -1
- package/dist/handlers/prompts.d.ts +31 -0
- package/dist/handlers/prompts.d.ts.map +1 -0
- package/dist/handlers/prompts.js +225 -0
- package/dist/handlers/prompts.js.map +1 -0
- package/dist/handlers/resources.d.ts +27 -0
- package/dist/handlers/resources.d.ts.map +1 -0
- package/dist/handlers/resources.js +210 -0
- package/dist/handlers/resources.js.map +1 -0
- package/dist/handlers/review.d.ts.map +1 -1
- package/dist/handlers/review.js +18 -1
- package/dist/handlers/review.js.map +1 -1
- package/dist/handlers/rules.d.ts +1 -9
- package/dist/handlers/rules.d.ts.map +1 -1
- package/dist/handlers/rules.js +7 -1
- package/dist/handlers/rules.js.map +1 -1
- package/dist/handlers/setup.d.ts +1 -0
- package/dist/handlers/setup.d.ts.map +1 -1
- package/dist/handlers/setup.js +42 -0
- package/dist/handlers/setup.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -417
- package/dist/index.js.map +1 -1
- package/dist/router/index.d.ts +69 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +151 -0
- package/dist/router/index.js.map +1 -0
- package/dist/services/ast/analyzer.d.ts +55 -0
- package/dist/services/ast/analyzer.d.ts.map +1 -0
- package/dist/services/ast/analyzer.js +268 -0
- package/dist/services/ast/analyzer.js.map +1 -0
- package/dist/services/ast/index.d.ts +10 -0
- package/dist/services/ast/index.d.ts.map +1 -0
- package/dist/services/ast/index.js +12 -0
- package/dist/services/ast/index.js.map +1 -0
- package/dist/services/ast/rules.d.ts +13 -0
- package/dist/services/ast/rules.d.ts.map +1 -0
- package/dist/services/ast/rules.js +358 -0
- package/dist/services/ast/rules.js.map +1 -0
- package/dist/services/ast/treeSitterParser.d.ts +54 -0
- package/dist/services/ast/treeSitterParser.d.ts.map +1 -0
- package/dist/services/ast/treeSitterParser.js +394 -0
- package/dist/services/ast/treeSitterParser.js.map +1 -0
- package/dist/services/ast/types.d.ts +167 -0
- package/dist/services/ast/types.d.ts.map +1 -0
- package/dist/services/ast/types.js +35 -0
- package/dist/services/ast/types.js.map +1 -0
- package/dist/services/codeAnalyzer.d.ts.map +1 -1
- package/dist/services/codeAnalyzer.js +43 -3
- package/dist/services/codeAnalyzer.js.map +1 -1
- package/dist/services/httpClient.d.ts +45 -0
- package/dist/services/httpClient.d.ts.map +1 -0
- package/dist/services/httpClient.js +309 -0
- package/dist/services/httpClient.js.map +1 -0
- package/dist/services/intelligence/configGenerator.d.ts +28 -0
- package/dist/services/intelligence/configGenerator.d.ts.map +1 -0
- package/dist/services/intelligence/configGenerator.js +404 -0
- package/dist/services/intelligence/configGenerator.js.map +1 -0
- package/dist/services/intelligence/dependencyAdvisor.d.ts +24 -0
- package/dist/services/intelligence/dependencyAdvisor.d.ts.map +1 -0
- package/dist/services/intelligence/dependencyAdvisor.js +404 -0
- package/dist/services/intelligence/dependencyAdvisor.js.map +1 -0
- package/dist/services/intelligence/index.d.ts +12 -0
- package/dist/services/intelligence/index.d.ts.map +1 -0
- package/dist/services/intelligence/index.js +16 -0
- package/dist/services/intelligence/index.js.map +1 -0
- package/dist/services/intelligence/projectFs.d.ts +11 -0
- package/dist/services/intelligence/projectFs.d.ts.map +1 -0
- package/dist/services/intelligence/projectFs.js +30 -0
- package/dist/services/intelligence/projectFs.js.map +1 -0
- package/dist/services/intelligence/projectIntelligence.d.ts +26 -0
- package/dist/services/intelligence/projectIntelligence.d.ts.map +1 -0
- package/dist/services/intelligence/projectIntelligence.js +344 -0
- package/dist/services/intelligence/projectIntelligence.js.map +1 -0
- package/dist/services/intelligence/structureAnalyzer.d.ts +27 -0
- package/dist/services/intelligence/structureAnalyzer.d.ts.map +1 -0
- package/dist/services/intelligence/structureAnalyzer.js +286 -0
- package/dist/services/intelligence/structureAnalyzer.js.map +1 -0
- package/dist/services/intelligence/templates.d.ts +22 -0
- package/dist/services/intelligence/templates.d.ts.map +1 -0
- package/dist/services/intelligence/templates.js +521 -0
- package/dist/services/intelligence/templates.js.map +1 -0
- package/dist/services/intelligence/types.d.ts +222 -0
- package/dist/services/intelligence/types.d.ts.map +1 -0
- package/dist/services/intelligence/types.js +7 -0
- package/dist/services/intelligence/types.js.map +1 -0
- package/dist/services/projectFs.d.ts +85 -0
- package/dist/services/projectFs.d.ts.map +1 -0
- package/dist/services/projectFs.js +287 -0
- package/dist/services/projectFs.js.map +1 -0
- package/dist/services/rulesEngine.d.ts +255 -0
- package/dist/services/rulesEngine.d.ts.map +1 -0
- package/dist/services/rulesEngine.js +483 -0
- package/dist/services/rulesEngine.js.map +1 -0
- package/dist/services/webDocumentation.d.ts +9 -0
- package/dist/services/webDocumentation.d.ts.map +1 -1
- package/dist/services/webDocumentation.js +144 -1
- package/dist/services/webDocumentation.js.map +1 -1
- package/dist/storage/index.d.ts +7 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +7 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/sqlite.d.ts +92 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +471 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/storage/types.d.ts +147 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +13 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/tools/definitions.d.ts +87 -0
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +34 -0
- package/dist/tools/definitions.js.map +1 -1
- package/dist/utils/logger.d.ts +11 -2
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +30 -2
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/validation.d.ts +3 -3
- package/dist/validation/index.d.ts +8 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +19 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/schemas.d.ts +341 -0
- package/dist/validation/schemas.d.ts.map +1 -0
- package/dist/validation/schemas.js +244 -0
- package/dist/validation/schemas.js.map +1 -0
- package/package.json +9 -2
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Storage Implementation
|
|
3
|
+
* Persistent storage using better-sqlite3
|
|
4
|
+
* @version 3.4.0
|
|
5
|
+
*/
|
|
6
|
+
import Database from 'better-sqlite3';
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import * as os from 'os';
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Helper Functions
|
|
12
|
+
// ============================================================================
|
|
13
|
+
function getDefaultBaseDir() {
|
|
14
|
+
return path.join(os.homedir(), '.stackguide');
|
|
15
|
+
}
|
|
16
|
+
function generateId() {
|
|
17
|
+
return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
|
|
18
|
+
}
|
|
19
|
+
function nowISO() {
|
|
20
|
+
return new Date().toISOString();
|
|
21
|
+
}
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// SQLite Config Store
|
|
24
|
+
// ============================================================================
|
|
25
|
+
export class SQLiteConfigStore {
|
|
26
|
+
db;
|
|
27
|
+
constructor(db) {
|
|
28
|
+
this.db = db;
|
|
29
|
+
}
|
|
30
|
+
async init() {
|
|
31
|
+
this.db.exec(`
|
|
32
|
+
CREATE TABLE IF NOT EXISTS configs (
|
|
33
|
+
id TEXT PRIMARY KEY,
|
|
34
|
+
name TEXT NOT NULL,
|
|
35
|
+
project_type TEXT NOT NULL,
|
|
36
|
+
created_at TEXT NOT NULL,
|
|
37
|
+
updated_at TEXT NOT NULL,
|
|
38
|
+
data TEXT NOT NULL,
|
|
39
|
+
is_active INTEGER DEFAULT 0
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
CREATE INDEX IF NOT EXISTS idx_configs_name ON configs(name);
|
|
43
|
+
CREATE INDEX IF NOT EXISTS idx_configs_active ON configs(is_active);
|
|
44
|
+
`);
|
|
45
|
+
}
|
|
46
|
+
async getActive() {
|
|
47
|
+
const row = this.db.prepare('SELECT * FROM configs WHERE is_active = 1 LIMIT 1').get();
|
|
48
|
+
if (!row)
|
|
49
|
+
return null;
|
|
50
|
+
return {
|
|
51
|
+
id: row.id,
|
|
52
|
+
name: row.name,
|
|
53
|
+
projectType: row.project_type,
|
|
54
|
+
createdAt: row.created_at,
|
|
55
|
+
updatedAt: row.updated_at,
|
|
56
|
+
data: JSON.parse(row.data)
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
async setActive(config) {
|
|
60
|
+
const now = nowISO();
|
|
61
|
+
this.db.transaction(() => {
|
|
62
|
+
// Deactivate all
|
|
63
|
+
this.db.prepare('UPDATE configs SET is_active = 0').run();
|
|
64
|
+
// Check if we have an active config to update
|
|
65
|
+
const existing = this.db.prepare('SELECT id FROM configs WHERE name = ?').get('__active__');
|
|
66
|
+
if (existing) {
|
|
67
|
+
this.db.prepare(`
|
|
68
|
+
UPDATE configs
|
|
69
|
+
SET data = ?, updated_at = ?, project_type = ?, is_active = 1
|
|
70
|
+
WHERE id = ?
|
|
71
|
+
`).run(JSON.stringify(config), now, config.projectType || 'react-typescript', existing.id);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
const id = generateId();
|
|
75
|
+
this.db.prepare(`
|
|
76
|
+
INSERT INTO configs (id, name, project_type, created_at, updated_at, data, is_active)
|
|
77
|
+
VALUES (?, ?, ?, ?, ?, ?, 1)
|
|
78
|
+
`).run(id, '__active__', config.projectType || 'react-typescript', now, now, JSON.stringify(config));
|
|
79
|
+
}
|
|
80
|
+
})();
|
|
81
|
+
}
|
|
82
|
+
async save(name, config) {
|
|
83
|
+
const id = generateId();
|
|
84
|
+
const now = nowISO();
|
|
85
|
+
this.db.prepare(`
|
|
86
|
+
INSERT INTO configs (id, name, project_type, created_at, updated_at, data, is_active)
|
|
87
|
+
VALUES (?, ?, ?, ?, ?, ?, 0)
|
|
88
|
+
`).run(id, name, config.projectType || 'react-typescript', now, now, JSON.stringify(config));
|
|
89
|
+
return {
|
|
90
|
+
id,
|
|
91
|
+
name,
|
|
92
|
+
projectType: (config.projectType || 'react-typescript'),
|
|
93
|
+
createdAt: now,
|
|
94
|
+
updatedAt: now,
|
|
95
|
+
data: config
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
async load(id) {
|
|
99
|
+
const row = this.db.prepare('SELECT * FROM configs WHERE id = ?').get(id);
|
|
100
|
+
if (!row)
|
|
101
|
+
return null;
|
|
102
|
+
return {
|
|
103
|
+
id: row.id,
|
|
104
|
+
name: row.name,
|
|
105
|
+
projectType: row.project_type,
|
|
106
|
+
createdAt: row.created_at,
|
|
107
|
+
updatedAt: row.updated_at,
|
|
108
|
+
data: JSON.parse(row.data)
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
async list() {
|
|
112
|
+
const rows = this.db.prepare('SELECT * FROM configs WHERE name != ? ORDER BY updated_at DESC').all('__active__');
|
|
113
|
+
return rows.map(row => ({
|
|
114
|
+
id: row.id,
|
|
115
|
+
name: row.name,
|
|
116
|
+
projectType: row.project_type,
|
|
117
|
+
createdAt: row.created_at,
|
|
118
|
+
updatedAt: row.updated_at,
|
|
119
|
+
data: JSON.parse(row.data)
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
async delete(id) {
|
|
123
|
+
const result = this.db.prepare('DELETE FROM configs WHERE id = ?').run(id);
|
|
124
|
+
return result.changes > 0;
|
|
125
|
+
}
|
|
126
|
+
async export(id) {
|
|
127
|
+
const config = await this.load(id);
|
|
128
|
+
if (!config)
|
|
129
|
+
return null;
|
|
130
|
+
return JSON.stringify(config, null, 2);
|
|
131
|
+
}
|
|
132
|
+
async import(json) {
|
|
133
|
+
const parsed = JSON.parse(json);
|
|
134
|
+
const config = parsed.data || parsed;
|
|
135
|
+
const name = parsed.name || `imported-${Date.now()}`;
|
|
136
|
+
return this.save(name, config);
|
|
137
|
+
}
|
|
138
|
+
async close() {
|
|
139
|
+
// Handled by StorageManager
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// ============================================================================
|
|
143
|
+
// SQLite Rule Store
|
|
144
|
+
// ============================================================================
|
|
145
|
+
export class SQLiteRuleStore {
|
|
146
|
+
db;
|
|
147
|
+
constructor(db) {
|
|
148
|
+
this.db = db;
|
|
149
|
+
}
|
|
150
|
+
async init() {
|
|
151
|
+
this.db.exec(`
|
|
152
|
+
CREATE TABLE IF NOT EXISTS rules (
|
|
153
|
+
id TEXT PRIMARY KEY,
|
|
154
|
+
project_type TEXT NOT NULL,
|
|
155
|
+
category TEXT NOT NULL,
|
|
156
|
+
name TEXT NOT NULL,
|
|
157
|
+
content TEXT NOT NULL,
|
|
158
|
+
enabled INTEGER DEFAULT 1,
|
|
159
|
+
source TEXT NOT NULL DEFAULT 'user',
|
|
160
|
+
created_at TEXT NOT NULL,
|
|
161
|
+
updated_at TEXT NOT NULL,
|
|
162
|
+
metadata TEXT
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
CREATE INDEX IF NOT EXISTS idx_rules_project ON rules(project_type);
|
|
166
|
+
CREATE INDEX IF NOT EXISTS idx_rules_category ON rules(category);
|
|
167
|
+
CREATE INDEX IF NOT EXISTS idx_rules_source ON rules(source);
|
|
168
|
+
`);
|
|
169
|
+
}
|
|
170
|
+
async create(rule) {
|
|
171
|
+
const id = `${rule.source}-${rule.projectType}-${rule.category}-${rule.name}`.replace(/\s+/g, '-');
|
|
172
|
+
const now = nowISO();
|
|
173
|
+
this.db.prepare(`
|
|
174
|
+
INSERT OR REPLACE INTO rules
|
|
175
|
+
(id, project_type, category, name, content, enabled, source, created_at, updated_at, metadata)
|
|
176
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
177
|
+
`).run(id, rule.projectType, rule.category, rule.name, rule.content, rule.enabled ? 1 : 0, rule.source, now, now, rule.metadata ? JSON.stringify(rule.metadata) : null);
|
|
178
|
+
return {
|
|
179
|
+
id,
|
|
180
|
+
...rule,
|
|
181
|
+
createdAt: now,
|
|
182
|
+
updatedAt: now
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
async get(id) {
|
|
186
|
+
const row = this.db.prepare('SELECT * FROM rules WHERE id = ?').get(id);
|
|
187
|
+
if (!row)
|
|
188
|
+
return null;
|
|
189
|
+
return this.rowToRule(row);
|
|
190
|
+
}
|
|
191
|
+
async list(filters) {
|
|
192
|
+
let sql = 'SELECT * FROM rules WHERE 1=1';
|
|
193
|
+
const params = [];
|
|
194
|
+
if (filters?.projectType) {
|
|
195
|
+
sql += ' AND project_type = ?';
|
|
196
|
+
params.push(filters.projectType);
|
|
197
|
+
}
|
|
198
|
+
if (filters?.category) {
|
|
199
|
+
sql += ' AND category = ?';
|
|
200
|
+
params.push(filters.category);
|
|
201
|
+
}
|
|
202
|
+
if (filters?.source) {
|
|
203
|
+
sql += ' AND source = ?';
|
|
204
|
+
params.push(filters.source);
|
|
205
|
+
}
|
|
206
|
+
if (filters?.enabled !== undefined) {
|
|
207
|
+
sql += ' AND enabled = ?';
|
|
208
|
+
params.push(filters.enabled ? 1 : 0);
|
|
209
|
+
}
|
|
210
|
+
sql += ' ORDER BY updated_at DESC';
|
|
211
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
212
|
+
return rows.map(row => this.rowToRule(row));
|
|
213
|
+
}
|
|
214
|
+
async update(id, updates) {
|
|
215
|
+
const existing = await this.get(id);
|
|
216
|
+
if (!existing)
|
|
217
|
+
return null;
|
|
218
|
+
const now = nowISO();
|
|
219
|
+
const updated = { ...existing, ...updates, updatedAt: now };
|
|
220
|
+
this.db.prepare(`
|
|
221
|
+
UPDATE rules SET
|
|
222
|
+
project_type = ?,
|
|
223
|
+
category = ?,
|
|
224
|
+
name = ?,
|
|
225
|
+
content = ?,
|
|
226
|
+
enabled = ?,
|
|
227
|
+
source = ?,
|
|
228
|
+
updated_at = ?,
|
|
229
|
+
metadata = ?
|
|
230
|
+
WHERE id = ?
|
|
231
|
+
`).run(updated.projectType, updated.category, updated.name, updated.content, updated.enabled ? 1 : 0, updated.source, now, updated.metadata ? JSON.stringify(updated.metadata) : null, id);
|
|
232
|
+
return updated;
|
|
233
|
+
}
|
|
234
|
+
async delete(id) {
|
|
235
|
+
const result = this.db.prepare('DELETE FROM rules WHERE id = ?').run(id);
|
|
236
|
+
return result.changes > 0;
|
|
237
|
+
}
|
|
238
|
+
async setEnabled(id, enabled) {
|
|
239
|
+
const result = this.db.prepare('UPDATE rules SET enabled = ?, updated_at = ? WHERE id = ?').run(enabled ? 1 : 0, nowISO(), id);
|
|
240
|
+
return result.changes > 0;
|
|
241
|
+
}
|
|
242
|
+
async importBatch(rules) {
|
|
243
|
+
const results = [];
|
|
244
|
+
this.db.transaction(() => {
|
|
245
|
+
for (const rule of rules) {
|
|
246
|
+
const created = this.createSync(rule);
|
|
247
|
+
results.push(created);
|
|
248
|
+
}
|
|
249
|
+
})();
|
|
250
|
+
return results;
|
|
251
|
+
}
|
|
252
|
+
createSync(rule) {
|
|
253
|
+
const id = `${rule.source}-${rule.projectType}-${rule.category}-${rule.name}`.replace(/\s+/g, '-');
|
|
254
|
+
const now = nowISO();
|
|
255
|
+
this.db.prepare(`
|
|
256
|
+
INSERT OR REPLACE INTO rules
|
|
257
|
+
(id, project_type, category, name, content, enabled, source, created_at, updated_at, metadata)
|
|
258
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
259
|
+
`).run(id, rule.projectType, rule.category, rule.name, rule.content, rule.enabled ? 1 : 0, rule.source, now, now, rule.metadata ? JSON.stringify(rule.metadata) : null);
|
|
260
|
+
return { id, ...rule, createdAt: now, updatedAt: now };
|
|
261
|
+
}
|
|
262
|
+
async exportAll(filters) {
|
|
263
|
+
const rules = await this.list(filters);
|
|
264
|
+
return JSON.stringify(rules, null, 2);
|
|
265
|
+
}
|
|
266
|
+
async close() {
|
|
267
|
+
// Handled by StorageManager
|
|
268
|
+
}
|
|
269
|
+
rowToRule(row) {
|
|
270
|
+
return {
|
|
271
|
+
id: row.id,
|
|
272
|
+
projectType: row.project_type,
|
|
273
|
+
category: row.category,
|
|
274
|
+
name: row.name,
|
|
275
|
+
content: row.content,
|
|
276
|
+
enabled: row.enabled === 1,
|
|
277
|
+
source: row.source,
|
|
278
|
+
createdAt: row.created_at,
|
|
279
|
+
updatedAt: row.updated_at,
|
|
280
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// ============================================================================
|
|
285
|
+
// SQLite Cache Store
|
|
286
|
+
// ============================================================================
|
|
287
|
+
export class SQLiteCacheStore {
|
|
288
|
+
db;
|
|
289
|
+
defaultTTL;
|
|
290
|
+
constructor(db, defaultTTL = 604800) {
|
|
291
|
+
this.db = db;
|
|
292
|
+
this.defaultTTL = defaultTTL;
|
|
293
|
+
}
|
|
294
|
+
async init() {
|
|
295
|
+
this.db.exec(`
|
|
296
|
+
CREATE TABLE IF NOT EXISTS cache (
|
|
297
|
+
key TEXT PRIMARY KEY,
|
|
298
|
+
value TEXT NOT NULL,
|
|
299
|
+
created_at TEXT NOT NULL,
|
|
300
|
+
expires_at TEXT,
|
|
301
|
+
etag TEXT,
|
|
302
|
+
last_modified TEXT,
|
|
303
|
+
metadata TEXT
|
|
304
|
+
);
|
|
305
|
+
|
|
306
|
+
CREATE INDEX IF NOT EXISTS idx_cache_expires ON cache(expires_at);
|
|
307
|
+
`);
|
|
308
|
+
}
|
|
309
|
+
async get(key) {
|
|
310
|
+
const row = this.db.prepare('SELECT * FROM cache WHERE key = ?').get(key);
|
|
311
|
+
if (!row)
|
|
312
|
+
return null;
|
|
313
|
+
// Check expiration
|
|
314
|
+
if (row.expires_at && new Date(row.expires_at) < new Date()) {
|
|
315
|
+
await this.delete(key);
|
|
316
|
+
return null;
|
|
317
|
+
}
|
|
318
|
+
return {
|
|
319
|
+
key: row.key,
|
|
320
|
+
value: JSON.parse(row.value),
|
|
321
|
+
createdAt: row.created_at,
|
|
322
|
+
expiresAt: row.expires_at,
|
|
323
|
+
etag: row.etag,
|
|
324
|
+
lastModified: row.last_modified,
|
|
325
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
async set(key, value, options) {
|
|
329
|
+
const now = nowISO();
|
|
330
|
+
const ttl = options?.ttl ?? this.defaultTTL;
|
|
331
|
+
const expiresAt = ttl > 0
|
|
332
|
+
? new Date(Date.now() + ttl * 1000).toISOString()
|
|
333
|
+
: null;
|
|
334
|
+
this.db.prepare(`
|
|
335
|
+
INSERT OR REPLACE INTO cache
|
|
336
|
+
(key, value, created_at, expires_at, etag, last_modified, metadata)
|
|
337
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
338
|
+
`).run(key, JSON.stringify(value), now, expiresAt, options?.etag ?? null, options?.lastModified ?? null, options?.metadata ? JSON.stringify(options.metadata) : null);
|
|
339
|
+
}
|
|
340
|
+
async has(key) {
|
|
341
|
+
const entry = await this.get(key);
|
|
342
|
+
return entry !== null;
|
|
343
|
+
}
|
|
344
|
+
async delete(key) {
|
|
345
|
+
const result = this.db.prepare('DELETE FROM cache WHERE key = ?').run(key);
|
|
346
|
+
return result.changes > 0;
|
|
347
|
+
}
|
|
348
|
+
async prune() {
|
|
349
|
+
const now = nowISO();
|
|
350
|
+
const result = this.db.prepare('DELETE FROM cache WHERE expires_at IS NOT NULL AND expires_at < ?').run(now);
|
|
351
|
+
return result.changes;
|
|
352
|
+
}
|
|
353
|
+
async clear() {
|
|
354
|
+
this.db.exec('DELETE FROM cache');
|
|
355
|
+
}
|
|
356
|
+
async stats() {
|
|
357
|
+
const now = nowISO();
|
|
358
|
+
const total = this.db.prepare('SELECT COUNT(*) as count FROM cache').get();
|
|
359
|
+
const expired = this.db.prepare('SELECT COUNT(*) as count FROM cache WHERE expires_at IS NOT NULL AND expires_at < ?').get(now);
|
|
360
|
+
const size = this.db.prepare('SELECT SUM(LENGTH(value)) as size FROM cache').get();
|
|
361
|
+
return {
|
|
362
|
+
totalEntries: total.count,
|
|
363
|
+
totalSize: size.size || 0,
|
|
364
|
+
expiredEntries: expired.count
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
async close() {
|
|
368
|
+
// Handled by StorageManager
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
// ============================================================================
|
|
372
|
+
// SQLite Storage Manager
|
|
373
|
+
// ============================================================================
|
|
374
|
+
export class SQLiteStorageManager {
|
|
375
|
+
db;
|
|
376
|
+
_config;
|
|
377
|
+
_rules;
|
|
378
|
+
_cache;
|
|
379
|
+
options;
|
|
380
|
+
constructor(options = {}) {
|
|
381
|
+
const baseDir = options.baseDir || getDefaultBaseDir();
|
|
382
|
+
this.options = {
|
|
383
|
+
baseDir,
|
|
384
|
+
dbName: options.dbName || 'stackguide.db',
|
|
385
|
+
walMode: options.walMode ?? true,
|
|
386
|
+
defaultCacheTTL: options.defaultCacheTTL ?? 604800,
|
|
387
|
+
debug: options.debug ?? false
|
|
388
|
+
};
|
|
389
|
+
// Ensure directory exists
|
|
390
|
+
if (!fs.existsSync(baseDir)) {
|
|
391
|
+
fs.mkdirSync(baseDir, { recursive: true });
|
|
392
|
+
}
|
|
393
|
+
const dbPath = path.join(baseDir, this.options.dbName);
|
|
394
|
+
this.db = new Database(dbPath, {
|
|
395
|
+
verbose: this.options.debug ? console.log : undefined
|
|
396
|
+
});
|
|
397
|
+
if (this.options.walMode) {
|
|
398
|
+
this.db.pragma('journal_mode = WAL');
|
|
399
|
+
}
|
|
400
|
+
this._config = new SQLiteConfigStore(this.db);
|
|
401
|
+
this._rules = new SQLiteRuleStore(this.db);
|
|
402
|
+
this._cache = new SQLiteCacheStore(this.db, this.options.defaultCacheTTL);
|
|
403
|
+
}
|
|
404
|
+
get config() {
|
|
405
|
+
return this._config;
|
|
406
|
+
}
|
|
407
|
+
get rules() {
|
|
408
|
+
return this._rules;
|
|
409
|
+
}
|
|
410
|
+
get cache() {
|
|
411
|
+
return this._cache;
|
|
412
|
+
}
|
|
413
|
+
async init() {
|
|
414
|
+
await this._config.init();
|
|
415
|
+
await this._rules.init();
|
|
416
|
+
await this._cache.init();
|
|
417
|
+
// Run migrations
|
|
418
|
+
await this.migrate();
|
|
419
|
+
}
|
|
420
|
+
async close() {
|
|
421
|
+
this.db.close();
|
|
422
|
+
}
|
|
423
|
+
async migrate() {
|
|
424
|
+
// Schema version tracking
|
|
425
|
+
this.db.exec(`
|
|
426
|
+
CREATE TABLE IF NOT EXISTS schema_version (
|
|
427
|
+
version INTEGER PRIMARY KEY,
|
|
428
|
+
applied_at TEXT NOT NULL
|
|
429
|
+
)
|
|
430
|
+
`);
|
|
431
|
+
const currentVersion = this.db.prepare('SELECT MAX(version) as version FROM schema_version').get();
|
|
432
|
+
const version = currentVersion?.version || 0;
|
|
433
|
+
// Future migrations go here
|
|
434
|
+
// if (version < 1) { ... migrate ... }
|
|
435
|
+
}
|
|
436
|
+
async stats() {
|
|
437
|
+
const configs = this.db.prepare('SELECT COUNT(*) as count FROM configs').get();
|
|
438
|
+
const rules = this.db.prepare('SELECT COUNT(*) as count FROM rules').get();
|
|
439
|
+
const cache = this.db.prepare('SELECT COUNT(*) as count FROM cache').get();
|
|
440
|
+
const dbPath = path.join(this.options.baseDir, this.options.dbName);
|
|
441
|
+
const dbStats = fs.statSync(dbPath);
|
|
442
|
+
return {
|
|
443
|
+
configs: configs.count,
|
|
444
|
+
rules: rules.count,
|
|
445
|
+
cacheEntries: cache.count,
|
|
446
|
+
dbSize: dbStats.size
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
// ============================================================================
|
|
451
|
+
// Singleton Instance
|
|
452
|
+
// ============================================================================
|
|
453
|
+
let storageInstance = null;
|
|
454
|
+
export function getStorage(options) {
|
|
455
|
+
if (!storageInstance) {
|
|
456
|
+
storageInstance = new SQLiteStorageManager(options);
|
|
457
|
+
}
|
|
458
|
+
return storageInstance;
|
|
459
|
+
}
|
|
460
|
+
export async function initStorage(options) {
|
|
461
|
+
const storage = getStorage(options);
|
|
462
|
+
await storage.init();
|
|
463
|
+
return storage;
|
|
464
|
+
}
|
|
465
|
+
export async function closeStorage() {
|
|
466
|
+
if (storageInstance) {
|
|
467
|
+
await storageInstance.close();
|
|
468
|
+
storageInstance = null;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/storage/sqlite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage Layer Types
|
|
3
|
+
* Defines interfaces for persistent storage (SQLite/JSON)
|
|
4
|
+
* @version 3.4.0
|
|
5
|
+
*/
|
|
6
|
+
import type { UserConfiguration, ProjectType } from '../config/types.js';
|
|
7
|
+
export interface SavedConfig {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
projectType: ProjectType;
|
|
11
|
+
createdAt: string;
|
|
12
|
+
updatedAt: string;
|
|
13
|
+
data: UserConfiguration;
|
|
14
|
+
}
|
|
15
|
+
export interface ConfigStore {
|
|
16
|
+
/** Initialize storage (create tables/files if needed) */
|
|
17
|
+
init(): Promise<void>;
|
|
18
|
+
/** Get active configuration */
|
|
19
|
+
getActive(): Promise<SavedConfig | null>;
|
|
20
|
+
/** Set active configuration */
|
|
21
|
+
setActive(config: UserConfiguration): Promise<void>;
|
|
22
|
+
/** Save configuration with name */
|
|
23
|
+
save(name: string, config: UserConfiguration): Promise<SavedConfig>;
|
|
24
|
+
/** Load configuration by ID */
|
|
25
|
+
load(id: string): Promise<SavedConfig | null>;
|
|
26
|
+
/** List all saved configurations */
|
|
27
|
+
list(): Promise<SavedConfig[]>;
|
|
28
|
+
/** Delete configuration by ID */
|
|
29
|
+
delete(id: string): Promise<boolean>;
|
|
30
|
+
/** Export configuration as JSON string */
|
|
31
|
+
export(id: string): Promise<string | null>;
|
|
32
|
+
/** Import configuration from JSON string */
|
|
33
|
+
import(json: string): Promise<SavedConfig>;
|
|
34
|
+
/** Close storage connection */
|
|
35
|
+
close(): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
export interface StoredRule {
|
|
38
|
+
id: string;
|
|
39
|
+
projectType: ProjectType;
|
|
40
|
+
category: string;
|
|
41
|
+
name: string;
|
|
42
|
+
content: string;
|
|
43
|
+
enabled: boolean;
|
|
44
|
+
source: 'user' | 'project' | 'cursor';
|
|
45
|
+
createdAt: string;
|
|
46
|
+
updatedAt: string;
|
|
47
|
+
metadata?: Record<string, unknown>;
|
|
48
|
+
}
|
|
49
|
+
export interface RuleStore {
|
|
50
|
+
/** Initialize storage */
|
|
51
|
+
init(): Promise<void>;
|
|
52
|
+
/** Create a new rule */
|
|
53
|
+
create(rule: Omit<StoredRule, 'id' | 'createdAt' | 'updatedAt'>): Promise<StoredRule>;
|
|
54
|
+
/** Get rule by ID */
|
|
55
|
+
get(id: string): Promise<StoredRule | null>;
|
|
56
|
+
/** List rules with optional filters */
|
|
57
|
+
list(filters?: {
|
|
58
|
+
projectType?: ProjectType;
|
|
59
|
+
category?: string;
|
|
60
|
+
source?: StoredRule['source'];
|
|
61
|
+
enabled?: boolean;
|
|
62
|
+
}): Promise<StoredRule[]>;
|
|
63
|
+
/** Update rule by ID */
|
|
64
|
+
update(id: string, updates: Partial<Omit<StoredRule, 'id' | 'createdAt'>>): Promise<StoredRule | null>;
|
|
65
|
+
/** Delete rule by ID */
|
|
66
|
+
delete(id: string): Promise<boolean>;
|
|
67
|
+
/** Enable/disable rule */
|
|
68
|
+
setEnabled(id: string, enabled: boolean): Promise<boolean>;
|
|
69
|
+
/** Import multiple rules */
|
|
70
|
+
importBatch(rules: Omit<StoredRule, 'id' | 'createdAt' | 'updatedAt'>[]): Promise<StoredRule[]>;
|
|
71
|
+
/** Export rules as JSON */
|
|
72
|
+
exportAll(filters?: {
|
|
73
|
+
projectType?: ProjectType;
|
|
74
|
+
}): Promise<string>;
|
|
75
|
+
/** Close storage */
|
|
76
|
+
close(): Promise<void>;
|
|
77
|
+
}
|
|
78
|
+
export interface CacheEntry<T = unknown> {
|
|
79
|
+
key: string;
|
|
80
|
+
value: T;
|
|
81
|
+
createdAt: string;
|
|
82
|
+
expiresAt: string | null;
|
|
83
|
+
etag?: string;
|
|
84
|
+
lastModified?: string;
|
|
85
|
+
metadata?: Record<string, unknown>;
|
|
86
|
+
}
|
|
87
|
+
export interface CacheStore {
|
|
88
|
+
/** Initialize cache storage */
|
|
89
|
+
init(): Promise<void>;
|
|
90
|
+
/** Get cached value */
|
|
91
|
+
get<T = unknown>(key: string): Promise<CacheEntry<T> | null>;
|
|
92
|
+
/** Set cached value with optional TTL (seconds) */
|
|
93
|
+
set<T = unknown>(key: string, value: T, options?: {
|
|
94
|
+
ttl?: number;
|
|
95
|
+
etag?: string;
|
|
96
|
+
lastModified?: string;
|
|
97
|
+
metadata?: Record<string, unknown>;
|
|
98
|
+
}): Promise<void>;
|
|
99
|
+
/** Check if key exists and is not expired */
|
|
100
|
+
has(key: string): Promise<boolean>;
|
|
101
|
+
/** Delete cached value */
|
|
102
|
+
delete(key: string): Promise<boolean>;
|
|
103
|
+
/** Delete expired entries */
|
|
104
|
+
prune(): Promise<number>;
|
|
105
|
+
/** Clear all cache */
|
|
106
|
+
clear(): Promise<void>;
|
|
107
|
+
/** Get cache stats */
|
|
108
|
+
stats(): Promise<{
|
|
109
|
+
totalEntries: number;
|
|
110
|
+
totalSize: number;
|
|
111
|
+
expiredEntries: number;
|
|
112
|
+
}>;
|
|
113
|
+
/** Close storage */
|
|
114
|
+
close(): Promise<void>;
|
|
115
|
+
}
|
|
116
|
+
export interface StorageManager {
|
|
117
|
+
config: ConfigStore;
|
|
118
|
+
rules: RuleStore;
|
|
119
|
+
cache: CacheStore;
|
|
120
|
+
/** Initialize all stores */
|
|
121
|
+
init(): Promise<void>;
|
|
122
|
+
/** Close all stores */
|
|
123
|
+
close(): Promise<void>;
|
|
124
|
+
/** Run migrations if needed */
|
|
125
|
+
migrate(): Promise<void>;
|
|
126
|
+
/** Get storage stats */
|
|
127
|
+
stats(): Promise<{
|
|
128
|
+
configs: number;
|
|
129
|
+
rules: number;
|
|
130
|
+
cacheEntries: number;
|
|
131
|
+
dbSize: number;
|
|
132
|
+
}>;
|
|
133
|
+
}
|
|
134
|
+
export interface StorageOptions {
|
|
135
|
+
/** Base directory for storage (default: ~/.stackguide) */
|
|
136
|
+
baseDir?: string;
|
|
137
|
+
/** Database filename (default: stackguide.db) */
|
|
138
|
+
dbName?: string;
|
|
139
|
+
/** Enable WAL mode for SQLite (default: true) */
|
|
140
|
+
walMode?: boolean;
|
|
141
|
+
/** Cache TTL in seconds (default: 604800 = 7 days) */
|
|
142
|
+
defaultCacheTTL?: number;
|
|
143
|
+
/** Enable debug logging */
|
|
144
|
+
debug?: boolean;
|
|
145
|
+
}
|
|
146
|
+
export declare const DEFAULT_STORAGE_OPTIONS: Required<StorageOptions>;
|
|
147
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage Layer Types
|
|
3
|
+
* Defines interfaces for persistent storage (SQLite/JSON)
|
|
4
|
+
* @version 3.4.0
|
|
5
|
+
*/
|
|
6
|
+
export const DEFAULT_STORAGE_OPTIONS = {
|
|
7
|
+
baseDir: '', // Will be set to ~/.stackguide at runtime
|
|
8
|
+
dbName: 'stackguide.db',
|
|
9
|
+
walMode: true,
|
|
10
|
+
defaultCacheTTL: 604800, // 7 days
|
|
11
|
+
debug: false
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2MH,MAAM,CAAC,MAAM,uBAAuB,GAA6B;IAC/D,OAAO,EAAE,EAAE,EAAG,0CAA0C;IACxD,MAAM,EAAE,eAAe;IACvB,OAAO,EAAE,IAAI;IACb,eAAe,EAAE,MAAM,EAAE,SAAS;IAClC,KAAK,EAAE,KAAK;CACb,CAAC"}
|