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.
Files changed (141) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +148 -0
  3. package/dist/cli.d.ts +6 -0
  4. package/dist/cli.js +232 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/codebase/generators/architecture.d.ts +4 -0
  7. package/dist/codebase/generators/architecture.js +33 -0
  8. package/dist/codebase/generators/architecture.js.map +1 -0
  9. package/dist/codebase/generators/modules.d.ts +9 -0
  10. package/dist/codebase/generators/modules.js +46 -0
  11. package/dist/codebase/generators/modules.js.map +1 -0
  12. package/dist/codebase/generators/overview.d.ts +5 -0
  13. package/dist/codebase/generators/overview.js +34 -0
  14. package/dist/codebase/generators/overview.js.map +1 -0
  15. package/dist/codebase/generators/skeleton.d.ts +8 -0
  16. package/dist/codebase/generators/skeleton.js +57 -0
  17. package/dist/codebase/generators/skeleton.js.map +1 -0
  18. package/dist/codebase/index.d.ts +24 -0
  19. package/dist/codebase/index.js +50 -0
  20. package/dist/codebase/index.js.map +1 -0
  21. package/dist/codebase/parsers/typescript.d.ts +14 -0
  22. package/dist/codebase/parsers/typescript.js +145 -0
  23. package/dist/codebase/parsers/typescript.js.map +1 -0
  24. package/dist/codebase/scanners/filesystem.d.ts +17 -0
  25. package/dist/codebase/scanners/filesystem.js +152 -0
  26. package/dist/codebase/scanners/filesystem.js.map +1 -0
  27. package/dist/codebase/utils/hashing.d.ts +15 -0
  28. package/dist/codebase/utils/hashing.js +50 -0
  29. package/dist/codebase/utils/hashing.js.map +1 -0
  30. package/dist/codebase/utils/stats.d.ts +12 -0
  31. package/dist/codebase/utils/stats.js +55 -0
  32. package/dist/codebase/utils/stats.js.map +1 -0
  33. package/dist/codebase/utils/tree.d.ts +10 -0
  34. package/dist/codebase/utils/tree.js +22 -0
  35. package/dist/codebase/utils/tree.js.map +1 -0
  36. package/dist/commands/analyze.d.ts +6 -0
  37. package/dist/commands/analyze.js +97 -0
  38. package/dist/commands/analyze.js.map +1 -0
  39. package/dist/commands/context.d.ts +4 -0
  40. package/dist/commands/context.js +54 -0
  41. package/dist/commands/context.js.map +1 -0
  42. package/dist/core/config.d.ts +20 -0
  43. package/dist/core/config.js +40 -0
  44. package/dist/core/config.js.map +1 -0
  45. package/dist/core/errors.d.ts +18 -0
  46. package/dist/core/errors.js +53 -0
  47. package/dist/core/errors.js.map +1 -0
  48. package/dist/core/fileio.d.ts +10 -0
  49. package/dist/core/fileio.js +57 -0
  50. package/dist/core/fileio.js.map +1 -0
  51. package/dist/core/index.d.ts +8 -0
  52. package/dist/core/index.js +9 -0
  53. package/dist/core/index.js.map +1 -0
  54. package/dist/core/logger.d.ts +15 -0
  55. package/dist/core/logger.js +40 -0
  56. package/dist/core/logger.js.map +1 -0
  57. package/dist/core/types.d.ts +106 -0
  58. package/dist/core/types.js +5 -0
  59. package/dist/core/types.js.map +1 -0
  60. package/dist/database/cli.d.ts +7 -0
  61. package/dist/database/cli.js +132 -0
  62. package/dist/database/cli.js.map +1 -0
  63. package/dist/database/commands/checkpoint.d.ts +13 -0
  64. package/dist/database/commands/checkpoint.js +136 -0
  65. package/dist/database/commands/checkpoint.js.map +1 -0
  66. package/dist/database/commands/generate.d.ts +21 -0
  67. package/dist/database/commands/generate.js +269 -0
  68. package/dist/database/commands/generate.js.map +1 -0
  69. package/dist/database/commands/handoff.d.ts +15 -0
  70. package/dist/database/commands/handoff.js +332 -0
  71. package/dist/database/commands/handoff.js.map +1 -0
  72. package/dist/database/commands/history.d.ts +13 -0
  73. package/dist/database/commands/history.js +148 -0
  74. package/dist/database/commands/history.js.map +1 -0
  75. package/dist/database/commands/init.d.ts +10 -0
  76. package/dist/database/commands/init.js +28 -0
  77. package/dist/database/commands/init.js.map +1 -0
  78. package/dist/database/commands/learn.d.ts +12 -0
  79. package/dist/database/commands/learn.js +93 -0
  80. package/dist/database/commands/learn.js.map +1 -0
  81. package/dist/database/commands/memory.d.ts +90 -0
  82. package/dist/database/commands/memory.js +353 -0
  83. package/dist/database/commands/memory.js.map +1 -0
  84. package/dist/database/commands/show.d.ts +9 -0
  85. package/dist/database/commands/show.js +136 -0
  86. package/dist/database/commands/show.js.map +1 -0
  87. package/dist/database/commands/validate.d.ts +9 -0
  88. package/dist/database/commands/validate.js +200 -0
  89. package/dist/database/commands/validate.js.map +1 -0
  90. package/dist/database/commands/watch.d.ts +9 -0
  91. package/dist/database/commands/watch.js +77 -0
  92. package/dist/database/commands/watch.js.map +1 -0
  93. package/dist/database/extractors/drizzle.d.ts +62 -0
  94. package/dist/database/extractors/drizzle.js +251 -0
  95. package/dist/database/extractors/drizzle.js.map +1 -0
  96. package/dist/database/extractors/firebase.d.ts +39 -0
  97. package/dist/database/extractors/firebase.js +192 -0
  98. package/dist/database/extractors/firebase.js.map +1 -0
  99. package/dist/database/extractors/index.d.ts +69 -0
  100. package/dist/database/extractors/index.js +345 -0
  101. package/dist/database/extractors/index.js.map +1 -0
  102. package/dist/database/extractors/mongodb.d.ts +44 -0
  103. package/dist/database/extractors/mongodb.js +198 -0
  104. package/dist/database/extractors/mongodb.js.map +1 -0
  105. package/dist/database/extractors/mysql.d.ts +61 -0
  106. package/dist/database/extractors/mysql.js +173 -0
  107. package/dist/database/extractors/mysql.js.map +1 -0
  108. package/dist/database/extractors/postgres.d.ts +47 -0
  109. package/dist/database/extractors/postgres.js +141 -0
  110. package/dist/database/extractors/postgres.js.map +1 -0
  111. package/dist/database/extractors/prisma.d.ts +71 -0
  112. package/dist/database/extractors/prisma.js +270 -0
  113. package/dist/database/extractors/prisma.js.map +1 -0
  114. package/dist/database/extractors/sqlite.d.ts +50 -0
  115. package/dist/database/extractors/sqlite.js +148 -0
  116. package/dist/database/extractors/sqlite.js.map +1 -0
  117. package/dist/database/generators/learning-generator.d.ts +48 -0
  118. package/dist/database/generators/learning-generator.js +221 -0
  119. package/dist/database/generators/learning-generator.js.map +1 -0
  120. package/dist/database/generators/templates.d.ts +103 -0
  121. package/dist/database/generators/templates.js +1557 -0
  122. package/dist/database/generators/templates.js.map +1 -0
  123. package/dist/database/index.d.ts +15 -0
  124. package/dist/database/index.js +16 -0
  125. package/dist/database/index.js.map +1 -0
  126. package/dist/database/utils/json-output.d.ts +26 -0
  127. package/dist/database/utils/json-output.js +37 -0
  128. package/dist/database/utils/json-output.js.map +1 -0
  129. package/dist/generators/unified.d.ts +1 -0
  130. package/dist/generators/unified.js +173 -0
  131. package/dist/generators/unified.js.map +1 -0
  132. package/dist/index.d.ts +4 -0
  133. package/dist/index.js +5 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/utils/config-detector.d.ts +1 -0
  136. package/dist/utils/config-detector.js +40 -0
  137. package/dist/utils/config-detector.js.map +1 -0
  138. package/dist/utils/config-loader.d.ts +16 -0
  139. package/dist/utils/config-loader.js +20 -0
  140. package/dist/utils/config-loader.js.map +1 -0
  141. 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 {};