devmind 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.
- package/LICENSE +191 -0
- package/README.md +148 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.js +232 -0
- package/dist/cli.js.map +1 -0
- package/dist/codebase/generators/architecture.d.ts +4 -0
- package/dist/codebase/generators/architecture.js +33 -0
- package/dist/codebase/generators/architecture.js.map +1 -0
- package/dist/codebase/generators/modules.d.ts +9 -0
- package/dist/codebase/generators/modules.js +46 -0
- package/dist/codebase/generators/modules.js.map +1 -0
- package/dist/codebase/generators/overview.d.ts +5 -0
- package/dist/codebase/generators/overview.js +34 -0
- package/dist/codebase/generators/overview.js.map +1 -0
- package/dist/codebase/generators/skeleton.d.ts +8 -0
- package/dist/codebase/generators/skeleton.js +57 -0
- package/dist/codebase/generators/skeleton.js.map +1 -0
- package/dist/codebase/index.d.ts +24 -0
- package/dist/codebase/index.js +50 -0
- package/dist/codebase/index.js.map +1 -0
- package/dist/codebase/parsers/typescript.d.ts +14 -0
- package/dist/codebase/parsers/typescript.js +145 -0
- package/dist/codebase/parsers/typescript.js.map +1 -0
- package/dist/codebase/scanners/filesystem.d.ts +17 -0
- package/dist/codebase/scanners/filesystem.js +152 -0
- package/dist/codebase/scanners/filesystem.js.map +1 -0
- package/dist/codebase/utils/hashing.d.ts +15 -0
- package/dist/codebase/utils/hashing.js +50 -0
- package/dist/codebase/utils/hashing.js.map +1 -0
- package/dist/codebase/utils/stats.d.ts +12 -0
- package/dist/codebase/utils/stats.js +55 -0
- package/dist/codebase/utils/stats.js.map +1 -0
- package/dist/codebase/utils/tree.d.ts +10 -0
- package/dist/codebase/utils/tree.js +22 -0
- package/dist/codebase/utils/tree.js.map +1 -0
- package/dist/commands/analyze.d.ts +6 -0
- package/dist/commands/analyze.js +97 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/context.d.ts +4 -0
- package/dist/commands/context.js +54 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/core/config.d.ts +20 -0
- package/dist/core/config.js +40 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/errors.d.ts +18 -0
- package/dist/core/errors.js +53 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/fileio.d.ts +10 -0
- package/dist/core/fileio.js +57 -0
- package/dist/core/fileio.js.map +1 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +15 -0
- package/dist/core/logger.js +40 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/types.d.ts +106 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/database/cli.d.ts +7 -0
- package/dist/database/cli.js +132 -0
- package/dist/database/cli.js.map +1 -0
- package/dist/database/commands/checkpoint.d.ts +13 -0
- package/dist/database/commands/checkpoint.js +136 -0
- package/dist/database/commands/checkpoint.js.map +1 -0
- package/dist/database/commands/generate.d.ts +21 -0
- package/dist/database/commands/generate.js +269 -0
- package/dist/database/commands/generate.js.map +1 -0
- package/dist/database/commands/handoff.d.ts +15 -0
- package/dist/database/commands/handoff.js +332 -0
- package/dist/database/commands/handoff.js.map +1 -0
- package/dist/database/commands/history.d.ts +13 -0
- package/dist/database/commands/history.js +148 -0
- package/dist/database/commands/history.js.map +1 -0
- package/dist/database/commands/init.d.ts +10 -0
- package/dist/database/commands/init.js +28 -0
- package/dist/database/commands/init.js.map +1 -0
- package/dist/database/commands/learn.d.ts +12 -0
- package/dist/database/commands/learn.js +93 -0
- package/dist/database/commands/learn.js.map +1 -0
- package/dist/database/commands/memory.d.ts +90 -0
- package/dist/database/commands/memory.js +353 -0
- package/dist/database/commands/memory.js.map +1 -0
- package/dist/database/commands/show.d.ts +9 -0
- package/dist/database/commands/show.js +136 -0
- package/dist/database/commands/show.js.map +1 -0
- package/dist/database/commands/validate.d.ts +9 -0
- package/dist/database/commands/validate.js +200 -0
- package/dist/database/commands/validate.js.map +1 -0
- package/dist/database/commands/watch.d.ts +9 -0
- package/dist/database/commands/watch.js +77 -0
- package/dist/database/commands/watch.js.map +1 -0
- package/dist/database/extractors/drizzle.d.ts +62 -0
- package/dist/database/extractors/drizzle.js +251 -0
- package/dist/database/extractors/drizzle.js.map +1 -0
- package/dist/database/extractors/firebase.d.ts +39 -0
- package/dist/database/extractors/firebase.js +192 -0
- package/dist/database/extractors/firebase.js.map +1 -0
- package/dist/database/extractors/index.d.ts +69 -0
- package/dist/database/extractors/index.js +345 -0
- package/dist/database/extractors/index.js.map +1 -0
- package/dist/database/extractors/mongodb.d.ts +44 -0
- package/dist/database/extractors/mongodb.js +198 -0
- package/dist/database/extractors/mongodb.js.map +1 -0
- package/dist/database/extractors/mysql.d.ts +61 -0
- package/dist/database/extractors/mysql.js +173 -0
- package/dist/database/extractors/mysql.js.map +1 -0
- package/dist/database/extractors/postgres.d.ts +47 -0
- package/dist/database/extractors/postgres.js +141 -0
- package/dist/database/extractors/postgres.js.map +1 -0
- package/dist/database/extractors/prisma.d.ts +71 -0
- package/dist/database/extractors/prisma.js +270 -0
- package/dist/database/extractors/prisma.js.map +1 -0
- package/dist/database/extractors/sqlite.d.ts +50 -0
- package/dist/database/extractors/sqlite.js +148 -0
- package/dist/database/extractors/sqlite.js.map +1 -0
- package/dist/database/generators/learning-generator.d.ts +48 -0
- package/dist/database/generators/learning-generator.js +221 -0
- package/dist/database/generators/learning-generator.js.map +1 -0
- package/dist/database/generators/templates.d.ts +103 -0
- package/dist/database/generators/templates.js +1557 -0
- package/dist/database/generators/templates.js.map +1 -0
- package/dist/database/index.d.ts +15 -0
- package/dist/database/index.js +16 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/utils/json-output.d.ts +26 -0
- package/dist/database/utils/json-output.js +37 -0
- package/dist/database/utils/json-output.js.map +1 -0
- package/dist/generators/unified.d.ts +1 -0
- package/dist/generators/unified.js +173 -0
- package/dist/generators/unified.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/config-detector.d.ts +1 -0
- package/dist/utils/config-detector.js +40 -0
- package/dist/utils/config-detector.js.map +1 -0
- package/dist/utils/config-loader.d.ts +16 -0
- package/dist/utils/config-loader.js +20 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Infrastructure
|
|
3
|
+
* Creates and manages AI memory layer
|
|
4
|
+
*/
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import { ensureDir, writeFileSafe, readFileSafe } from '../../core/index.js';
|
|
7
|
+
import * as fs from 'fs/promises';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
export class MemoryInfrastructure {
|
|
10
|
+
/**
|
|
11
|
+
* Create memory directory structure
|
|
12
|
+
*/
|
|
13
|
+
async createMemoryStructure(outputDir) {
|
|
14
|
+
const dirs = [
|
|
15
|
+
path.join(outputDir, 'memory', 'checkpoints'),
|
|
16
|
+
path.join(outputDir, 'memory', 'learnings'),
|
|
17
|
+
path.join(outputDir, 'decisions'),
|
|
18
|
+
path.join(outputDir, 'context'),
|
|
19
|
+
path.join(outputDir, 'state'),
|
|
20
|
+
];
|
|
21
|
+
for (const dir of dirs) {
|
|
22
|
+
await ensureDir(dir);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Initialize memory files
|
|
27
|
+
*/
|
|
28
|
+
async initializeMemoryFiles(outputDir, schema) {
|
|
29
|
+
// Initialize LEARN.md
|
|
30
|
+
const learningsPath = path.join(outputDir, 'memory', 'LEARN.md');
|
|
31
|
+
const learningsContent = this.createInitialLearnings(schema);
|
|
32
|
+
await writeFileSafe(learningsPath, learningsContent);
|
|
33
|
+
// Initialize session-history.md
|
|
34
|
+
const historyPath = path.join(outputDir, 'memory', 'session-history.md');
|
|
35
|
+
const historyContent = this.createInitialHistory();
|
|
36
|
+
await writeFileSafe(historyPath, historyContent);
|
|
37
|
+
// Initialize schema-evolution.md
|
|
38
|
+
const evolutionPath = path.join(outputDir, 'memory', 'schema-evolution.md');
|
|
39
|
+
const evolutionContent = this.createSchemaEvolution(schema);
|
|
40
|
+
await writeFileSafe(evolutionPath, evolutionContent);
|
|
41
|
+
// Initialize codebase-evolution.md
|
|
42
|
+
const codebaseEvolutionPath = path.join(outputDir, 'memory', 'codebase-evolution.md');
|
|
43
|
+
// Initial hash/stats are unknown at pure DB init time, using placeholders
|
|
44
|
+
const codebaseEvolutionContent = this.createCodebaseEvolution('pending', { files: 0, loc: 0 });
|
|
45
|
+
await writeFileSafe(codebaseEvolutionPath, codebaseEvolutionContent);
|
|
46
|
+
// Create initial SESSION_CONTEXT.json
|
|
47
|
+
const contextPath = path.join(outputDir, 'context', 'SESSION_CONTEXT.json');
|
|
48
|
+
const sessionContext = this.createSessionContext(schema);
|
|
49
|
+
await writeFileSafe(contextPath, JSON.stringify(sessionContext, null, 2));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Copy template files to output directory
|
|
53
|
+
*/
|
|
54
|
+
async copyTemplateFiles(templatesDir, outputDir) {
|
|
55
|
+
const templateFiles = [
|
|
56
|
+
'edge-cases.md',
|
|
57
|
+
'state/CURRENT_STATE.md',
|
|
58
|
+
'memory/checkpoint-patterns.md',
|
|
59
|
+
];
|
|
60
|
+
const commandDir = path.dirname(fileURLToPath(import.meta.url));
|
|
61
|
+
const candidateDirs = [
|
|
62
|
+
templatesDir,
|
|
63
|
+
path.resolve(commandDir, '..', 'templates'),
|
|
64
|
+
path.resolve(commandDir, '..', '..', 'database', 'templates'),
|
|
65
|
+
];
|
|
66
|
+
const fallbacks = this.getTemplateFallbacks();
|
|
67
|
+
for (const file of templateFiles) {
|
|
68
|
+
const destPath = path.join(outputDir, file);
|
|
69
|
+
let copied = false;
|
|
70
|
+
for (const baseDir of candidateDirs) {
|
|
71
|
+
try {
|
|
72
|
+
const srcPath = path.join(baseDir, file);
|
|
73
|
+
const content = await readFileSafe(srcPath);
|
|
74
|
+
await ensureDir(path.dirname(destPath));
|
|
75
|
+
await writeFileSafe(destPath, content);
|
|
76
|
+
copied = true;
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Try next candidate path
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (!copied && fallbacks[file]) {
|
|
84
|
+
await ensureDir(path.dirname(destPath));
|
|
85
|
+
await writeFileSafe(destPath, fallbacks[file]);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
getTemplateFallbacks() {
|
|
90
|
+
return {
|
|
91
|
+
'edge-cases.md': `# Edge Cases
|
|
92
|
+
|
|
93
|
+
This file captures known project edge cases and mitigations.
|
|
94
|
+
|
|
95
|
+
## Add Cases
|
|
96
|
+
|
|
97
|
+
- Scenario:
|
|
98
|
+
- Impact:
|
|
99
|
+
- Mitigation:
|
|
100
|
+
`,
|
|
101
|
+
'state/CURRENT_STATE.md': `# Current State
|
|
102
|
+
|
|
103
|
+
Generated by DevMind.
|
|
104
|
+
|
|
105
|
+
- Status: initializing
|
|
106
|
+
- Last Updated: ${new Date().toISOString()}
|
|
107
|
+
- Next Step: run \`devmind generate\` or \`devmind scan\`
|
|
108
|
+
`,
|
|
109
|
+
'memory/checkpoint-patterns.md': `# Checkpoint Patterns
|
|
110
|
+
|
|
111
|
+
Use checkpoints to preserve progress across sessions.
|
|
112
|
+
|
|
113
|
+
## Recommended
|
|
114
|
+
|
|
115
|
+
- Save a checkpoint before large refactors.
|
|
116
|
+
- Include a short message describing intent.
|
|
117
|
+
`,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Create initial learnings file
|
|
122
|
+
*/
|
|
123
|
+
createInitialLearnings(schema) {
|
|
124
|
+
return `# Project Learnings
|
|
125
|
+
|
|
126
|
+
> Auto-generated on ${new Date().toISOString()}
|
|
127
|
+
|
|
128
|
+
This file accumulates technical learnings, architectural decisions, and discovered patterns.
|
|
129
|
+
|
|
130
|
+
## Initial Schema Analysis
|
|
131
|
+
|
|
132
|
+
- **Tables:** ${schema.tables.length}
|
|
133
|
+
- **Database Type:** ${schema.databaseType}
|
|
134
|
+
- **Schema Name:** ${schema.schemaName || 'N/A'}
|
|
135
|
+
|
|
136
|
+
## Codebase Knowledge
|
|
137
|
+
|
|
138
|
+
- **Architecture:** (Pending analysis)
|
|
139
|
+
- **Patterns:** (Pending analysis)
|
|
140
|
+
|
|
141
|
+
## Patterns
|
|
142
|
+
|
|
143
|
+
See \`BUSINESS_LOGIC.md\` for detected patterns.
|
|
144
|
+
|
|
145
|
+
## Sessions
|
|
146
|
+
|
|
147
|
+
### Session 1 - ${new Date().toISOString().split('T')[0]}
|
|
148
|
+
- Initial schema generation
|
|
149
|
+
- Detected business patterns
|
|
150
|
+
- Created memory infrastructure
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
*Add new learnings below. Each session should append discoveries, edge cases, and best practices.*
|
|
155
|
+
`;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Create initial session history
|
|
159
|
+
*/
|
|
160
|
+
createInitialHistory() {
|
|
161
|
+
return `# Session History
|
|
162
|
+
|
|
163
|
+
> Recent database context sessions
|
|
164
|
+
|
|
165
|
+
## ${new Date().toISOString().split('T')[0]} - Initial Generation
|
|
166
|
+
|
|
167
|
+
**Status:** Completed
|
|
168
|
+
**Agent:** devmind-db v1.0.3
|
|
169
|
+
|
|
170
|
+
**Actions:**
|
|
171
|
+
- Generated schema context
|
|
172
|
+
- Created memory infrastructure
|
|
173
|
+
- Detected business patterns
|
|
174
|
+
|
|
175
|
+
**Discoveries:**
|
|
176
|
+
- Schema structure analyzed
|
|
177
|
+
- Memory layer initialized
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
*New sessions will be appended below*
|
|
182
|
+
`;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Create schema evolution tracking
|
|
186
|
+
*/
|
|
187
|
+
createSchemaEvolution(schema) {
|
|
188
|
+
const schemaHash = this.calculateSchemaHash(schema);
|
|
189
|
+
return `# Schema Evolution
|
|
190
|
+
|
|
191
|
+
> Track schema changes over time
|
|
192
|
+
|
|
193
|
+
## ${new Date().toISOString().split('T')[0]} - Baseline
|
|
194
|
+
|
|
195
|
+
**Schema Hash:** \`${schemaHash}\`
|
|
196
|
+
**Tables:** ${schema.tables.length}
|
|
197
|
+
**Database:** ${schema.databaseType}
|
|
198
|
+
|
|
199
|
+
### Tables Created
|
|
200
|
+
${schema.tables.map((t) => `- ${t.name} (${t.columns.length} columns)`).join('\n')}
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
*Schema changes will be tracked below*
|
|
205
|
+
`;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Create codebase evolution tracking
|
|
209
|
+
*/
|
|
210
|
+
createCodebaseEvolution(hash, stats) {
|
|
211
|
+
return `# Codebase Evolution
|
|
212
|
+
|
|
213
|
+
> Track codebase structure changes over time
|
|
214
|
+
|
|
215
|
+
## ${new Date().toISOString().split('T')[0]} - Baseline
|
|
216
|
+
|
|
217
|
+
**Codebase Hash:** \`${hash}\`
|
|
218
|
+
**Files:** ${stats?.files || 0}
|
|
219
|
+
**LOC:** ${stats?.loc || 0}
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
*Codebase changes will be tracked below*
|
|
224
|
+
`;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Create initial session context
|
|
228
|
+
*/
|
|
229
|
+
createSessionContext(schema) {
|
|
230
|
+
return {
|
|
231
|
+
sessionId: `session-${Date.now()}`,
|
|
232
|
+
timestamp: new Date().toISOString(),
|
|
233
|
+
schemaHash: this.calculateSchemaHash(schema),
|
|
234
|
+
schemaVersion: '1.0.0',
|
|
235
|
+
recentChanges: [],
|
|
236
|
+
pendingQueries: [],
|
|
237
|
+
discoveries: [
|
|
238
|
+
`Schema initialized with ${schema.tables.length} tables`,
|
|
239
|
+
'Memory infrastructure created',
|
|
240
|
+
'Business patterns detected',
|
|
241
|
+
],
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Calculate schema hash for drift detection
|
|
246
|
+
*/
|
|
247
|
+
calculateSchemaHash(schema) {
|
|
248
|
+
const payload = schema.tables
|
|
249
|
+
.map((t) => `${t.name}:${t.columns.map((c) => `${c.name}:${c.type}`).join(',')}`)
|
|
250
|
+
.join('|');
|
|
251
|
+
// Simple hash (replace with crypto.createHash in production)
|
|
252
|
+
let hash = 0;
|
|
253
|
+
for (let i = 0; i < payload.length; i++) {
|
|
254
|
+
const char = payload.charCodeAt(i);
|
|
255
|
+
hash = (hash << 5) - hash + char;
|
|
256
|
+
hash = hash & hash; // Convert to 32bit integer
|
|
257
|
+
}
|
|
258
|
+
return Math.abs(hash).toString(16);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Save checkpoint
|
|
262
|
+
*/
|
|
263
|
+
async saveCheckpoint(outputDir, context, message) {
|
|
264
|
+
const filename = `checkpoint-${Date.now()}.json`;
|
|
265
|
+
const filepath = path.join(outputDir, 'memory', 'checkpoints', filename);
|
|
266
|
+
const checkpoint = {
|
|
267
|
+
...context,
|
|
268
|
+
message,
|
|
269
|
+
savedAt: new Date().toISOString(),
|
|
270
|
+
};
|
|
271
|
+
await writeFileSafe(filepath, JSON.stringify(checkpoint, null, 2));
|
|
272
|
+
return filepath;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Restore latest checkpoint
|
|
276
|
+
*/
|
|
277
|
+
async restoreLatestCheckpoint(outputDir) {
|
|
278
|
+
const checkpointsDir = path.join(outputDir, 'memory', 'checkpoints');
|
|
279
|
+
try {
|
|
280
|
+
const files = await fs.readdir(checkpointsDir);
|
|
281
|
+
const checkpointFiles = files
|
|
282
|
+
.filter((f) => f.startsWith('checkpoint-') && f.endsWith('.json'))
|
|
283
|
+
.sort();
|
|
284
|
+
if (checkpointFiles.length === 0) {
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
const latest = checkpointFiles[checkpointFiles.length - 1];
|
|
288
|
+
const filepath = path.join(checkpointsDir, latest);
|
|
289
|
+
const content = await readFileSafe(filepath);
|
|
290
|
+
return JSON.parse(content);
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Update session context
|
|
298
|
+
*/
|
|
299
|
+
async updateSessionContext(outputDir, updates) {
|
|
300
|
+
const contextPath = path.join(outputDir, 'context', 'SESSION_CONTEXT.json');
|
|
301
|
+
try {
|
|
302
|
+
const content = await readFileSafe(contextPath);
|
|
303
|
+
const context = JSON.parse(content);
|
|
304
|
+
const updatedContext = { ...context, ...updates, timestamp: new Date().toISOString() };
|
|
305
|
+
await writeFileSafe(contextPath, JSON.stringify(updatedContext, null, 2));
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
// Context doesn't exist, create minimal one
|
|
309
|
+
const minimalContext = {
|
|
310
|
+
sessionId: `session-${Date.now()}`,
|
|
311
|
+
timestamp: new Date().toISOString(),
|
|
312
|
+
schemaHash: 'pending', // Placeholder until DB scan
|
|
313
|
+
recentChanges: [],
|
|
314
|
+
pendingQueries: [],
|
|
315
|
+
discoveries: ['Session initialized from codebase scan'],
|
|
316
|
+
...updates,
|
|
317
|
+
};
|
|
318
|
+
await ensureDir(path.dirname(contextPath));
|
|
319
|
+
await writeFileSafe(contextPath, JSON.stringify(minimalContext, null, 2));
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Update codebase evolution
|
|
324
|
+
*/
|
|
325
|
+
async updateCodebaseEvolution(outputDir, hash, stats) {
|
|
326
|
+
const evolutionPath = path.join(outputDir, 'memory', 'codebase-evolution.md');
|
|
327
|
+
let content = '';
|
|
328
|
+
try {
|
|
329
|
+
content = await readFileSafe(evolutionPath);
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
content = this.createCodebaseEvolution(hash, stats);
|
|
333
|
+
await ensureDir(path.dirname(evolutionPath));
|
|
334
|
+
await writeFileSafe(evolutionPath, content);
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
// Check if hash changed
|
|
338
|
+
if (!content.includes(`\`${hash}\``)) {
|
|
339
|
+
const timestamp = new Date().toISOString().split('T')[0];
|
|
340
|
+
const entry = `
|
|
341
|
+
## ${timestamp} - Scan
|
|
342
|
+
|
|
343
|
+
**Codebase Hash:** \`${hash}\`
|
|
344
|
+
**Files:** ${stats.files}
|
|
345
|
+
**LOC:** ${stats.loc}
|
|
346
|
+
|
|
347
|
+
---
|
|
348
|
+
`;
|
|
349
|
+
await writeFileSafe(evolutionPath, content + entry);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/database/commands/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Show Command
|
|
3
|
+
* Show current database schema in a readable format
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import { createExtractor, UnifiedSchemaConverter } from '../extractors/index.js';
|
|
8
|
+
import { logger, readFileSafe, fileExists } from '../../core/index.js';
|
|
9
|
+
export async function show(options) {
|
|
10
|
+
const format = options.format || 'markdown';
|
|
11
|
+
logger.info('Loading database schema...');
|
|
12
|
+
// Try to load from existing .devmind directory first
|
|
13
|
+
let outputDir = '.devmind';
|
|
14
|
+
if (!(await fileExists(path.join(outputDir, 'CLAUDE.md'))) &&
|
|
15
|
+
(await fileExists('.ai/CLAUDE.md'))) {
|
|
16
|
+
outputDir = '.ai';
|
|
17
|
+
}
|
|
18
|
+
const claudeFile = path.join(outputDir, 'CLAUDE.md');
|
|
19
|
+
if (await fileExists(claudeFile)) {
|
|
20
|
+
logger.info(`Found existing context in ${outputDir} directory`);
|
|
21
|
+
const content = await readFileSafe(claudeFile);
|
|
22
|
+
// Extract and display just the schema section
|
|
23
|
+
const schemaMatch = content.match(/## Database Schema([\s\S]*?)(?=\n##|$)/);
|
|
24
|
+
if (schemaMatch) {
|
|
25
|
+
logger.info('## Database Schema');
|
|
26
|
+
console.log(schemaMatch[1].trim());
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
console.log(content);
|
|
30
|
+
}
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// If no existing context, try to generate from config
|
|
34
|
+
const configPath = path.join(outputDir, 'devmind.config.json');
|
|
35
|
+
const legacyConfigPath = path.join(outputDir, 'cohere-config.json');
|
|
36
|
+
const legacyRootConfigPath = 'cohere-config.json';
|
|
37
|
+
let activeConfigPath = configPath;
|
|
38
|
+
if (await fileExists(legacyConfigPath))
|
|
39
|
+
activeConfigPath = legacyConfigPath;
|
|
40
|
+
else if (await fileExists(legacyRootConfigPath))
|
|
41
|
+
activeConfigPath = legacyRootConfigPath;
|
|
42
|
+
if (!(await fileExists(activeConfigPath))) {
|
|
43
|
+
logger.warn('No schema found.');
|
|
44
|
+
logger.info('Run one of the following:');
|
|
45
|
+
logger.info(' 1. devmind init --url "your-database-url"');
|
|
46
|
+
logger.info(' 2. devmind generate');
|
|
47
|
+
logger.info(' 3. devmind generate --prisma');
|
|
48
|
+
logger.info(' 4. devmind generate --drizzle');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Load config and extract schema
|
|
52
|
+
try {
|
|
53
|
+
const config = JSON.parse(await readFileSafe(activeConfigPath));
|
|
54
|
+
let extractorType = 'postgresql';
|
|
55
|
+
let connectionString = config.databaseUrl || process.env.DATABASE_URL;
|
|
56
|
+
let schemaPath;
|
|
57
|
+
// Auto-detect extractor type
|
|
58
|
+
if (fs.existsSync('prisma/schema.prisma')) {
|
|
59
|
+
extractorType = 'prisma';
|
|
60
|
+
schemaPath = 'prisma/schema.prisma';
|
|
61
|
+
}
|
|
62
|
+
else if (fs.existsSync('src/db/schema.ts')) {
|
|
63
|
+
extractorType = 'drizzle';
|
|
64
|
+
schemaPath = 'src/db/schema.ts';
|
|
65
|
+
}
|
|
66
|
+
else if (connectionString &&
|
|
67
|
+
(connectionString.startsWith('mongodb://') || connectionString.startsWith('mongodb+srv://'))) {
|
|
68
|
+
extractorType = 'mongodb';
|
|
69
|
+
}
|
|
70
|
+
else if (process.env.GOOGLE_APPLICATION_CREDENTIALS) {
|
|
71
|
+
extractorType = 'firebase';
|
|
72
|
+
}
|
|
73
|
+
else if (connectionString) {
|
|
74
|
+
if (connectionString.startsWith('mysql')) {
|
|
75
|
+
extractorType = 'mysql';
|
|
76
|
+
}
|
|
77
|
+
else if (connectionString.includes('.db') || connectionString.includes('.sqlite')) {
|
|
78
|
+
extractorType = 'sqlite';
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (!connectionString && !schemaPath) {
|
|
82
|
+
logger.warn('No database connection or schema file found.');
|
|
83
|
+
logger.info('Run: devmind generate');
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const extractor = await createExtractor(extractorType, connectionString || 'dummy', {
|
|
87
|
+
schemaPath,
|
|
88
|
+
});
|
|
89
|
+
try {
|
|
90
|
+
const rawSchema = await extractor.extract();
|
|
91
|
+
const unifiedSchema = UnifiedSchemaConverter.convert(rawSchema);
|
|
92
|
+
logger.info(`Database: ${unifiedSchema.databaseType || 'Unknown'}`);
|
|
93
|
+
logger.info(`Tables: ${unifiedSchema.tables.length}`);
|
|
94
|
+
logger.info('## Tables');
|
|
95
|
+
for (const table of unifiedSchema.tables) {
|
|
96
|
+
logger.info(`### ${table.name}`);
|
|
97
|
+
if (table.description) {
|
|
98
|
+
logger.info(` ${table.description}`);
|
|
99
|
+
}
|
|
100
|
+
logger.info(` Columns: ${table.columns.length}`);
|
|
101
|
+
// Show primary keys
|
|
102
|
+
const pkColumns = table.columns.filter((c) => c.isPrimaryKey);
|
|
103
|
+
if (pkColumns.length > 0) {
|
|
104
|
+
logger.info(` Primary Key: ${pkColumns.map((c) => c.name).join(', ')}`);
|
|
105
|
+
}
|
|
106
|
+
// Show relations
|
|
107
|
+
if (table.relations && table.relations.length > 0) {
|
|
108
|
+
logger.info(` Relations: ${table.relations.length}`);
|
|
109
|
+
}
|
|
110
|
+
logger.info('');
|
|
111
|
+
}
|
|
112
|
+
// Show relationships
|
|
113
|
+
const relationships = unifiedSchema.tables.flatMap((t) => (t.relations || []).map((rel) => ({
|
|
114
|
+
from: rel.fromTable,
|
|
115
|
+
to: rel.toTable,
|
|
116
|
+
cardinality: rel.cardinality,
|
|
117
|
+
})));
|
|
118
|
+
if (relationships.length > 0) {
|
|
119
|
+
logger.info('## Relationships');
|
|
120
|
+
for (const rel of relationships) {
|
|
121
|
+
logger.info(` ${rel.from} [${rel.cardinality}] ${rel.to}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
if (extractor.close) {
|
|
127
|
+
await extractor.close();
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
logger.error('Failed to load schema:', error);
|
|
133
|
+
logger.info('Try running: devmind generate');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=show.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show.js","sourceRoot":"","sources":["../../../src/database/commands/show.ts"],"names":[],"mappings":"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"}
|