devmind 1.0.2 → 1.1.1

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 (134) hide show
  1. package/README.md +138 -162
  2. package/dist/cli/handlers.d.ts +2 -0
  3. package/dist/cli/handlers.js +140 -0
  4. package/dist/cli/handlers.js.map +1 -0
  5. package/dist/cli/register-all.d.ts +2 -0
  6. package/dist/cli/register-all.js +11 -0
  7. package/dist/cli/register-all.js.map +1 -0
  8. package/dist/cli/register-analysis.d.ts +2 -0
  9. package/dist/cli/register-analysis.js +137 -0
  10. package/dist/cli/register-analysis.js.map +1 -0
  11. package/dist/cli/register-codebase.d.ts +2 -0
  12. package/dist/cli/register-codebase.js +22 -0
  13. package/dist/cli/register-codebase.js.map +1 -0
  14. package/dist/cli/register-database.d.ts +2 -0
  15. package/dist/cli/register-database.js +48 -0
  16. package/dist/cli/register-database.js.map +1 -0
  17. package/dist/cli/register-memory.d.ts +2 -0
  18. package/dist/cli/register-memory.js +58 -0
  19. package/dist/cli/register-memory.js.map +1 -0
  20. package/dist/cli.js +9 -316
  21. package/dist/cli.js.map +1 -1
  22. package/dist/codebase/generators/architecture-extractor.d.ts +41 -0
  23. package/dist/codebase/generators/architecture-extractor.js +388 -0
  24. package/dist/codebase/generators/architecture-extractor.js.map +1 -0
  25. package/dist/codebase/generators/architecture.d.ts +2 -4
  26. package/dist/codebase/generators/architecture.js +123 -30
  27. package/dist/codebase/generators/architecture.js.map +1 -1
  28. package/dist/codebase/generators/modules.js +8 -8
  29. package/dist/codebase/generators/overview.js +24 -24
  30. package/dist/codebase/index.js +3 -3
  31. package/dist/codebase/index.js.map +1 -1
  32. package/dist/codebase/parsers/typescript.d.ts +1 -0
  33. package/dist/codebase/parsers/typescript.js +12 -0
  34. package/dist/codebase/parsers/typescript.js.map +1 -1
  35. package/dist/codebase/scanners/filesystem.d.ts +1 -0
  36. package/dist/codebase/scanners/filesystem.js +128 -4
  37. package/dist/codebase/scanners/filesystem.js.map +1 -1
  38. package/dist/commands/analyze.d.ts +1 -0
  39. package/dist/commands/analyze.js +172 -24
  40. package/dist/commands/analyze.js.map +1 -1
  41. package/dist/commands/audit-design.d.ts +8 -0
  42. package/dist/commands/audit-design.js +158 -0
  43. package/dist/commands/audit-design.js.map +1 -0
  44. package/dist/commands/audit-report.d.ts +18 -0
  45. package/dist/commands/audit-report.js +30 -0
  46. package/dist/commands/audit-report.js.map +1 -0
  47. package/dist/commands/audit-source.d.ts +21 -0
  48. package/dist/commands/audit-source.js +59 -0
  49. package/dist/commands/audit-source.js.map +1 -0
  50. package/dist/commands/audit.d.ts +1 -0
  51. package/dist/commands/audit.js +174 -73
  52. package/dist/commands/audit.js.map +1 -1
  53. package/dist/commands/claude-plugin.d.ts +8 -0
  54. package/dist/commands/claude-plugin.js +123 -0
  55. package/dist/commands/claude-plugin.js.map +1 -0
  56. package/dist/commands/codex-plugin.d.ts +9 -0
  57. package/dist/commands/codex-plugin.js +145 -0
  58. package/dist/commands/codex-plugin.js.map +1 -0
  59. package/dist/commands/context.js +66 -5
  60. package/dist/commands/context.js.map +1 -1
  61. package/dist/commands/design-system.d.ts +8 -0
  62. package/dist/commands/design-system.js +95 -0
  63. package/dist/commands/design-system.js.map +1 -0
  64. package/dist/commands/extract.d.ts +13 -0
  65. package/dist/commands/extract.js +83 -17
  66. package/dist/commands/extract.js.map +1 -1
  67. package/dist/commands/openclaw-plugin.d.ts +8 -0
  68. package/dist/commands/openclaw-plugin.js +103 -0
  69. package/dist/commands/openclaw-plugin.js.map +1 -0
  70. package/dist/commands/retrieve.d.ts +12 -0
  71. package/dist/commands/retrieve.js +234 -0
  72. package/dist/commands/retrieve.js.map +1 -0
  73. package/dist/commands/status.d.ts +1 -0
  74. package/dist/commands/status.js +54 -18
  75. package/dist/commands/status.js.map +1 -1
  76. package/dist/core/cache-json.d.ts +7 -0
  77. package/dist/core/cache-json.js +60 -0
  78. package/dist/core/cache-json.js.map +1 -0
  79. package/dist/core/errors.d.ts +2 -0
  80. package/dist/core/errors.js +49 -1
  81. package/dist/core/errors.js.map +1 -1
  82. package/dist/core/index.d.ts +4 -0
  83. package/dist/core/index.js +4 -0
  84. package/dist/core/index.js.map +1 -1
  85. package/dist/core/learning-parser.d.ts +6 -0
  86. package/dist/core/learning-parser.js +23 -0
  87. package/dist/core/learning-parser.js.map +1 -0
  88. package/dist/core/profile.d.ts +18 -0
  89. package/dist/core/profile.js +37 -0
  90. package/dist/core/profile.js.map +1 -0
  91. package/dist/core/source-file-cache.d.ts +13 -0
  92. package/dist/core/source-file-cache.js +88 -0
  93. package/dist/core/source-file-cache.js.map +1 -0
  94. package/dist/database/cli/register-all.d.ts +2 -0
  95. package/dist/database/cli/register-all.js +9 -0
  96. package/dist/database/cli/register-all.js.map +1 -0
  97. package/dist/database/cli/register-database.d.ts +2 -0
  98. package/dist/database/cli/register-database.js +48 -0
  99. package/dist/database/cli/register-database.js.map +1 -0
  100. package/dist/database/cli/register-interactive.d.ts +2 -0
  101. package/dist/database/cli/register-interactive.js +29 -0
  102. package/dist/database/cli/register-interactive.js.map +1 -0
  103. package/dist/database/cli/register-memory.d.ts +2 -0
  104. package/dist/database/cli/register-memory.js +47 -0
  105. package/dist/database/cli/register-memory.js.map +1 -0
  106. package/dist/database/cli.js +5 -112
  107. package/dist/database/cli.js.map +1 -1
  108. package/dist/database/commands/checkpoint.js +8 -10
  109. package/dist/database/commands/checkpoint.js.map +1 -1
  110. package/dist/database/commands/generate.d.ts +1 -0
  111. package/dist/database/commands/generate.js +28 -20
  112. package/dist/database/commands/generate.js.map +1 -1
  113. package/dist/database/commands/handoff.js +126 -125
  114. package/dist/database/commands/handoff.js.map +1 -1
  115. package/dist/database/commands/learn.d.ts +4 -0
  116. package/dist/database/commands/learn.js +249 -43
  117. package/dist/database/commands/learn.js.map +1 -1
  118. package/dist/database/commands/memory.js +114 -114
  119. package/dist/database/commands/validate.js +6 -4
  120. package/dist/database/commands/validate.js.map +1 -1
  121. package/dist/database/commands/watch.js +2 -2
  122. package/dist/database/commands/watch.js.map +1 -1
  123. package/dist/database/extractors/mysql.js +45 -45
  124. package/dist/database/extractors/postgres.js +54 -54
  125. package/dist/database/extractors/sqlite.js +8 -8
  126. package/dist/database/generators/templates.js +534 -534
  127. package/dist/database/generators/templates.js.map +1 -1
  128. package/dist/database/utils/json-output.d.ts +4 -0
  129. package/dist/database/utils/json-output.js +7 -0
  130. package/dist/database/utils/json-output.js.map +1 -1
  131. package/dist/generators/unified.d.ts +13 -0
  132. package/dist/generators/unified.js +391 -46
  133. package/dist/generators/unified.js.map +1 -1
  134. package/package.json +86 -78
@@ -3,88 +3,294 @@
3
3
  * Add a learning to the accumulated knowledge
4
4
  */
5
5
  import * as path from 'path';
6
- import { logger, ensureDir, writeFileSafe, readFileSafe } from '../../core/index.js';
6
+ import { createHash } from 'crypto';
7
+ import { jsonSuccess, outputJson, isJsonMode, outputJsonError } from '../utils/json-output.js';
8
+ import * as fs from 'fs/promises';
9
+ import { logger, ensureDir, writeFileSafe, readFileSafe, readCacheJson, writeCacheJson, failCommand, } from '../../core/index.js';
10
+ import { parseLearningEntries } from '../../core/learning-parser.js';
11
+ const LEARN_HEADER = '# Project Learnings\n\n> Accumulated technical learnings, architectural decisions, and discovered patterns.\n\n';
12
+ const LEARN_LOCK_TIMEOUT_MS = 2000;
13
+ const LEARN_LOCK_RETRY_MS = 50;
7
14
  export async function learn(learning, options) {
8
15
  const outputDir = options.output || '.devmind';
9
- const learningsDir = path.join(outputDir, 'memory', 'learnings');
16
+ const jsonMode = isJsonMode(options);
10
17
  // List learnings
11
18
  if (options.list) {
12
- await listLearnings(outputDir);
19
+ await listLearnings(outputDir, jsonMode, {
20
+ category: options.category,
21
+ top: options.top,
22
+ contains: options.contains,
23
+ since: options.since,
24
+ compact: options.compact,
25
+ });
13
26
  return;
14
27
  }
15
28
  if (!learning) {
16
- logger.error('Please provide a learning.');
29
+ const errorMessage = 'Please provide a learning.';
30
+ if (jsonMode) {
31
+ outputJsonError(errorMessage);
32
+ return;
33
+ }
34
+ logger.error(errorMessage);
17
35
  logger.info('');
18
36
  logger.info('Usage:');
19
37
  logger.info(' devmind learn "Always use indexes on foreign keys"');
20
38
  logger.info(' devmind learn "Batch inserts are 5x faster" --category=performance');
21
39
  return;
22
40
  }
23
- const category = options.category || 'general';
41
+ const category = normalizeCategory(options.category || 'general');
42
+ const normalizedLearning = normalizeLearning(learning);
43
+ if (!normalizedLearning) {
44
+ const errorMessage = 'Learning content is empty after normalization.';
45
+ if (jsonMode) {
46
+ outputJsonError(errorMessage);
47
+ return;
48
+ }
49
+ logger.error(errorMessage);
50
+ return;
51
+ }
24
52
  const timestamp = new Date().toISOString();
53
+ const fingerprint = createFingerprint(category, normalizedLearning);
25
54
  // Create learning content
26
- const content = `## ${timestamp} - ${category}
27
-
28
- ${learning}
29
-
30
- ---
55
+ const content = `## ${timestamp} - ${category}
56
+
57
+ ${normalizedLearning}
58
+
59
+ ---
31
60
  `;
32
61
  const learningsPath = path.join(outputDir, 'memory', 'LEARN.md');
62
+ const indexPath = path.join(outputDir, 'memory', 'learn-index.json');
63
+ const lockPath = path.join(outputDir, 'memory', '.learn.lock');
33
64
  try {
34
65
  await ensureDir(path.dirname(learningsPath));
35
- let existing = '';
66
+ await withFileLock(lockPath, async () => {
67
+ const loaded = await loadOrRebuildLearnIndex(indexPath, learningsPath, timestamp);
68
+ const index = loaded.index;
69
+ if (loaded.rebuilt) {
70
+ await writeCacheJson(indexPath, index, { pretty: false, compressAboveBytes: 512 * 1024 });
71
+ }
72
+ const existingAt = index.fingerprints[fingerprint];
73
+ if (existingAt) {
74
+ if (jsonMode) {
75
+ outputJson(jsonSuccess({
76
+ added: false,
77
+ duplicate: true,
78
+ fingerprint,
79
+ existingAt,
80
+ }));
81
+ return;
82
+ }
83
+ logger.info('Learning already exists. Skipping duplicate entry.');
84
+ logger.info(` Fingerprint: ${fingerprint}`);
85
+ logger.info(` First seen: ${existingAt}`);
86
+ return;
87
+ }
88
+ try {
89
+ await fs.access(learningsPath);
90
+ }
91
+ catch {
92
+ await writeFileSafe(learningsPath, LEARN_HEADER);
93
+ }
94
+ await fs.appendFile(learningsPath, content, 'utf-8');
95
+ index.fingerprints[fingerprint] = timestamp;
96
+ index.updatedAt = timestamp;
97
+ await writeCacheJson(indexPath, index, { pretty: false, compressAboveBytes: 512 * 1024 });
98
+ if (jsonMode) {
99
+ outputJson(jsonSuccess({
100
+ added: true,
101
+ duplicate: false,
102
+ category,
103
+ content: normalizedLearning,
104
+ fingerprint,
105
+ file: learningsPath,
106
+ index: indexPath,
107
+ }));
108
+ return;
109
+ }
110
+ logger.success('Learning added successfully!');
111
+ logger.info(` Category: ${category}`);
112
+ logger.info(` Content: ${normalizedLearning}`);
113
+ logger.info(` File: ${learningsPath}`);
114
+ });
115
+ }
116
+ catch (error) {
117
+ if (jsonMode) {
118
+ outputJsonError(error);
119
+ return;
120
+ }
121
+ failCommand('Failed to save learning:', error);
122
+ return;
123
+ }
124
+ }
125
+ async function withFileLock(lockPath, fn) {
126
+ const start = Date.now();
127
+ while (true) {
36
128
  try {
37
- existing = await readFileSafe(learningsPath);
129
+ const handle = await fs.open(lockPath, 'wx');
130
+ try {
131
+ return await fn();
132
+ }
133
+ finally {
134
+ await handle.close();
135
+ await fs.rm(lockPath, { force: true });
136
+ }
38
137
  }
39
- catch {
40
- existing =
41
- '# Project Learnings\n\n> Accumulated technical learnings, architectural decisions, and discovered patterns.\n\n';
138
+ catch (error) {
139
+ const err = error;
140
+ if (err.code !== 'EEXIST')
141
+ throw error;
142
+ if (Date.now() - start >= LEARN_LOCK_TIMEOUT_MS) {
143
+ throw new Error(`Timed out waiting for learn lock: ${lockPath}`);
144
+ }
145
+ await new Promise((resolve) => setTimeout(resolve, LEARN_LOCK_RETRY_MS));
42
146
  }
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
147
  }
49
- catch (error) {
50
- logger.error('Failed to save learning:');
51
- logger.error(error.message);
52
- process.exit(1);
148
+ }
149
+ function normalizeCategory(input) {
150
+ return input.trim().toLowerCase().replace(/\s+/g, '-');
151
+ }
152
+ function normalizeLearning(input) {
153
+ return input
154
+ .trim()
155
+ .replace(/\r\n/g, '\n')
156
+ .replace(/[ \t]+/g, ' ')
157
+ .replace(/\n{3,}/g, '\n\n');
158
+ }
159
+ function createFingerprint(category, content) {
160
+ return createHash('sha256').update(`${category}\n${content}`, 'utf8').digest('hex').slice(0, 16);
161
+ }
162
+ function isValidLearnIndex(value) {
163
+ if (!value || typeof value !== 'object')
164
+ return false;
165
+ const typed = value;
166
+ return (typed.version === 1 &&
167
+ typeof typed.updatedAt === 'string' &&
168
+ !!typed.fingerprints &&
169
+ typeof typed.fingerprints === 'object');
170
+ }
171
+ async function loadOrRebuildLearnIndex(indexPath, learningsPath, nowIso) {
172
+ const loaded = await readCacheJson(indexPath);
173
+ if (isValidLearnIndex(loaded)) {
174
+ return { index: loaded, rebuilt: false };
175
+ }
176
+ let rebuilt = {
177
+ version: 1,
178
+ updatedAt: nowIso,
179
+ fingerprints: {},
180
+ };
181
+ try {
182
+ const learnContent = await readFileSafe(learningsPath);
183
+ const parsed = parseLearningEntries(learnContent);
184
+ for (const item of parsed) {
185
+ const fingerprint = createFingerprint(normalizeCategory(item.category || 'general'), normalizeLearning(item.content || ''));
186
+ const existingAt = rebuilt.fingerprints[fingerprint];
187
+ if (!existingAt || item.timestamp < existingAt) {
188
+ rebuilt.fingerprints[fingerprint] = item.timestamp;
189
+ }
190
+ }
53
191
  }
192
+ catch {
193
+ // Missing or unreadable LEARN.md means we start from an empty index.
194
+ }
195
+ return { index: rebuilt, rebuilt: true };
196
+ }
197
+ function parseTop(topRaw) {
198
+ if (topRaw === undefined)
199
+ return null;
200
+ const parsed = Number(topRaw);
201
+ if (!Number.isFinite(parsed) || parsed <= 0)
202
+ return null;
203
+ return Math.floor(parsed);
54
204
  }
55
- async function listLearnings(outputDir) {
205
+ async function listLearnings(outputDir, jsonMode, filters) {
56
206
  const learningsPath = path.join(outputDir, 'memory', 'LEARN.md');
57
207
  try {
58
208
  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) {
209
+ const items = parseLearningEntries(content).sort((a, b) => Date.parse(b.timestamp) - Date.parse(a.timestamp));
210
+ const normalizedCategory = filters.category ? normalizeCategory(filters.category) : null;
211
+ const top = parseTop(filters.top);
212
+ const contains = (filters.contains || '').trim().toLowerCase();
213
+ const sinceTimestamp = filters.since ? Date.parse(filters.since) : null;
214
+ if (filters.since && (sinceTimestamp === null || Number.isNaN(sinceTimestamp))) {
215
+ const error = new Error(`Invalid --since date: ${filters.since}`);
216
+ if (jsonMode) {
217
+ outputJsonError(error);
218
+ return;
219
+ }
220
+ logger.error(error.message);
221
+ return;
222
+ }
223
+ let filteredItems = items;
224
+ if (normalizedCategory) {
225
+ filteredItems = filteredItems.filter((item) => normalizeCategory(item.category) === normalizedCategory);
226
+ }
227
+ if (contains) {
228
+ filteredItems = filteredItems.filter((item) => `${item.category}\n${item.content}`.toLowerCase().includes(contains));
229
+ }
230
+ if (sinceTimestamp !== null && !Number.isNaN(sinceTimestamp)) {
231
+ filteredItems = filteredItems.filter((item) => {
232
+ const ts = Date.parse(item.timestamp);
233
+ return !Number.isNaN(ts) && ts >= sinceTimestamp;
234
+ });
235
+ }
236
+ if (top !== null) {
237
+ filteredItems = filteredItems.slice(0, top);
238
+ }
239
+ if (jsonMode) {
240
+ const compactItems = filteredItems.map((item) => ({
241
+ timestamp: item.timestamp,
242
+ category: item.category,
243
+ fingerprint: createFingerprint(normalizeCategory(item.category || 'general'), item.content || ''),
244
+ }));
245
+ outputJson(jsonSuccess({
246
+ total: filteredItems.length,
247
+ filters: {
248
+ category: normalizedCategory,
249
+ top,
250
+ contains: contains || null,
251
+ since: filters.since || null,
252
+ compact: !!filters.compact,
253
+ },
254
+ items: filters.compact ? compactItems : filteredItems,
255
+ }));
256
+ return;
257
+ }
258
+ if (filteredItems.length === 0) {
65
259
  logger.info('No learnings recorded yet.');
66
260
  return;
67
261
  }
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}`);
262
+ logger.info(`Accumulated Learnings (${filteredItems.length}):`);
263
+ logger.info('');
264
+ filteredItems.forEach((item) => {
265
+ logger.success(` ${item.timestamp}`);
266
+ logger.info(` Category: ${item.category || 'general'}`);
267
+ logger.info(` ${item.content || '(No content)'}`);
80
268
  logger.info('');
81
269
  });
82
270
  }
83
271
  catch (error) {
84
272
  if (error.code === 'ENOENT') {
273
+ if (jsonMode) {
274
+ outputJson(jsonSuccess({
275
+ total: 0,
276
+ filters: {
277
+ category: filters.category ? normalizeCategory(filters.category) : null,
278
+ top: parseTop(filters.top),
279
+ contains: (filters.contains || '').trim() || null,
280
+ since: filters.since || null,
281
+ compact: !!filters.compact,
282
+ },
283
+ items: [],
284
+ }));
285
+ return;
286
+ }
85
287
  logger.info('No learnings found.');
86
288
  }
87
289
  else {
290
+ if (jsonMode) {
291
+ outputJsonError(error);
292
+ return;
293
+ }
88
294
  logger.error('Failed to list learnings:');
89
295
  logger.error(error.message);
90
296
  }
@@ -1 +1 @@
1
- {"version":3,"file":"learn.js","sourceRoot":"","sources":["../../../src/database/commands/learn.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"learn.js","sourceRoot":"","sources":["../../../src/database/commands/learn.ts"],"names":[],"mappings":"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"}
@@ -88,32 +88,32 @@ export class MemoryInfrastructure {
88
88
  }
89
89
  getTemplateFallbacks() {
90
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:
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
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\`
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
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.
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
117
  `,
118
118
  };
119
119
  }
@@ -121,64 +121,64 @@ Use checkpoints to preserve progress across sessions.
121
121
  * Create initial learnings file
122
122
  */
123
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.*
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
155
  `;
156
156
  }
157
157
  /**
158
158
  * Create initial session history
159
159
  */
160
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*
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
182
  `;
183
183
  }
184
184
  /**
@@ -186,41 +186,41 @@ See \`BUSINESS_LOGIC.md\` for detected patterns.
186
186
  */
187
187
  createSchemaEvolution(schema) {
188
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*
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
205
  `;
206
206
  }
207
207
  /**
208
208
  * Create codebase evolution tracking
209
209
  */
210
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*
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
224
  `;
225
225
  }
226
226
  /**
@@ -231,7 +231,7 @@ ${schema.tables.map((t) => `- ${t.name} (${t.columns.length} columns)`).join('\n
231
231
  sessionId: `session-${Date.now()}`,
232
232
  timestamp: new Date().toISOString(),
233
233
  schemaHash: this.calculateSchemaHash(schema),
234
- schemaVersion: '1.0.2',
234
+ schemaVersion: '1.1.0',
235
235
  recentChanges: [],
236
236
  pendingQueries: [],
237
237
  discoveries: [
@@ -337,14 +337,14 @@ ${schema.tables.map((t) => `- ${t.name} (${t.columns.length} columns)`).join('\n
337
337
  // Check if hash changed
338
338
  if (!content.includes(`\`${hash}\``)) {
339
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
- ---
340
+ const entry = `
341
+ ## ${timestamp} - Scan
342
+
343
+ **Codebase Hash:** \`${hash}\`
344
+ **Files:** ${stats.files}
345
+ **LOC:** ${stats.loc}
346
+
347
+ ---
348
348
  `;
349
349
  await writeFileSafe(evolutionPath, content + entry);
350
350
  }
@@ -3,7 +3,7 @@
3
3
  * Validates generated context against database
4
4
  */
5
5
  import * as path from 'path';
6
- import { logger, readFileSafe } from '../../core/index.js';
6
+ import { logger, readFileSafe, failCommand } from '../../core/index.js';
7
7
  import { createExtractor, UnifiedSchemaConverter, } from '../extractors/index.js';
8
8
  import * as fs from 'fs'; // Keep fs for existsSync checks
9
9
  async function extractDocumentedTablesFromFile(filePath) {
@@ -189,7 +189,8 @@ export async function validate(options) {
189
189
  }
190
190
  if (options.strict && (result.errors.length > 0 || result.warnings.length > 0)) {
191
191
  logger.error('Validation failed in strict mode');
192
- process.exit(1);
192
+ process.exitCode = 1;
193
+ return;
193
194
  }
194
195
  }
195
196
  // Summary
@@ -200,10 +201,11 @@ export async function validate(options) {
200
201
  logger.info(` Warnings: ${result.warnings.length}`);
201
202
  }
202
203
  catch (error) {
203
- logger.error('Validation failed:', error);
204
204
  if (options.strict) {
205
- process.exit(1);
205
+ failCommand('Validation failed:', error);
206
+ return;
206
207
  }
208
+ logger.error('Validation failed:', error);
207
209
  }
208
210
  }
209
211
  //# sourceMappingURL=validate.js.map