kratos-mcp 1.1.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 (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +351 -0
  3. package/dist/host-middleware-v2.d.ts +3 -0
  4. package/dist/host-middleware-v2.d.ts.map +1 -0
  5. package/dist/host-middleware-v2.js +471 -0
  6. package/dist/host-middleware-v2.js.map +1 -0
  7. package/dist/index.d.ts +21 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +939 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/memory-server/concept-store-enhanced.d.ts +88 -0
  12. package/dist/memory-server/concept-store-enhanced.d.ts.map +1 -0
  13. package/dist/memory-server/concept-store-enhanced.js +392 -0
  14. package/dist/memory-server/concept-store-enhanced.js.map +1 -0
  15. package/dist/memory-server/concept-store.d.ts +58 -0
  16. package/dist/memory-server/concept-store.d.ts.map +1 -0
  17. package/dist/memory-server/concept-store.js +329 -0
  18. package/dist/memory-server/concept-store.js.map +1 -0
  19. package/dist/memory-server/context-broker.d.ts +63 -0
  20. package/dist/memory-server/context-broker.d.ts.map +1 -0
  21. package/dist/memory-server/context-broker.js +340 -0
  22. package/dist/memory-server/context-broker.js.map +1 -0
  23. package/dist/memory-server/database.d.ts +61 -0
  24. package/dist/memory-server/database.d.ts.map +1 -0
  25. package/dist/memory-server/database.js +309 -0
  26. package/dist/memory-server/database.js.map +1 -0
  27. package/dist/modules/prd/index.d.ts +47 -0
  28. package/dist/modules/prd/index.d.ts.map +1 -0
  29. package/dist/modules/prd/index.js +220 -0
  30. package/dist/modules/prd/index.js.map +1 -0
  31. package/dist/modules/prompt/index.d.ts +47 -0
  32. package/dist/modules/prompt/index.d.ts.map +1 -0
  33. package/dist/modules/prompt/index.js +313 -0
  34. package/dist/modules/prompt/index.js.map +1 -0
  35. package/dist/project-manager.d.ts +69 -0
  36. package/dist/project-manager.d.ts.map +1 -0
  37. package/dist/project-manager.js +207 -0
  38. package/dist/project-manager.js.map +1 -0
  39. package/dist/security/data-retention.d.ts +104 -0
  40. package/dist/security/data-retention.d.ts.map +1 -0
  41. package/dist/security/data-retention.js +444 -0
  42. package/dist/security/data-retention.js.map +1 -0
  43. package/dist/security/encryption.d.ts +48 -0
  44. package/dist/security/encryption.d.ts.map +1 -0
  45. package/dist/security/encryption.js +131 -0
  46. package/dist/security/encryption.js.map +1 -0
  47. package/dist/security/pii-detector.d.ts +61 -0
  48. package/dist/security/pii-detector.d.ts.map +1 -0
  49. package/dist/security/pii-detector.js +220 -0
  50. package/dist/security/pii-detector.js.map +1 -0
  51. package/dist/tools/ci-hooks.d.ts +48 -0
  52. package/dist/tools/ci-hooks.d.ts.map +1 -0
  53. package/dist/tools/ci-hooks.js +452 -0
  54. package/dist/tools/ci-hooks.js.map +1 -0
  55. package/dist/tools/migrate-to-sqlite.d.ts +32 -0
  56. package/dist/tools/migrate-to-sqlite.d.ts.map +1 -0
  57. package/dist/tools/migrate-to-sqlite.js +341 -0
  58. package/dist/tools/migrate-to-sqlite.js.map +1 -0
  59. package/dist/types/index.d.ts +151 -0
  60. package/dist/types/index.d.ts.map +1 -0
  61. package/dist/types/index.js +2 -0
  62. package/dist/types/index.js.map +1 -0
  63. package/dist/utils/logger.d.ts +9 -0
  64. package/dist/utils/logger.d.ts.map +1 -0
  65. package/dist/utils/logger.js +33 -0
  66. package/dist/utils/logger.js.map +1 -0
  67. package/dist/utils/mcp-logger.d.ts +14 -0
  68. package/dist/utils/mcp-logger.d.ts.map +1 -0
  69. package/dist/utils/mcp-logger.js +40 -0
  70. package/dist/utils/mcp-logger.js.map +1 -0
  71. package/package.json +88 -0
@@ -0,0 +1,309 @@
1
+ import Database from 'better-sqlite3';
2
+ import path from 'path';
3
+ import fs from 'fs-extra';
4
+ import crypto from 'crypto';
5
+ import { MCPLogger as Logger } from '../utils/mcp-logger.js';
6
+ const logger = new Logger('MemoryDB');
7
+ export class MemoryDatabase {
8
+ db;
9
+ projectId;
10
+ projectRoot;
11
+ constructor(projectRoot, projectId) {
12
+ this.projectRoot = projectRoot;
13
+ this.projectId = projectId;
14
+ // CRITICAL: Each project gets COMPLETELY ISOLATED database
15
+ // Path: ~/.kratos/projects/{project_id}/databases/memories.db
16
+ // This ensures NO cross-contamination between projects
17
+ const kratosHome = path.join(process.env.HOME || process.env.USERPROFILE || '', '.kratos');
18
+ const dbPath = path.join(kratosHome, 'projects', projectId, 'databases', 'memories.db');
19
+ fs.ensureDirSync(path.dirname(dbPath));
20
+ this.db = new Database(dbPath);
21
+ this.db.pragma('journal_mode = WAL');
22
+ this.db.pragma('foreign_keys = ON');
23
+ this.initializeSchema();
24
+ this.setupTriggers();
25
+ logger.info(`Memory database ISOLATED for project: ${projectId} at ${dbPath}`);
26
+ }
27
+ initializeSchema() {
28
+ // Main memories table
29
+ this.db.exec(`
30
+ CREATE TABLE IF NOT EXISTS memories (
31
+ id TEXT PRIMARY KEY,
32
+ project_id TEXT NOT NULL,
33
+ summary TEXT NOT NULL,
34
+ text TEXT NOT NULL,
35
+ tags TEXT DEFAULT '[]',
36
+ paths TEXT DEFAULT '[]',
37
+ importance INTEGER DEFAULT 3 CHECK(importance >= 1 AND importance <= 5),
38
+ created_at INTEGER NOT NULL,
39
+ updated_at INTEGER NOT NULL,
40
+ ttl INTEGER,
41
+ expires_at INTEGER,
42
+ dedupe_hash TEXT
43
+ );
44
+
45
+ CREATE INDEX IF NOT EXISTS idx_mem_project ON memories(project_id);
46
+ CREATE INDEX IF NOT EXISTS idx_mem_expires ON memories(expires_at) WHERE expires_at IS NOT NULL;
47
+ CREATE INDEX IF NOT EXISTS idx_mem_importance ON memories(importance DESC, created_at DESC);
48
+ CREATE INDEX IF NOT EXISTS idx_mem_dedupe ON memories(dedupe_hash);
49
+ `);
50
+ // Full-text search virtual table - INCLUDING TAGS for better search
51
+ this.db.exec(`
52
+ CREATE VIRTUAL TABLE IF NOT EXISTS mem_fts USING fts5(
53
+ summary,
54
+ text,
55
+ tags,
56
+ content='memories',
57
+ content_rowid='rowid',
58
+ tokenize='porter unicode61'
59
+ );
60
+
61
+ -- Triggers to keep FTS in sync - now including tags
62
+ CREATE TRIGGER IF NOT EXISTS mem_fts_insert AFTER INSERT ON memories BEGIN
63
+ INSERT INTO mem_fts(rowid, summary, text, tags)
64
+ VALUES (new.rowid, new.summary, new.text,
65
+ CASE WHEN json_array_length(new.tags) > 0
66
+ THEN (SELECT group_concat(value, ' ') FROM json_each(new.tags))
67
+ ELSE ''
68
+ END);
69
+ END;
70
+
71
+ CREATE TRIGGER IF NOT EXISTS mem_fts_delete AFTER DELETE ON memories BEGIN
72
+ DELETE FROM mem_fts WHERE rowid = old.rowid;
73
+ END;
74
+
75
+ CREATE TRIGGER IF NOT EXISTS mem_fts_update AFTER UPDATE ON memories BEGIN
76
+ DELETE FROM mem_fts WHERE rowid = old.rowid;
77
+ INSERT INTO mem_fts(rowid, summary, text, tags)
78
+ VALUES (new.rowid, new.summary, new.text,
79
+ CASE WHEN json_array_length(new.tags) > 0
80
+ THEN (SELECT group_concat(value, ' ') FROM json_each(new.tags))
81
+ ELSE ''
82
+ END);
83
+ END;
84
+ `);
85
+ }
86
+ setupTriggers() {
87
+ // Auto-cleanup expired memories
88
+ setInterval(() => {
89
+ this.cleanupExpired();
90
+ }, 60 * 60 * 1000); // Every hour
91
+ }
92
+ save(params) {
93
+ // Project isolation is enforced by the database path itself
94
+ // Each project has its own database file, so no cross-contamination is possible
95
+ const now = Date.now();
96
+ const id = this.generateId();
97
+ // Compute dedupe hash
98
+ const dedupeHash = this.computeDedupeHash(params.summary, params.paths || []);
99
+ // Check for duplicates
100
+ const existing = this.db.prepare('SELECT id FROM memories WHERE dedupe_hash = ? AND project_id = ?').get(dedupeHash, this.projectId);
101
+ if (existing && typeof existing === 'object' && 'id' in existing) {
102
+ logger.info(`Duplicate memory detected, updating existing: ${existing.id}`);
103
+ return this.update(existing.id, params);
104
+ }
105
+ // Calculate expiration
106
+ const expires_at = params.ttl ? now + (params.ttl * 1000) : null;
107
+ const stmt = this.db.prepare(`
108
+ INSERT INTO memories (
109
+ id, project_id, summary, text, tags, paths,
110
+ importance, created_at, updated_at, ttl, expires_at, dedupe_hash
111
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
112
+ `);
113
+ stmt.run(id, this.projectId, params.summary, params.text, JSON.stringify(params.tags || []), JSON.stringify(params.paths || []), params.importance || 3, now, now, params.ttl || null, expires_at, dedupeHash);
114
+ logger.info(`Memory saved: ${id} - ${params.summary}`);
115
+ // Return the complete memory object
116
+ const memory = {
117
+ id,
118
+ project_id: this.projectId,
119
+ summary: params.summary,
120
+ text: params.text,
121
+ tags: params.tags || [],
122
+ paths: params.paths || [],
123
+ importance: params.importance || 3,
124
+ created_at: now,
125
+ updated_at: now,
126
+ ttl: params.ttl,
127
+ expires_at: expires_at || undefined
128
+ };
129
+ return memory;
130
+ }
131
+ search(params) {
132
+ const k = params.k || 10;
133
+ const now = Date.now();
134
+ // Build FTS query
135
+ let query = `
136
+ SELECT
137
+ m.*,
138
+ bm25(mem_fts) as fts_score,
139
+ snippet(mem_fts, 0, '[', ']', '...', 32) as snippet
140
+ FROM memories m
141
+ JOIN mem_fts ON m.rowid = mem_fts.rowid
142
+ WHERE mem_fts MATCH ?
143
+ AND m.project_id = ?
144
+ `;
145
+ const queryParams = [this.escapeQuery(params.q), this.projectId];
146
+ // Add expiration filter
147
+ if (!params.include_expired) {
148
+ query += ' AND (m.expires_at IS NULL OR m.expires_at > ?)';
149
+ queryParams.push(now);
150
+ }
151
+ // Add tag filter
152
+ if (params.tags && params.tags.length > 0) {
153
+ query += ' AND EXISTS (SELECT 1 FROM json_each(m.tags) WHERE value IN (' +
154
+ params.tags.map(() => '?').join(',') + '))';
155
+ queryParams.push(...params.tags);
156
+ }
157
+ query += ' ORDER BY fts_score DESC, m.importance DESC, m.created_at DESC LIMIT ?';
158
+ queryParams.push(k);
159
+ const stmt = this.db.prepare(query);
160
+ const results = stmt.all(...queryParams);
161
+ return results.map(row => ({
162
+ memory: this.rowToMemory(row),
163
+ score: -row.fts_score, // BM25 returns negative scores
164
+ snippet: row.snippet
165
+ }));
166
+ }
167
+ getRecent(params) {
168
+ const k = params.k || 10;
169
+ const now = Date.now();
170
+ let query = `
171
+ SELECT * FROM memories
172
+ WHERE project_id = ?
173
+ `;
174
+ const queryParams = [this.projectId];
175
+ if (!params.include_expired) {
176
+ query += ' AND (expires_at IS NULL OR expires_at > ?)';
177
+ queryParams.push(now);
178
+ }
179
+ if (params.path_prefix) {
180
+ query += ` AND EXISTS (
181
+ SELECT 1 FROM json_each(paths)
182
+ WHERE value LIKE ? || '%'
183
+ )`;
184
+ queryParams.push(params.path_prefix);
185
+ }
186
+ query += ' ORDER BY created_at DESC LIMIT ?';
187
+ queryParams.push(k);
188
+ const stmt = this.db.prepare(query);
189
+ const results = stmt.all(...queryParams);
190
+ return results.map(row => this.rowToMemory(row));
191
+ }
192
+ forget(id) {
193
+ try {
194
+ // Project isolation is enforced - each project has its own database
195
+ // Check if memory exists first
196
+ const checkStmt = this.db.prepare('SELECT id FROM memories WHERE id = ? AND project_id = ?');
197
+ const exists = checkStmt.get(id, this.projectId);
198
+ if (!exists) {
199
+ return {
200
+ ok: false,
201
+ message: `Memory ${id} not found in project ${this.projectId}`
202
+ };
203
+ }
204
+ // Delete from main table
205
+ const stmt = this.db.prepare('DELETE FROM memories WHERE id = ? AND project_id = ?');
206
+ const result = stmt.run(id, this.projectId);
207
+ // Try to delete from FTS index if it exists
208
+ try {
209
+ const ftsExists = this.db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='memories_fts'").get();
210
+ if (ftsExists) {
211
+ const ftsStmt = this.db.prepare('DELETE FROM memories_fts WHERE rowid = (SELECT rowid FROM memories WHERE id = ?)');
212
+ ftsStmt.run(id);
213
+ }
214
+ }
215
+ catch (ftsError) {
216
+ // FTS table might not exist, that's okay
217
+ logger.debug('FTS deletion skipped:', ftsError);
218
+ }
219
+ logger.info(`Memory deleted: ${id}`);
220
+ return {
221
+ ok: result.changes > 0,
222
+ message: result.changes > 0 ? 'Memory deleted successfully' : 'Memory not found'
223
+ };
224
+ }
225
+ catch (error) {
226
+ logger.error(`Failed to delete memory ${id}:`, error);
227
+ return {
228
+ ok: false,
229
+ message: `Error: ${error.message}`
230
+ };
231
+ }
232
+ }
233
+ update(id, params) {
234
+ const now = Date.now();
235
+ const updates = ['updated_at = ?'];
236
+ const values = [now];
237
+ if (params.summary !== undefined) {
238
+ updates.push('summary = ?');
239
+ values.push(params.summary);
240
+ }
241
+ if (params.text !== undefined) {
242
+ updates.push('text = ?');
243
+ values.push(params.text);
244
+ }
245
+ if (params.tags !== undefined) {
246
+ updates.push('tags = ?');
247
+ values.push(JSON.stringify(params.tags));
248
+ }
249
+ if (params.paths !== undefined) {
250
+ updates.push('paths = ?');
251
+ values.push(JSON.stringify(params.paths));
252
+ }
253
+ if (params.importance !== undefined) {
254
+ updates.push('importance = ?');
255
+ values.push(params.importance);
256
+ }
257
+ values.push(id, this.projectId);
258
+ const stmt = this.db.prepare(`
259
+ UPDATE memories
260
+ SET ${updates.join(', ')}
261
+ WHERE id = ? AND project_id = ?
262
+ `);
263
+ stmt.run(...values);
264
+ return { id };
265
+ }
266
+ cleanupExpired() {
267
+ const now = Date.now();
268
+ const stmt = this.db.prepare('DELETE FROM memories WHERE expires_at < ?');
269
+ const result = stmt.run(now);
270
+ if (result.changes > 0) {
271
+ logger.info(`Cleaned up ${result.changes} expired memories`);
272
+ }
273
+ }
274
+ generateId() {
275
+ return `mem_${Date.now()}_${crypto.randomBytes(4).toString('hex')}`;
276
+ }
277
+ computeDedupeHash(summary, paths) {
278
+ const normalized = summary.toLowerCase().trim() + '|' + paths.sort().join('|');
279
+ return crypto.createHash('md5').update(normalized).digest('hex');
280
+ }
281
+ escapeQuery(query) {
282
+ // Escape FTS5 special characters
283
+ return query.replace(/["]/g, '""');
284
+ }
285
+ rowToMemory(row) {
286
+ return {
287
+ id: row.id,
288
+ project_id: row.project_id,
289
+ summary: row.summary,
290
+ text: row.text,
291
+ tags: JSON.parse(row.tags),
292
+ paths: JSON.parse(row.paths),
293
+ importance: row.importance,
294
+ created_at: row.created_at,
295
+ updated_at: row.updated_at,
296
+ ttl: row.ttl,
297
+ expires_at: row.expires_at
298
+ };
299
+ }
300
+ getActiveProjectId() {
301
+ // Always use the projectId passed to constructor - ensures true isolation
302
+ // No environment variable dependency - each database instance is bound to its project
303
+ return this.projectId;
304
+ }
305
+ close() {
306
+ this.db.close();
307
+ }
308
+ }
309
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/memory-server/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { PRD } from '../../types/index.js';
2
+ export declare class PRDManager {
3
+ private logger;
4
+ private prdPath;
5
+ private currentPRD;
6
+ constructor();
7
+ private initialize;
8
+ createPRD(args: {
9
+ projectName: string;
10
+ pages?: any[];
11
+ apiEndpoints?: any[];
12
+ dataStructures?: any[];
13
+ userFlows?: any[];
14
+ edgeCases?: any[];
15
+ integrations?: any[];
16
+ }): Promise<{
17
+ content: {
18
+ type: string;
19
+ text: string;
20
+ }[];
21
+ }>;
22
+ updatePRD(section: string, data: any): Promise<{
23
+ content: {
24
+ type: string;
25
+ text: string;
26
+ }[];
27
+ }>;
28
+ getPRD(section?: string): Promise<{
29
+ content: {
30
+ type: string;
31
+ text: string;
32
+ }[];
33
+ }>;
34
+ validatePRD(): Promise<{
35
+ isValid: boolean;
36
+ missingElements: string[];
37
+ }>;
38
+ generatePRDTemplate(projectType: string): Promise<{
39
+ content: {
40
+ type: string;
41
+ text: string;
42
+ }[];
43
+ }>;
44
+ getCurrentPRD(): Promise<PRD | null>;
45
+ private savePRD;
46
+ }
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/prd/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAwD,MAAM,sBAAsB,CAAC;AAMjG,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAoB;;YAQxB,UAAU;IAkBlB,SAAS,CAAC,IAAI,EAAE;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;QACd,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC;QACrB,cAAc,CAAC,EAAE,GAAG,EAAE,CAAC;QACvB,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;QAClB,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;QAClB,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC;KACtB;;;;;;IA2BK,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;;;;;;IAyCpC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM;;;;;;IAyDvB,WAAW,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,eAAe,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IA6BvE,mBAAmB,CAAC,WAAW,EAAE,MAAM;;;;;;IA4CvC,aAAa,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;YAI5B,OAAO;CAMtB"}
@@ -0,0 +1,220 @@
1
+ import { MCPLogger as Logger } from '../../utils/mcp-logger.js';
2
+ import { promises as fs } from 'fs';
3
+ import path from 'path';
4
+ import { randomUUID } from 'crypto';
5
+ export class PRDManager {
6
+ logger;
7
+ prdPath;
8
+ currentPRD = null;
9
+ constructor() {
10
+ this.logger = new Logger('PRDManager');
11
+ this.prdPath = path.join(process.cwd(), '.kratos', 'prd.json');
12
+ this.initialize();
13
+ }
14
+ async initialize() {
15
+ try {
16
+ const kratosDir = path.dirname(this.prdPath);
17
+ await fs.mkdir(kratosDir, { recursive: true });
18
+ // Try to load existing PRD
19
+ try {
20
+ const content = await fs.readFile(this.prdPath, 'utf-8');
21
+ this.currentPRD = JSON.parse(content);
22
+ this.logger.info('Loaded existing PRD');
23
+ }
24
+ catch {
25
+ this.logger.info('No existing PRD found');
26
+ }
27
+ }
28
+ catch (error) {
29
+ this.logger.error('Failed to initialize PRD manager', error);
30
+ }
31
+ }
32
+ async createPRD(args) {
33
+ this.currentPRD = {
34
+ id: randomUUID(),
35
+ projectName: args.projectName,
36
+ version: '1.0.0',
37
+ createdAt: new Date(),
38
+ updatedAt: new Date(),
39
+ pages: args.pages || [],
40
+ apiEndpoints: args.apiEndpoints || [],
41
+ dataStructures: args.dataStructures || [],
42
+ userFlows: args.userFlows || [],
43
+ edgeCases: args.edgeCases || [],
44
+ integrations: args.integrations || [],
45
+ };
46
+ await this.savePRD();
47
+ return {
48
+ content: [
49
+ {
50
+ type: 'text',
51
+ text: `✅ PRD created for project: ${args.projectName}\n\nNext steps:\n1. Add pages with their paths and components\n2. Define API endpoints\n3. Document data structures\n4. Map out user flows`,
52
+ },
53
+ ],
54
+ };
55
+ }
56
+ async updatePRD(section, data) {
57
+ if (!this.currentPRD) {
58
+ throw new Error('No PRD exists. Create one first.');
59
+ }
60
+ switch (section) {
61
+ case 'pages':
62
+ this.currentPRD.pages = data;
63
+ break;
64
+ case 'api':
65
+ this.currentPRD.apiEndpoints = data;
66
+ break;
67
+ case 'data':
68
+ this.currentPRD.dataStructures = data;
69
+ break;
70
+ case 'flows':
71
+ this.currentPRD.userFlows = data;
72
+ break;
73
+ case 'edges':
74
+ this.currentPRD.edgeCases = data;
75
+ break;
76
+ case 'integrations':
77
+ this.currentPRD.integrations = data;
78
+ break;
79
+ default:
80
+ throw new Error(`Unknown PRD section: ${section}`);
81
+ }
82
+ this.currentPRD.updatedAt = new Date();
83
+ await this.savePRD();
84
+ return {
85
+ content: [
86
+ {
87
+ type: 'text',
88
+ text: `✅ Updated PRD section: ${section}`,
89
+ },
90
+ ],
91
+ };
92
+ }
93
+ async getPRD(section) {
94
+ if (!this.currentPRD) {
95
+ return {
96
+ content: [
97
+ {
98
+ type: 'text',
99
+ text: '❌ No PRD found. Create one first using create_prd tool.',
100
+ },
101
+ ],
102
+ };
103
+ }
104
+ let result;
105
+ if (!section || section === 'all') {
106
+ result = this.currentPRD;
107
+ }
108
+ else {
109
+ switch (section) {
110
+ case 'pages':
111
+ result = {
112
+ pages: this.currentPRD.pages,
113
+ summary: `${this.currentPRD.pages.length} pages defined`,
114
+ };
115
+ break;
116
+ case 'api':
117
+ result = {
118
+ endpoints: this.currentPRD.apiEndpoints,
119
+ summary: `${this.currentPRD.apiEndpoints.length} API endpoints defined`,
120
+ };
121
+ break;
122
+ case 'data':
123
+ result = {
124
+ structures: this.currentPRD.dataStructures,
125
+ summary: `${this.currentPRD.dataStructures.length} data structures defined`,
126
+ };
127
+ break;
128
+ case 'flows':
129
+ result = {
130
+ userFlows: this.currentPRD.userFlows,
131
+ summary: `${this.currentPRD.userFlows.length} user flows defined`,
132
+ };
133
+ break;
134
+ default:
135
+ throw new Error(`Unknown section: ${section}`);
136
+ }
137
+ }
138
+ return {
139
+ content: [
140
+ {
141
+ type: 'text',
142
+ text: JSON.stringify(result, null, 2),
143
+ },
144
+ ],
145
+ };
146
+ }
147
+ async validatePRD() {
148
+ if (!this.currentPRD) {
149
+ return { isValid: false, missingElements: ['No PRD exists'] };
150
+ }
151
+ const missingElements = [];
152
+ if (this.currentPRD.pages.length === 0) {
153
+ missingElements.push('Pages - Define all application pages with paths');
154
+ }
155
+ if (this.currentPRD.apiEndpoints.length === 0) {
156
+ missingElements.push('API Endpoints - Document all API routes');
157
+ }
158
+ if (this.currentPRD.dataStructures.length === 0) {
159
+ missingElements.push('Data Structures - Define your data models');
160
+ }
161
+ if (this.currentPRD.userFlows.length === 0) {
162
+ missingElements.push('User Flows - Map out user journeys');
163
+ }
164
+ return {
165
+ isValid: missingElements.length === 0,
166
+ missingElements,
167
+ };
168
+ }
169
+ async generatePRDTemplate(projectType) {
170
+ const templates = {
171
+ 'web-app': {
172
+ pages: [
173
+ { path: '/', name: 'Home', description: 'Landing page', components: ['Header', 'Hero', 'Features'], dataRequirements: [] },
174
+ { path: '/login', name: 'Login', description: 'User authentication', components: ['LoginForm'], dataRequirements: ['user'] },
175
+ { path: '/dashboard', name: 'Dashboard', description: 'Main app interface', components: ['Sidebar', 'MainContent'], dataRequirements: ['user', 'data'] },
176
+ ],
177
+ apiEndpoints: [
178
+ { method: 'POST', path: '/api/auth/login', description: 'User login', authentication: false },
179
+ { method: 'POST', path: '/api/auth/logout', description: 'User logout', authentication: true },
180
+ { method: 'GET', path: '/api/user/profile', description: 'Get user profile', authentication: true },
181
+ ],
182
+ dataStructures: [
183
+ { name: 'User', schema: { id: 'string', email: 'string', name: 'string' }, relationships: [] },
184
+ ],
185
+ userFlows: [
186
+ { name: 'Authentication', steps: ['Visit login', 'Enter credentials', 'Submit form', 'Redirect to dashboard'], entryPoint: '/login', exitPoints: ['/dashboard'] },
187
+ ],
188
+ },
189
+ 'api': {
190
+ apiEndpoints: [
191
+ { method: 'GET', path: '/api/v1/health', description: 'Health check', authentication: false },
192
+ { method: 'POST', path: '/api/v1/resources', description: 'Create resource', authentication: true },
193
+ { method: 'GET', path: '/api/v1/resources', description: 'List resources', authentication: true },
194
+ ],
195
+ dataStructures: [
196
+ { name: 'Resource', schema: { id: 'string', name: 'string', createdAt: 'datetime' }, relationships: ['User'] },
197
+ ],
198
+ },
199
+ };
200
+ const template = templates[projectType] || templates['web-app'];
201
+ return {
202
+ content: [
203
+ {
204
+ type: 'text',
205
+ text: JSON.stringify(template, null, 2),
206
+ },
207
+ ],
208
+ };
209
+ }
210
+ async getCurrentPRD() {
211
+ return this.currentPRD;
212
+ }
213
+ async savePRD() {
214
+ if (!this.currentPRD)
215
+ return;
216
+ await fs.writeFile(this.prdPath, JSON.stringify(this.currentPRD, null, 2));
217
+ this.logger.info('PRD saved successfully');
218
+ }
219
+ }
220
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/prd/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ export declare class PromptManager {
2
+ private logger;
3
+ private templates;
4
+ constructor();
5
+ private initializeTemplates;
6
+ generatePrompt(args: {
7
+ task: string;
8
+ role?: string;
9
+ stack?: string[];
10
+ fileContext?: string[];
11
+ templateId?: string;
12
+ }): Promise<{
13
+ content: {
14
+ type: string;
15
+ text: string;
16
+ }[];
17
+ }>;
18
+ private buildFromTemplate;
19
+ private buildCustomPrompt;
20
+ private analyzeTaskForSuggestions;
21
+ createCustomTemplate(args: {
22
+ name: string;
23
+ role: string;
24
+ stack: string[];
25
+ goal: string;
26
+ scopeConstraints: string[];
27
+ plan: string[];
28
+ verification: string[];
29
+ }): Promise<{
30
+ content: {
31
+ type: string;
32
+ text: string;
33
+ }[];
34
+ }>;
35
+ listTemplates(): Promise<{
36
+ content: {
37
+ type: string;
38
+ text: string;
39
+ }[];
40
+ }>;
41
+ validatePrompt(prompt: string): Promise<{
42
+ isValid: boolean;
43
+ suggestions: string[];
44
+ score: number;
45
+ }>;
46
+ }
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/prompt/index.ts"],"names":[],"mappings":"AAIA,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAA0C;;IAO3D,OAAO,CAAC,mBAAmB;IAuFrB,cAAc,CAAC,IAAI,EAAE;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB;;;;;;IAyBD,OAAO,CAAC,iBAAiB;IA2CzB,OAAO,CAAC,iBAAiB;IAuDzB,OAAO,CAAC,yBAAyB;IA6C3B,oBAAoB,CAAC,IAAI,EAAE;QAC/B,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAC3B,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB;;;;;;IA0BK,aAAa;;;;;;IAkBb,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAC5C,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CA4CH"}