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,148 @@
1
+ /**
2
+ * History Command
3
+ * View session history and schema evolution
4
+ */
5
+ import * as path from 'path';
6
+ import { logger, readFileSafe } from '../../core/index.js';
7
+ export async function history(options) {
8
+ const outputDir = options.output || '.devmind';
9
+ // Show schema evolution
10
+ if (options.evolution) {
11
+ await showSchemaEvolution(outputDir);
12
+ return;
13
+ }
14
+ // Show codebase evolution
15
+ if (options.codebaseEvolution) {
16
+ await showCodebaseEvolution(outputDir);
17
+ return;
18
+ }
19
+ // Show unified history
20
+ if (options.unified) {
21
+ await showUnifiedHistory(outputDir);
22
+ return;
23
+ }
24
+ // Default: show session history
25
+ await showSessionHistory(outputDir);
26
+ }
27
+ /**
28
+ * Parse evolution file into entries
29
+ */
30
+ async function parseEvolutionFile(filePath, source) {
31
+ try {
32
+ const content = await readFileSafe(filePath);
33
+ const entries = [];
34
+ const lines = content.split('\n');
35
+ let currentEntry = null;
36
+ let currentContent = [];
37
+ for (const line of lines) {
38
+ const match = line.match(/^## (\d{4}-\d{2}-\d{2}) - (.+)$/);
39
+ if (match) {
40
+ // Save previous entry
41
+ if (currentEntry) {
42
+ currentEntry.content = currentContent.join('\n').trim();
43
+ entries.push(currentEntry);
44
+ }
45
+ // Start new entry
46
+ currentEntry = {
47
+ date: match[1],
48
+ title: match[2],
49
+ source,
50
+ };
51
+ currentContent = [];
52
+ }
53
+ else if (currentEntry) {
54
+ currentContent.push(line);
55
+ }
56
+ }
57
+ // Save last entry
58
+ if (currentEntry) {
59
+ currentEntry.content = currentContent.join('\n').trim();
60
+ entries.push(currentEntry);
61
+ }
62
+ return entries;
63
+ }
64
+ catch {
65
+ return [];
66
+ }
67
+ }
68
+ /**
69
+ * Show unified history
70
+ */
71
+ async function showUnifiedHistory(outputDir) {
72
+ const schemaPath = path.join(outputDir, 'memory', 'schema-evolution.md');
73
+ const codebasePath = path.join(outputDir, 'memory', 'codebase-evolution.md');
74
+ const schemaEntries = await parseEvolutionFile(schemaPath, 'schema');
75
+ const codebaseEntries = await parseEvolutionFile(codebasePath, 'codebase');
76
+ const allEntries = [...schemaEntries, ...codebaseEntries].sort((a, b) => {
77
+ return new Date(b.date).getTime() - new Date(a.date).getTime();
78
+ });
79
+ logger.info('Unified History (Timeline):');
80
+ logger.info('===========================');
81
+ if (allEntries.length === 0) {
82
+ logger.info('No history found.');
83
+ return;
84
+ }
85
+ let unifiedContent = '# Unified Project History\n\n';
86
+ for (const entry of allEntries) {
87
+ const icon = entry.source === 'schema' ? '🗄️' : '💻';
88
+ const sourceLabel = entry.source === 'schema' ? 'Database' : 'Codebase';
89
+ logger.info(`\n${icon} [${entry.date}] ${entry.title} (${sourceLabel})`);
90
+ logger.info('-'.repeat(40));
91
+ logger.info(entry.content);
92
+ unifiedContent += `## ${entry.date} - ${entry.title} [${sourceLabel}]\n\n${entry.content}\n\n---\n\n`;
93
+ }
94
+ // Save unified history file
95
+ const unifiedPath = path.join(outputDir, 'memory', 'unified-history.md');
96
+ const { writeFileSafe } = await import('../../core/index.js'); // Dynamic import to avoid circular dep if any, though core is safe
97
+ await writeFileSafe(unifiedPath, unifiedContent);
98
+ logger.info(`\nSaved to: ${unifiedPath}`);
99
+ }
100
+ /**
101
+ * Show session history
102
+ */
103
+ async function showSessionHistory(outputDir) {
104
+ try {
105
+ const historyPath = path.join(outputDir, 'memory', 'session-history.md');
106
+ const content = await readFileSafe(historyPath);
107
+ logger.info('Session History:');
108
+ logger.info('');
109
+ logger.info(content);
110
+ }
111
+ catch (error) {
112
+ logger.error('Failed to load session history:');
113
+ logger.error(error.message);
114
+ }
115
+ }
116
+ /**
117
+ * Show schema evolution
118
+ */
119
+ async function showSchemaEvolution(outputDir) {
120
+ try {
121
+ const evolutionPath = path.join(outputDir, 'memory', 'schema-evolution.md');
122
+ const content = await readFileSafe(evolutionPath);
123
+ logger.info('Schema Evolution:');
124
+ logger.info('');
125
+ logger.info(content);
126
+ }
127
+ catch (error) {
128
+ logger.error('Failed to load schema evolution:');
129
+ logger.error(error.message);
130
+ }
131
+ }
132
+ /**
133
+ * Show codebase evolution
134
+ */
135
+ async function showCodebaseEvolution(outputDir) {
136
+ try {
137
+ const evolutionPath = path.join(outputDir, 'memory', 'codebase-evolution.md');
138
+ const content = await readFileSafe(evolutionPath);
139
+ logger.info('Codebase Evolution:');
140
+ logger.info('');
141
+ logger.info(content);
142
+ }
143
+ catch (error) {
144
+ logger.error('Failed to load codebase evolution:');
145
+ logger.error(error.message);
146
+ }
147
+ }
148
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/database/commands/history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Init Command
3
+ * Initialize DevMind Database in a project
4
+ */
5
+ interface InitOptions {
6
+ url?: string;
7
+ dir?: string;
8
+ }
9
+ export declare function init(options: InitOptions): Promise<void>;
10
+ export {};
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Init Command
3
+ * Initialize DevMind Database in a project
4
+ */
5
+ import * as path from 'path';
6
+ import { logger, ensureDir, writeJSON } from '../../core/index.js';
7
+ export async function init(options) {
8
+ const outputDir = options.dir || '.devmind';
9
+ logger.info(`Initializing DevMind Database...`);
10
+ logger.info(` Output directory: ${outputDir}`);
11
+ // Create output directory
12
+ const fullPath = path.resolve(outputDir);
13
+ await ensureDir(fullPath);
14
+ // Create config file
15
+ const config = {
16
+ databaseUrl: options.url || process.env.DATABASE_URL || '',
17
+ outputDir,
18
+ schema: 'public',
19
+ format: 'markdown',
20
+ };
21
+ await writeJSON(path.join(fullPath, 'devmind.config.json'), config);
22
+ logger.success(`Initialized!`);
23
+ logger.success(`Created: ${path.join(fullPath, 'devmind.config.json')}`);
24
+ logger.info(`Next steps:`);
25
+ logger.info(` 1. Run 'devmind generate' to create context files`);
26
+ logger.info(` 2. Or 'devmind generate --url "postgresql://..." if URL not set`);
27
+ }
28
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/database/commands/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAOnE,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAoB;IAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,IAAI,UAAU,CAAC;IAC5C,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAChD,MAAM,CAAC,IAAI,CAAC,wBAAwB,SAAS,EAAE,CAAC,CAAC;IAEjD,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;IAE1B,qBAAqB;IACrB,MAAM,MAAM,GAAG;QACb,WAAW,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE;QAC1D,SAAS;QACT,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,UAAU;KACnB,CAAC;IAEF,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC,EAAE,MAAM,CAAC,CAAC;IAEpE,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/B,MAAM,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC,EAAE,CAAC,CAAC;IACzE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3B,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IACpE,MAAM,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;AACpF,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Learn Command
3
+ * Add a learning to the accumulated knowledge
4
+ */
5
+ interface LearnOptions {
6
+ list?: boolean;
7
+ category?: string;
8
+ output?: string;
9
+ json?: boolean;
10
+ }
11
+ export declare function learn(learning: string, options: LearnOptions): Promise<void>;
12
+ export {};
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Learn Command
3
+ * Add a learning to the accumulated knowledge
4
+ */
5
+ import * as path from 'path';
6
+ import { logger, ensureDir, writeFileSafe, readFileSafe } from '../../core/index.js';
7
+ export async function learn(learning, options) {
8
+ const outputDir = options.output || '.devmind';
9
+ const learningsDir = path.join(outputDir, 'memory', 'learnings');
10
+ // List learnings
11
+ if (options.list) {
12
+ await listLearnings(outputDir);
13
+ return;
14
+ }
15
+ if (!learning) {
16
+ logger.error('Please provide a learning.');
17
+ logger.info('');
18
+ logger.info('Usage:');
19
+ logger.info(' devmind learn "Always use indexes on foreign keys"');
20
+ logger.info(' devmind learn "Batch inserts are 5x faster" --category=performance');
21
+ return;
22
+ }
23
+ const category = options.category || 'general';
24
+ const timestamp = new Date().toISOString();
25
+ // Create learning content
26
+ const content = `## ${timestamp} - ${category}
27
+
28
+ ${learning}
29
+
30
+ ---
31
+ `;
32
+ const learningsPath = path.join(outputDir, 'memory', 'LEARN.md');
33
+ try {
34
+ await ensureDir(path.dirname(learningsPath));
35
+ let existing = '';
36
+ try {
37
+ existing = await readFileSafe(learningsPath);
38
+ }
39
+ catch {
40
+ existing =
41
+ '# Project Learnings\n\n> Accumulated technical learnings, architectural decisions, and discovered patterns.\n\n';
42
+ }
43
+ await writeFileSafe(learningsPath, existing + content);
44
+ logger.success('Learning added successfully!');
45
+ logger.info(` Category: ${category}`);
46
+ logger.info(` Content: ${learning}`);
47
+ logger.info(` File: ${learningsPath}`);
48
+ }
49
+ catch (error) {
50
+ logger.error('Failed to save learning:');
51
+ logger.error(error.message);
52
+ process.exit(1);
53
+ }
54
+ }
55
+ async function listLearnings(outputDir) {
56
+ const learningsPath = path.join(outputDir, 'memory', 'LEARN.md');
57
+ try {
58
+ const content = await readFileSafe(learningsPath);
59
+ const learnings = content.split('---').filter((l) => l.trim().length > 0);
60
+ logger.info('Accumulated Learnings:');
61
+ logger.info('');
62
+ // Skip header
63
+ const items = learnings.slice(1);
64
+ if (items.length === 0) {
65
+ logger.info('No learnings recorded yet.');
66
+ return;
67
+ }
68
+ items.forEach((item) => {
69
+ const lines = item.trim().split('\n');
70
+ const header = lines[0].replace('## ', '');
71
+ let [datePart, ...catParts] = header.split(' - ');
72
+ const categoryPart = catParts.join(' - '); // Rejoin in case category has " - "
73
+ const text = lines.slice(1).join('\n').trim();
74
+ const currentDate = datePart ? datePart.trim() : 'Unknown Date';
75
+ const currentCategory = categoryPart ? categoryPart.trim() : 'general';
76
+ const currentLearning = text || '(No content)';
77
+ logger.success(` ${currentDate}`);
78
+ logger.info(` Category: ${currentCategory}`);
79
+ logger.info(` ${currentLearning}`);
80
+ logger.info('');
81
+ });
82
+ }
83
+ catch (error) {
84
+ if (error.code === 'ENOENT') {
85
+ logger.info('No learnings found.');
86
+ }
87
+ else {
88
+ logger.error('Failed to list learnings:');
89
+ logger.error(error.message);
90
+ }
91
+ }
92
+ }
93
+ //# sourceMappingURL=learn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learn.js","sourceRoot":"","sources":["../../../src/database/commands/learn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Memory Infrastructure
3
+ * Creates and manages AI memory layer
4
+ */
5
+ import { UnifiedSchemaInfo } from '../extractors/index.js';
6
+ export interface SessionContext {
7
+ sessionId: string;
8
+ timestamp: string;
9
+ schemaHash: string;
10
+ schemaVersion?: string;
11
+ codebaseHash?: string;
12
+ codebaseStats?: {
13
+ files: number;
14
+ loc: number;
15
+ };
16
+ currentTask?: {
17
+ description: string;
18
+ status: 'in_progress' | 'paused' | 'completed';
19
+ progress: number;
20
+ nextSteps: string[];
21
+ };
22
+ recentChanges: Array<{
23
+ table: string;
24
+ change: string;
25
+ timestamp: string;
26
+ }>;
27
+ pendingQueries: string[];
28
+ discoveries: string[];
29
+ }
30
+ export declare class MemoryInfrastructure {
31
+ /**
32
+ * Create memory directory structure
33
+ */
34
+ createMemoryStructure(outputDir: string): Promise<void>;
35
+ /**
36
+ * Initialize memory files
37
+ */
38
+ initializeMemoryFiles(outputDir: string, schema: UnifiedSchemaInfo): Promise<void>;
39
+ /**
40
+ * Copy template files to output directory
41
+ */
42
+ copyTemplateFiles(templatesDir: string, outputDir: string): Promise<void>;
43
+ private getTemplateFallbacks;
44
+ /**
45
+ * Create initial learnings file
46
+ */
47
+ private createInitialLearnings;
48
+ /**
49
+ * Create initial session history
50
+ */
51
+ private createInitialHistory;
52
+ /**
53
+ * Create schema evolution tracking
54
+ */
55
+ private createSchemaEvolution;
56
+ /**
57
+ * Create codebase evolution tracking
58
+ */
59
+ createCodebaseEvolution(hash: string, stats?: {
60
+ files: number;
61
+ loc: number;
62
+ }): string;
63
+ /**
64
+ * Create initial session context
65
+ */
66
+ private createSessionContext;
67
+ /**
68
+ * Calculate schema hash for drift detection
69
+ */
70
+ calculateSchemaHash(schema: UnifiedSchemaInfo): string;
71
+ /**
72
+ * Save checkpoint
73
+ */
74
+ saveCheckpoint(outputDir: string, context: SessionContext, message?: string): Promise<string>;
75
+ /**
76
+ * Restore latest checkpoint
77
+ */
78
+ restoreLatestCheckpoint(outputDir: string): Promise<SessionContext | null>;
79
+ /**
80
+ * Update session context
81
+ */
82
+ updateSessionContext(outputDir: string, updates: Partial<SessionContext>): Promise<void>;
83
+ /**
84
+ * Update codebase evolution
85
+ */
86
+ updateCodebaseEvolution(outputDir: string, hash: string, stats: {
87
+ files: number;
88
+ loc: number;
89
+ }): Promise<void>;
90
+ }