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,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate Command
|
|
3
|
+
* Generates CLAUDE.md and AGENTS.md from database schema
|
|
4
|
+
*/
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import { logger, writeFileSafe, readFileSafe, handleError } from '../../core/index.js';
|
|
7
|
+
import { createExtractor, UnifiedSchemaConverter, } from '../extractors/index.js';
|
|
8
|
+
import { TemplateGenerator } from '../generators/templates.js';
|
|
9
|
+
import { LearningGenerator } from '../generators/learning-generator.js';
|
|
10
|
+
import { MemoryInfrastructure } from './memory.js';
|
|
11
|
+
import { jsonSuccess, jsonError, outputJson, isJsonMode } from '../utils/json-output.js';
|
|
12
|
+
import * as fs from 'fs'; // Keep fs for existsSync checks
|
|
13
|
+
import { fileURLToPath } from 'url';
|
|
14
|
+
function resolveTemplatesDir() {
|
|
15
|
+
const commandDir = path.dirname(fileURLToPath(import.meta.url));
|
|
16
|
+
const packagedPath = path.resolve(commandDir, '..', 'templates');
|
|
17
|
+
const sourcePath = path.resolve(commandDir, '..', '..', 'database', 'templates');
|
|
18
|
+
if (fs.existsSync(packagedPath)) {
|
|
19
|
+
return packagedPath;
|
|
20
|
+
}
|
|
21
|
+
return sourcePath;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get previous schema hash from evolution file
|
|
25
|
+
*/
|
|
26
|
+
async function getPreviousSchemaHash(outputDir) {
|
|
27
|
+
try {
|
|
28
|
+
const evolutionPath = path.join(outputDir, 'memory', 'schema-evolution.md');
|
|
29
|
+
const content = await readFileSafe(evolutionPath);
|
|
30
|
+
const match = content.match(/Schema Hash:\*\* `([a-f0-9]+)`/);
|
|
31
|
+
return match ? match[1] : null;
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Log schema drift to evolution file
|
|
39
|
+
*/
|
|
40
|
+
async function logSchemaDrift(outputDir, schema, previousHash, currentHash) {
|
|
41
|
+
const evolutionPath = path.join(outputDir, 'memory', 'schema-evolution.md');
|
|
42
|
+
const timestamp = new Date().toISOString().split('T')[0];
|
|
43
|
+
const driftEntry = `\n## ${timestamp} - Schema Change\n\n**Previous Hash:** \`${previousHash}\` \n**New Hash:** \`${currentHash}\` \n**Tables:** ${schema.tables.length}\n\n### Changes Detected\n- Schema hash changed\n- Review table changes manually\n\n---\n`;
|
|
44
|
+
try {
|
|
45
|
+
const existing = await readFileSafe(evolutionPath);
|
|
46
|
+
await writeFileSafe(evolutionPath, existing + driftEntry);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
// File might not exist yet
|
|
50
|
+
await writeFileSafe(evolutionPath, driftEntry);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export async function generate(options) {
|
|
54
|
+
try {
|
|
55
|
+
const isJson = isJsonMode(options);
|
|
56
|
+
const outputDir = options.output || '.devmind';
|
|
57
|
+
const schemaName = options.schema || 'public';
|
|
58
|
+
if (!isJson) {
|
|
59
|
+
logger.info(`Generating database context...`);
|
|
60
|
+
logger.info(` Output directory: ${outputDir}`);
|
|
61
|
+
}
|
|
62
|
+
let extractorType = 'postgresql';
|
|
63
|
+
let connectionString = options.url || process.env.DATABASE_URL || '';
|
|
64
|
+
let schemaPath;
|
|
65
|
+
// Determine extractor type
|
|
66
|
+
if (options.mysql) {
|
|
67
|
+
extractorType = 'mysql';
|
|
68
|
+
if (!connectionString) {
|
|
69
|
+
throw new Error('MySQL connection URL required. Use --url or DATABASE_URL env var.');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else if (options.sqlite) {
|
|
73
|
+
extractorType = 'sqlite';
|
|
74
|
+
connectionString = options.sqlite || '';
|
|
75
|
+
}
|
|
76
|
+
else if (options.prisma) {
|
|
77
|
+
extractorType = 'prisma';
|
|
78
|
+
schemaPath = typeof options.prisma === 'string' ? options.prisma : 'prisma/schema.prisma';
|
|
79
|
+
connectionString = 'dummy'; // Not used for Prisma
|
|
80
|
+
}
|
|
81
|
+
else if (options.drizzle) {
|
|
82
|
+
extractorType = 'drizzle';
|
|
83
|
+
schemaPath = typeof options.drizzle === 'string' ? options.drizzle : 'src/db/schema.ts';
|
|
84
|
+
connectionString = 'dummy'; // Not used for Drizzle
|
|
85
|
+
}
|
|
86
|
+
else if (options.orm === 'prisma') {
|
|
87
|
+
extractorType = 'prisma';
|
|
88
|
+
schemaPath = 'prisma/schema.prisma';
|
|
89
|
+
connectionString = 'dummy';
|
|
90
|
+
}
|
|
91
|
+
else if (options.orm === 'drizzle') {
|
|
92
|
+
extractorType = 'drizzle';
|
|
93
|
+
schemaPath = 'src/db/schema.ts';
|
|
94
|
+
connectionString = 'dummy';
|
|
95
|
+
}
|
|
96
|
+
else if (connectionString) {
|
|
97
|
+
if (connectionString.startsWith('mysql')) {
|
|
98
|
+
extractorType = 'mysql';
|
|
99
|
+
}
|
|
100
|
+
else if (connectionString.startsWith('file:') ||
|
|
101
|
+
connectionString.endsWith('.db') ||
|
|
102
|
+
connectionString.endsWith('.sqlite')) {
|
|
103
|
+
extractorType = 'sqlite';
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
extractorType = 'postgresql';
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// Try to auto-detect
|
|
111
|
+
if (fs.existsSync('prisma/schema.prisma')) {
|
|
112
|
+
if (!isJson)
|
|
113
|
+
logger.info('Detected Prisma schema, using Prisma extractor...');
|
|
114
|
+
extractorType = 'prisma';
|
|
115
|
+
schemaPath = 'prisma/schema.prisma';
|
|
116
|
+
connectionString = 'dummy';
|
|
117
|
+
}
|
|
118
|
+
else if (fs.existsSync('drizzle.config.ts') || fs.existsSync('src/db/schema.ts')) {
|
|
119
|
+
if (!isJson)
|
|
120
|
+
logger.info('Detected Drizzle project, using Drizzle extractor...');
|
|
121
|
+
extractorType = 'drizzle';
|
|
122
|
+
schemaPath = 'src/db/schema.ts';
|
|
123
|
+
connectionString = 'dummy';
|
|
124
|
+
}
|
|
125
|
+
else if (options.mongodb ||
|
|
126
|
+
(connectionString &&
|
|
127
|
+
(connectionString.startsWith('mongodb://') ||
|
|
128
|
+
connectionString.startsWith('mongodb+srv://')))) {
|
|
129
|
+
if (!isJson)
|
|
130
|
+
logger.info('Detected MongoDB connection...');
|
|
131
|
+
extractorType = 'mongodb';
|
|
132
|
+
connectionString = options.mongodb || connectionString;
|
|
133
|
+
if (!connectionString) {
|
|
134
|
+
throw new Error('MongoDB connection URL required. Use --url or DATABASE_URL env var.');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else if (options.firebaseProject || process.env.GOOGLE_APPLICATION_CREDENTIALS) {
|
|
138
|
+
if (!isJson)
|
|
139
|
+
logger.info('Detected Firebase project...');
|
|
140
|
+
extractorType = 'firebase';
|
|
141
|
+
connectionString = 'dummy'; // Not used for Firebase
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
throw new Error('Database connection not found. Use --url, --sqlite, --prisma, --drizzle, or --mongodb.');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (!isJson) {
|
|
148
|
+
logger.info(`Using extractor: ${extractorType}`);
|
|
149
|
+
if (schemaPath)
|
|
150
|
+
logger.info(` Schema path: ${schemaPath}`);
|
|
151
|
+
}
|
|
152
|
+
const extractor = await createExtractor(extractorType, connectionString, {
|
|
153
|
+
schemaPath,
|
|
154
|
+
projectId: options.firebaseProject,
|
|
155
|
+
serviceAccountPath: options.firebaseKey,
|
|
156
|
+
});
|
|
157
|
+
let unifiedSchema;
|
|
158
|
+
try {
|
|
159
|
+
const rawSchema = await extractor.extract();
|
|
160
|
+
rawSchema.databaseType = extractorType;
|
|
161
|
+
rawSchema.schemaName = rawSchema.schemaName || schemaName;
|
|
162
|
+
rawSchema.source = rawSchema.source || schemaPath || connectionString;
|
|
163
|
+
// Convert to unified format using generic convert
|
|
164
|
+
unifiedSchema = UnifiedSchemaConverter.convert(rawSchema);
|
|
165
|
+
// Add source info
|
|
166
|
+
unifiedSchema.source = schemaPath || connectionString.replace(/:[^:]*@/, ':***@'); // Hide password
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
if (extractor.close) {
|
|
170
|
+
await extractor.close();
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Generate and save templates
|
|
174
|
+
if (!isJson)
|
|
175
|
+
logger.info('Generating context files...');
|
|
176
|
+
const templatesDir = resolveTemplatesDir();
|
|
177
|
+
const generator = new TemplateGenerator(templatesDir, outputDir);
|
|
178
|
+
await generator.save(outputDir, unifiedSchema);
|
|
179
|
+
// Save raw schema JSON for analysis
|
|
180
|
+
await writeFileSafe(path.join(outputDir, 'schema.json'), JSON.stringify(unifiedSchema, null, 2));
|
|
181
|
+
// Detect schema drift
|
|
182
|
+
const memory = new MemoryInfrastructure();
|
|
183
|
+
const currentHash = memory.calculateSchemaHash(unifiedSchema);
|
|
184
|
+
const previousHash = await getPreviousSchemaHash(outputDir);
|
|
185
|
+
if (previousHash && previousHash !== currentHash) {
|
|
186
|
+
if (!isJson) {
|
|
187
|
+
logger.warn('Schema drift detected!');
|
|
188
|
+
logger.warn(` Previous hash: ${previousHash}`);
|
|
189
|
+
logger.warn(` Current hash: ${currentHash}`);
|
|
190
|
+
}
|
|
191
|
+
await logSchemaDrift(outputDir, unifiedSchema, previousHash, currentHash);
|
|
192
|
+
}
|
|
193
|
+
// Create memory infrastructure
|
|
194
|
+
if (!isJson)
|
|
195
|
+
logger.info('Creating AI memory infrastructure...');
|
|
196
|
+
await memory.createMemoryStructure(outputDir);
|
|
197
|
+
await memory.initializeMemoryFiles(outputDir, unifiedSchema);
|
|
198
|
+
await memory.copyTemplateFiles(templatesDir, outputDir);
|
|
199
|
+
// Generate learnings from schema
|
|
200
|
+
if (!isJson)
|
|
201
|
+
logger.info('Analyzing schema patterns...');
|
|
202
|
+
const learningGen = new LearningGenerator();
|
|
203
|
+
const patterns = learningGen.generateLearnings(unifiedSchema);
|
|
204
|
+
const learningsMarkdown = learningGen.formatLearnings(patterns);
|
|
205
|
+
const businessLogicPath = path.join(outputDir, 'context', 'BUSINESS_LOGIC.md');
|
|
206
|
+
await writeFileSafe(businessLogicPath, learningsMarkdown);
|
|
207
|
+
if (!isJson)
|
|
208
|
+
logger.info(` Detected ${patterns.length} business patterns`);
|
|
209
|
+
// JSON output mode
|
|
210
|
+
if (isJsonMode(options)) {
|
|
211
|
+
outputJson(jsonSuccess({
|
|
212
|
+
schema: {
|
|
213
|
+
tables: unifiedSchema.tables.length,
|
|
214
|
+
databaseType: unifiedSchema.databaseType,
|
|
215
|
+
schemaName: unifiedSchema.schemaName,
|
|
216
|
+
},
|
|
217
|
+
patterns: patterns.map((p) => ({
|
|
218
|
+
type: p.type,
|
|
219
|
+
confidence: p.confidence,
|
|
220
|
+
tables: p.tables?.length || 0,
|
|
221
|
+
recommendation: p.recommendation,
|
|
222
|
+
})),
|
|
223
|
+
files: {
|
|
224
|
+
claude_md: `${outputDir}/CLAUDE.md`,
|
|
225
|
+
agents_md: `${outputDir}/AGENTS.md`,
|
|
226
|
+
business_logic: `${outputDir}/context/BUSINESS_LOGIC.md`,
|
|
227
|
+
session_context: `${outputDir}/context/SESSION_CONTEXT.json`,
|
|
228
|
+
memory_dir: `${outputDir}/memory/`,
|
|
229
|
+
},
|
|
230
|
+
memory: {
|
|
231
|
+
checkpoints_enabled: true,
|
|
232
|
+
learnings_enabled: true,
|
|
233
|
+
drift_detection: previousHash !== null,
|
|
234
|
+
},
|
|
235
|
+
}));
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
// Human-readable output
|
|
239
|
+
logger.success('Generation complete!');
|
|
240
|
+
logger.info(` Tables: ${unifiedSchema.tables.length}`);
|
|
241
|
+
logger.info(` Patterns: ${patterns.length}`);
|
|
242
|
+
logger.info(` Output: ${path.resolve(outputDir)}`);
|
|
243
|
+
logger.info('Generated files:');
|
|
244
|
+
logger.info(` - ${outputDir}/CLAUDE.md`);
|
|
245
|
+
logger.info(` - ${outputDir}/AGENTS.md`);
|
|
246
|
+
logger.info(` - ${outputDir}/queries/`);
|
|
247
|
+
logger.info(` - ${outputDir}/context/BUSINESS_LOGIC.md`);
|
|
248
|
+
logger.info(` - ${outputDir}/context/SESSION_CONTEXT.json`);
|
|
249
|
+
logger.info(` - ${outputDir}/memory/ (learnings, checkpoints, history)`);
|
|
250
|
+
logger.info('AI Memory Layer:');
|
|
251
|
+
logger.success(' ✓ Business patterns detected');
|
|
252
|
+
logger.success(' ✓ Session context initialized');
|
|
253
|
+
logger.success(' ✓ Checkpoint system ready');
|
|
254
|
+
logger.info('Next steps:');
|
|
255
|
+
logger.info(' 1. Review detected patterns in context/BUSINESS_LOGIC.md');
|
|
256
|
+
logger.info(' 2. Your AI now has persistent memory across sessions');
|
|
257
|
+
logger.info(' 3. Commit to version control');
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
if (isJsonMode(options)) {
|
|
261
|
+
outputJson(jsonError(error));
|
|
262
|
+
process.exit(1);
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
handleError(error);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/database/commands/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handoff Command
|
|
3
|
+
*
|
|
4
|
+
* Multi-agent handoff management for DevMind.
|
|
5
|
+
*/
|
|
6
|
+
interface HandoffOptions {
|
|
7
|
+
record?: boolean;
|
|
8
|
+
resume?: string;
|
|
9
|
+
list?: boolean;
|
|
10
|
+
output?: string;
|
|
11
|
+
status?: string;
|
|
12
|
+
agentId?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function handoff(options: HandoffOptions): Promise<void>;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handoff Command
|
|
3
|
+
*
|
|
4
|
+
* Multi-agent handoff management for DevMind.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'fs/promises';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
import { logger, ensureDir, writeFileSafe, readFileSafe } from '../../core/index.js';
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
const __dirname = path.dirname(__filename);
|
|
12
|
+
export async function handoff(options) {
|
|
13
|
+
const outputDir = options.output || '.devmind';
|
|
14
|
+
if (options.list) {
|
|
15
|
+
await listSessions(outputDir);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (options.resume) {
|
|
19
|
+
await resumeSession(outputDir, options.resume);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (options.record) {
|
|
23
|
+
await recordHandoff(outputDir, options);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
// Default: show help
|
|
27
|
+
logger.info('Handoff command - record session state for multi-agent handoff');
|
|
28
|
+
logger.info('');
|
|
29
|
+
logger.info('Usage:');
|
|
30
|
+
logger.info(' devmind handoff --record Record current session state');
|
|
31
|
+
logger.info(' devmind handoff --resume <id> Resume from previous session');
|
|
32
|
+
logger.info(' devmind handoff --list List available sessions');
|
|
33
|
+
logger.info('');
|
|
34
|
+
logger.info('Options:');
|
|
35
|
+
logger.info(' -o, --output <dir> Output directory (default: .devmind)');
|
|
36
|
+
logger.info(' --status <status> Session status (in_progress, completed, paused)');
|
|
37
|
+
logger.info(' --agentId <id> Agent identifier');
|
|
38
|
+
}
|
|
39
|
+
async function listSessions(outputDir) {
|
|
40
|
+
const handoffsDir = path.join(outputDir, 'handoffs');
|
|
41
|
+
try {
|
|
42
|
+
const files = await fs.readdir(handoffsDir);
|
|
43
|
+
const handoffFiles = files
|
|
44
|
+
.filter((f) => f.startsWith('HANDOFF_') && f.endsWith('.md'))
|
|
45
|
+
.sort()
|
|
46
|
+
.reverse();
|
|
47
|
+
if (handoffFiles.length === 0) {
|
|
48
|
+
logger.info('No handoff sessions found.');
|
|
49
|
+
logger.info('Record a session with: devmind handoff --record');
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
logger.info('Available Sessions:');
|
|
53
|
+
logger.info('');
|
|
54
|
+
logger.info('| Session ID | Timestamp | Status |');
|
|
55
|
+
logger.info('|------------|-----------|--------|');
|
|
56
|
+
for (const file of handoffFiles.slice(0, 10)) {
|
|
57
|
+
const content = await readFileSafe(path.join(handoffsDir, file));
|
|
58
|
+
const sessionMatch = content.match(/\|\s*\*\*Session ID\*\*\s*\|\s*([^\|]+?)\s*\|/);
|
|
59
|
+
const timestampMatch = content.match(/\|\s*\*\*Timestamp\*\*\s*\|\s*([^\|]+?)\s*\|/);
|
|
60
|
+
const statusMatch = content.match(/\|\s*\*\*Status\*\*\s*\|\s*([^\|]+?)\s*\|/);
|
|
61
|
+
const sessionId = sessionMatch?.[1] || 'unknown';
|
|
62
|
+
const timestamp = timestampMatch?.[1] || 'unknown';
|
|
63
|
+
const status = statusMatch?.[1] || 'unknown';
|
|
64
|
+
logger.info(`| ${sessionId} | ${timestamp} | ${status} |`);
|
|
65
|
+
}
|
|
66
|
+
logger.info('');
|
|
67
|
+
logger.info(`Total: ${handoffFiles.length} session(s)`);
|
|
68
|
+
logger.info('Resume with: devmind handoff --resume <session_id>');
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
if (error.code === 'ENOENT') {
|
|
72
|
+
logger.info('No handoff sessions found.');
|
|
73
|
+
logger.info('Record a session with: devmind handoff --record');
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async function resumeSession(outputDir, sessionId) {
|
|
81
|
+
const handoffsDir = path.join(outputDir, 'handoffs');
|
|
82
|
+
const stateDir = path.join(outputDir, 'state');
|
|
83
|
+
const contextDir = path.join(outputDir, 'context');
|
|
84
|
+
// Try to find session files
|
|
85
|
+
const sessionPatterns = [`HANDOFF_${sessionId}.md`, `HANDOFF_${sessionId}-*.md`];
|
|
86
|
+
let handoffFile = null;
|
|
87
|
+
for (const pattern of sessionPatterns) {
|
|
88
|
+
try {
|
|
89
|
+
const files = await fs.readdir(handoffsDir);
|
|
90
|
+
const handoffFiles = files.filter((f) => f.startsWith('HANDOFF_') && f.endsWith('.md'));
|
|
91
|
+
for (const file of handoffFiles) {
|
|
92
|
+
const filePath = path.join(handoffsDir, file);
|
|
93
|
+
const content = await readFileSafe(filePath);
|
|
94
|
+
const sessionMatch = content.match(/\|\s*\*\*Session ID\*\*\s*\|\s*([^\|]+?)\s*\|/);
|
|
95
|
+
if (sessionMatch && sessionMatch[1].trim() === sessionId) {
|
|
96
|
+
handoffFile = path.join(handoffsDir, file);
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (handoffFile)
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// Continue
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (!handoffFile) {
|
|
108
|
+
logger.error(`Session ${sessionId} not found.`);
|
|
109
|
+
logger.info('List sessions with: devmind handoff --list');
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// Load state files
|
|
113
|
+
const stateFile = path.join(stateDir, 'CURRENT_STATE.md');
|
|
114
|
+
const contextFile = path.join(contextDir, 'SESSION_CONTEXT.json');
|
|
115
|
+
logger.info(`Resuming session: ${sessionId}`);
|
|
116
|
+
logger.info('');
|
|
117
|
+
try {
|
|
118
|
+
const handoffContent = await readFileSafe(handoffFile);
|
|
119
|
+
logger.info('--- Handoff Summary ---');
|
|
120
|
+
logger.info(handoffContent.slice(0, 500) + '...\n');
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// Continue
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
const stateContent = await readFileSafe(stateFile);
|
|
127
|
+
logger.info('--- Current State ---');
|
|
128
|
+
logger.info(stateContent.slice(0, 500) + '...\n');
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
logger.warn('(No current state file found)\n');
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
const contextContent = await readFileSafe(contextFile);
|
|
135
|
+
logger.info('--- Context (JSON) ---');
|
|
136
|
+
logger.info(contextContent.slice(0, 500) + '...\n');
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
logger.warn('(No context JSON found)\n');
|
|
140
|
+
}
|
|
141
|
+
logger.success('Ready to resume. Review state before continuing.');
|
|
142
|
+
}
|
|
143
|
+
async function recordHandoff(outputDir, options) {
|
|
144
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
145
|
+
const sessionId = `sess_${timestamp}`;
|
|
146
|
+
const agentId = options.agentId || 'agent-unknown';
|
|
147
|
+
const handoffsDir = path.join(outputDir, 'handoffs');
|
|
148
|
+
const stateDir = path.join(outputDir, 'state');
|
|
149
|
+
const contextDir = path.join(outputDir, 'context');
|
|
150
|
+
const decisionsDir = path.join(outputDir, 'decisions');
|
|
151
|
+
// Create directories
|
|
152
|
+
await ensureDir(handoffsDir);
|
|
153
|
+
await ensureDir(stateDir);
|
|
154
|
+
await ensureDir(contextDir);
|
|
155
|
+
await ensureDir(decisionsDir);
|
|
156
|
+
// Generate handoff file
|
|
157
|
+
const handoffContent = generateHandoffMarkdown(sessionId, agentId, timestamp, options.status || 'in_progress');
|
|
158
|
+
const handoffFile = path.join(handoffsDir, `HANDOFF_${timestamp}.md`);
|
|
159
|
+
await writeFileSafe(handoffFile, handoffContent);
|
|
160
|
+
// Generate state file
|
|
161
|
+
const stateContent = generateStateMarkdown(sessionId, agentId, timestamp, options.status || 'in_progress');
|
|
162
|
+
await writeFileSafe(path.join(stateDir, 'CURRENT_STATE.md'), stateContent);
|
|
163
|
+
// Generate context JSON
|
|
164
|
+
const contextContent = generateContextJson(sessionId, agentId, timestamp, options.status || 'in_progress');
|
|
165
|
+
await writeFileSafe(path.join(contextDir, 'SESSION_CONTEXT.json'), contextContent);
|
|
166
|
+
logger.success(`Session recorded: ${sessionId}`);
|
|
167
|
+
logger.info('Files created:');
|
|
168
|
+
logger.info(` - ${handoffFile}`);
|
|
169
|
+
logger.info(` - ${path.join(stateDir, 'CURRENT_STATE.md')}`);
|
|
170
|
+
logger.info(` - ${path.join(contextDir, 'SESSION_CONTEXT.json')}`);
|
|
171
|
+
logger.info('');
|
|
172
|
+
logger.info('Multi-agent protocol:');
|
|
173
|
+
logger.info('1. Share handoff file with next agent');
|
|
174
|
+
logger.info('2. Next agent reads: .devmind/state/CURRENT_STATE.md');
|
|
175
|
+
logger.info('3. Full context: .devmind/context/SESSION_CONTEXT.json');
|
|
176
|
+
}
|
|
177
|
+
function generateHandoffMarkdown(sessionId, agentId, timestamp, status) {
|
|
178
|
+
return `# Agent Handoff Record
|
|
179
|
+
|
|
180
|
+
> AUTO-GENERATED by devmind-db. Read this before continuing.
|
|
181
|
+
|
|
182
|
+
## Session Info
|
|
183
|
+
|
|
184
|
+
| Field | Value |
|
|
185
|
+
|-------|-------|
|
|
186
|
+
| **Agent ID** | ${agentId} |
|
|
187
|
+
| **Session ID** | ${sessionId} |
|
|
188
|
+
| **Timestamp** | ${timestamp} |
|
|
189
|
+
| **Status** | ${status} |
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## What Was Attempted
|
|
194
|
+
|
|
195
|
+
### Goals
|
|
196
|
+
- Goal 1
|
|
197
|
+
- Goal 2
|
|
198
|
+
|
|
199
|
+
### Actions Taken
|
|
200
|
+
|
|
201
|
+
| Step | Action | Result |
|
|
202
|
+
|------|--------|--------|
|
|
203
|
+
| 1 | Initial setup | ✅ Complete |
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## What Succeeded
|
|
208
|
+
|
|
209
|
+
- ✅ Success item 1
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## What Failed
|
|
214
|
+
|
|
215
|
+
- (None yet)
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## Decisions Made
|
|
220
|
+
|
|
221
|
+
> See \`.devmind/decisions/\` for detailed logs.
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Current State
|
|
226
|
+
|
|
227
|
+
### Last Completed Step
|
|
228
|
+
- Initial handoff recorded
|
|
229
|
+
|
|
230
|
+
### Pending Work
|
|
231
|
+
- [ ] Pending item 1
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Context for Next Agent
|
|
236
|
+
|
|
237
|
+
### Variables
|
|
238
|
+
\`\`\`json
|
|
239
|
+
{
|
|
240
|
+
"sessionId": "${sessionId}",
|
|
241
|
+
"agentId": "${agentId}"
|
|
242
|
+
}
|
|
243
|
+
\`\`\`
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## Next Steps
|
|
248
|
+
|
|
249
|
+
1. Review CURRENT_STATE.md
|
|
250
|
+
2. Check SESSION_CONTEXT.json for full state
|
|
251
|
+
3. Continue from last checkpoint
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
> **PROTOCOL**: Before spawning subagents:
|
|
256
|
+
> 1. Generate handoff file
|
|
257
|
+
> 2. Pass handoff to next agent
|
|
258
|
+
> 3. Next agent reads state first
|
|
259
|
+
`;
|
|
260
|
+
}
|
|
261
|
+
function generateStateMarkdown(sessionId, agentId, timestamp, status) {
|
|
262
|
+
return `# Current State
|
|
263
|
+
|
|
264
|
+
> AUTO-GENERATED by devmind-db. Active progress snapshot.
|
|
265
|
+
|
|
266
|
+
## Session Status
|
|
267
|
+
|
|
268
|
+
| Field | Value |
|
|
269
|
+
|-------|-------|
|
|
270
|
+
| **Status** | ${status} |
|
|
271
|
+
| **Last Updated** | ${timestamp} |
|
|
272
|
+
| **Session ID** | ${sessionId} |
|
|
273
|
+
| **Agent ID** | ${agentId} |
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## Progress
|
|
278
|
+
|
|
279
|
+
### Completed Steps
|
|
280
|
+
- ✅ Initial session recorded
|
|
281
|
+
|
|
282
|
+
### Current Step
|
|
283
|
+
- Session initialization
|
|
284
|
+
|
|
285
|
+
### Remaining Steps
|
|
286
|
+
- ⏳ Define goals
|
|
287
|
+
- ⏳ Execute work
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Variables & State
|
|
292
|
+
|
|
293
|
+
\`\`\`json
|
|
294
|
+
{
|
|
295
|
+
"sessionId": "${sessionId}",
|
|
296
|
+
"agentId": "${agentId}"
|
|
297
|
+
}
|
|
298
|
+
\`\`\`
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
> **MULTI-AGENT**: Read this first when resuming.
|
|
303
|
+
`;
|
|
304
|
+
}
|
|
305
|
+
function generateContextJson(sessionId, agentId, timestamp, status) {
|
|
306
|
+
return JSON.stringify({
|
|
307
|
+
version: '1.0.2',
|
|
308
|
+
session: {
|
|
309
|
+
id: sessionId,
|
|
310
|
+
agentId: agentId,
|
|
311
|
+
parentSessionId: null,
|
|
312
|
+
timestamp: timestamp,
|
|
313
|
+
status: status,
|
|
314
|
+
},
|
|
315
|
+
state: {
|
|
316
|
+
phase: 'initializing',
|
|
317
|
+
progress: 0,
|
|
318
|
+
lastAction: 'Session created',
|
|
319
|
+
nextAction: 'Define goals',
|
|
320
|
+
},
|
|
321
|
+
variables: {},
|
|
322
|
+
schema: {
|
|
323
|
+
databaseType: null,
|
|
324
|
+
tablesModified: [],
|
|
325
|
+
schemaHash: null,
|
|
326
|
+
},
|
|
327
|
+
decisions: [],
|
|
328
|
+
handoffs: [],
|
|
329
|
+
errors: [],
|
|
330
|
+
}, null, 2);
|
|
331
|
+
}
|
|
332
|
+
//# sourceMappingURL=handoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../../src/database/commands/handoff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* History Command
|
|
3
|
+
* View session history and schema evolution
|
|
4
|
+
*/
|
|
5
|
+
interface HistoryOptions {
|
|
6
|
+
sessions?: boolean;
|
|
7
|
+
evolution?: boolean;
|
|
8
|
+
codebaseEvolution?: boolean;
|
|
9
|
+
unified?: boolean;
|
|
10
|
+
output?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function history(options: HistoryOptions): Promise<void>;
|
|
13
|
+
export {};
|