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.
- package/README.md +138 -162
- package/dist/cli/handlers.d.ts +2 -0
- package/dist/cli/handlers.js +140 -0
- package/dist/cli/handlers.js.map +1 -0
- package/dist/cli/register-all.d.ts +2 -0
- package/dist/cli/register-all.js +11 -0
- package/dist/cli/register-all.js.map +1 -0
- package/dist/cli/register-analysis.d.ts +2 -0
- package/dist/cli/register-analysis.js +137 -0
- package/dist/cli/register-analysis.js.map +1 -0
- package/dist/cli/register-codebase.d.ts +2 -0
- package/dist/cli/register-codebase.js +22 -0
- package/dist/cli/register-codebase.js.map +1 -0
- package/dist/cli/register-database.d.ts +2 -0
- package/dist/cli/register-database.js +48 -0
- package/dist/cli/register-database.js.map +1 -0
- package/dist/cli/register-memory.d.ts +2 -0
- package/dist/cli/register-memory.js +58 -0
- package/dist/cli/register-memory.js.map +1 -0
- package/dist/cli.js +9 -316
- package/dist/cli.js.map +1 -1
- package/dist/codebase/generators/architecture-extractor.d.ts +41 -0
- package/dist/codebase/generators/architecture-extractor.js +388 -0
- package/dist/codebase/generators/architecture-extractor.js.map +1 -0
- package/dist/codebase/generators/architecture.d.ts +2 -4
- package/dist/codebase/generators/architecture.js +123 -30
- package/dist/codebase/generators/architecture.js.map +1 -1
- package/dist/codebase/generators/modules.js +8 -8
- package/dist/codebase/generators/overview.js +24 -24
- package/dist/codebase/index.js +3 -3
- package/dist/codebase/index.js.map +1 -1
- package/dist/codebase/parsers/typescript.d.ts +1 -0
- package/dist/codebase/parsers/typescript.js +12 -0
- package/dist/codebase/parsers/typescript.js.map +1 -1
- package/dist/codebase/scanners/filesystem.d.ts +1 -0
- package/dist/codebase/scanners/filesystem.js +128 -4
- package/dist/codebase/scanners/filesystem.js.map +1 -1
- package/dist/commands/analyze.d.ts +1 -0
- package/dist/commands/analyze.js +172 -24
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/audit-design.d.ts +8 -0
- package/dist/commands/audit-design.js +158 -0
- package/dist/commands/audit-design.js.map +1 -0
- package/dist/commands/audit-report.d.ts +18 -0
- package/dist/commands/audit-report.js +30 -0
- package/dist/commands/audit-report.js.map +1 -0
- package/dist/commands/audit-source.d.ts +21 -0
- package/dist/commands/audit-source.js +59 -0
- package/dist/commands/audit-source.js.map +1 -0
- package/dist/commands/audit.d.ts +1 -0
- package/dist/commands/audit.js +174 -73
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/claude-plugin.d.ts +8 -0
- package/dist/commands/claude-plugin.js +123 -0
- package/dist/commands/claude-plugin.js.map +1 -0
- package/dist/commands/codex-plugin.d.ts +9 -0
- package/dist/commands/codex-plugin.js +145 -0
- package/dist/commands/codex-plugin.js.map +1 -0
- package/dist/commands/context.js +66 -5
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/design-system.d.ts +8 -0
- package/dist/commands/design-system.js +95 -0
- package/dist/commands/design-system.js.map +1 -0
- package/dist/commands/extract.d.ts +13 -0
- package/dist/commands/extract.js +83 -17
- package/dist/commands/extract.js.map +1 -1
- package/dist/commands/openclaw-plugin.d.ts +8 -0
- package/dist/commands/openclaw-plugin.js +103 -0
- package/dist/commands/openclaw-plugin.js.map +1 -0
- package/dist/commands/retrieve.d.ts +12 -0
- package/dist/commands/retrieve.js +234 -0
- package/dist/commands/retrieve.js.map +1 -0
- package/dist/commands/status.d.ts +1 -0
- package/dist/commands/status.js +54 -18
- package/dist/commands/status.js.map +1 -1
- package/dist/core/cache-json.d.ts +7 -0
- package/dist/core/cache-json.js +60 -0
- package/dist/core/cache-json.js.map +1 -0
- package/dist/core/errors.d.ts +2 -0
- package/dist/core/errors.js +49 -1
- package/dist/core/errors.js.map +1 -1
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.js +4 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/learning-parser.d.ts +6 -0
- package/dist/core/learning-parser.js +23 -0
- package/dist/core/learning-parser.js.map +1 -0
- package/dist/core/profile.d.ts +18 -0
- package/dist/core/profile.js +37 -0
- package/dist/core/profile.js.map +1 -0
- package/dist/core/source-file-cache.d.ts +13 -0
- package/dist/core/source-file-cache.js +88 -0
- package/dist/core/source-file-cache.js.map +1 -0
- package/dist/database/cli/register-all.d.ts +2 -0
- package/dist/database/cli/register-all.js +9 -0
- package/dist/database/cli/register-all.js.map +1 -0
- package/dist/database/cli/register-database.d.ts +2 -0
- package/dist/database/cli/register-database.js +48 -0
- package/dist/database/cli/register-database.js.map +1 -0
- package/dist/database/cli/register-interactive.d.ts +2 -0
- package/dist/database/cli/register-interactive.js +29 -0
- package/dist/database/cli/register-interactive.js.map +1 -0
- package/dist/database/cli/register-memory.d.ts +2 -0
- package/dist/database/cli/register-memory.js +47 -0
- package/dist/database/cli/register-memory.js.map +1 -0
- package/dist/database/cli.js +5 -112
- package/dist/database/cli.js.map +1 -1
- package/dist/database/commands/checkpoint.js +8 -10
- package/dist/database/commands/checkpoint.js.map +1 -1
- package/dist/database/commands/generate.d.ts +1 -0
- package/dist/database/commands/generate.js +28 -20
- package/dist/database/commands/generate.js.map +1 -1
- package/dist/database/commands/handoff.js +126 -125
- package/dist/database/commands/handoff.js.map +1 -1
- package/dist/database/commands/learn.d.ts +4 -0
- package/dist/database/commands/learn.js +249 -43
- package/dist/database/commands/learn.js.map +1 -1
- package/dist/database/commands/memory.js +114 -114
- package/dist/database/commands/validate.js +6 -4
- package/dist/database/commands/validate.js.map +1 -1
- package/dist/database/commands/watch.js +2 -2
- package/dist/database/commands/watch.js.map +1 -1
- package/dist/database/extractors/mysql.js +45 -45
- package/dist/database/extractors/postgres.js +54 -54
- package/dist/database/extractors/sqlite.js +8 -8
- package/dist/database/generators/templates.js +534 -534
- package/dist/database/generators/templates.js.map +1 -1
- package/dist/database/utils/json-output.d.ts +4 -0
- package/dist/database/utils/json-output.js +7 -0
- package/dist/database/utils/json-output.js.map +1 -1
- package/dist/generators/unified.d.ts +13 -0
- package/dist/generators/unified.js +391 -46
- package/dist/generators/unified.js.map +1 -1
- 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 {
|
|
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
|
|
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
|
-
|
|
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
|
-
${
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
41
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const
|
|
64
|
-
if (
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
|
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.
|
|
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
|
-
|
|
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
|