devmind 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +148 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.js +232 -0
- package/dist/cli.js.map +1 -0
- package/dist/codebase/generators/architecture.d.ts +4 -0
- package/dist/codebase/generators/architecture.js +33 -0
- package/dist/codebase/generators/architecture.js.map +1 -0
- package/dist/codebase/generators/modules.d.ts +9 -0
- package/dist/codebase/generators/modules.js +46 -0
- package/dist/codebase/generators/modules.js.map +1 -0
- package/dist/codebase/generators/overview.d.ts +5 -0
- package/dist/codebase/generators/overview.js +34 -0
- package/dist/codebase/generators/overview.js.map +1 -0
- package/dist/codebase/generators/skeleton.d.ts +8 -0
- package/dist/codebase/generators/skeleton.js +57 -0
- package/dist/codebase/generators/skeleton.js.map +1 -0
- package/dist/codebase/index.d.ts +24 -0
- package/dist/codebase/index.js +50 -0
- package/dist/codebase/index.js.map +1 -0
- package/dist/codebase/parsers/typescript.d.ts +14 -0
- package/dist/codebase/parsers/typescript.js +145 -0
- package/dist/codebase/parsers/typescript.js.map +1 -0
- package/dist/codebase/scanners/filesystem.d.ts +17 -0
- package/dist/codebase/scanners/filesystem.js +152 -0
- package/dist/codebase/scanners/filesystem.js.map +1 -0
- package/dist/codebase/utils/hashing.d.ts +15 -0
- package/dist/codebase/utils/hashing.js +50 -0
- package/dist/codebase/utils/hashing.js.map +1 -0
- package/dist/codebase/utils/stats.d.ts +12 -0
- package/dist/codebase/utils/stats.js +55 -0
- package/dist/codebase/utils/stats.js.map +1 -0
- package/dist/codebase/utils/tree.d.ts +10 -0
- package/dist/codebase/utils/tree.js +22 -0
- package/dist/codebase/utils/tree.js.map +1 -0
- package/dist/commands/analyze.d.ts +6 -0
- package/dist/commands/analyze.js +97 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/context.d.ts +4 -0
- package/dist/commands/context.js +54 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/core/config.d.ts +20 -0
- package/dist/core/config.js +40 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/errors.d.ts +18 -0
- package/dist/core/errors.js +53 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/fileio.d.ts +10 -0
- package/dist/core/fileio.js +57 -0
- package/dist/core/fileio.js.map +1 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +15 -0
- package/dist/core/logger.js +40 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/types.d.ts +106 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/database/cli.d.ts +7 -0
- package/dist/database/cli.js +132 -0
- package/dist/database/cli.js.map +1 -0
- package/dist/database/commands/checkpoint.d.ts +13 -0
- package/dist/database/commands/checkpoint.js +136 -0
- package/dist/database/commands/checkpoint.js.map +1 -0
- package/dist/database/commands/generate.d.ts +21 -0
- package/dist/database/commands/generate.js +269 -0
- package/dist/database/commands/generate.js.map +1 -0
- package/dist/database/commands/handoff.d.ts +15 -0
- package/dist/database/commands/handoff.js +332 -0
- package/dist/database/commands/handoff.js.map +1 -0
- package/dist/database/commands/history.d.ts +13 -0
- package/dist/database/commands/history.js +148 -0
- package/dist/database/commands/history.js.map +1 -0
- package/dist/database/commands/init.d.ts +10 -0
- package/dist/database/commands/init.js +28 -0
- package/dist/database/commands/init.js.map +1 -0
- package/dist/database/commands/learn.d.ts +12 -0
- package/dist/database/commands/learn.js +93 -0
- package/dist/database/commands/learn.js.map +1 -0
- package/dist/database/commands/memory.d.ts +90 -0
- package/dist/database/commands/memory.js +353 -0
- package/dist/database/commands/memory.js.map +1 -0
- package/dist/database/commands/show.d.ts +9 -0
- package/dist/database/commands/show.js +136 -0
- package/dist/database/commands/show.js.map +1 -0
- package/dist/database/commands/validate.d.ts +9 -0
- package/dist/database/commands/validate.js +200 -0
- package/dist/database/commands/validate.js.map +1 -0
- package/dist/database/commands/watch.d.ts +9 -0
- package/dist/database/commands/watch.js +77 -0
- package/dist/database/commands/watch.js.map +1 -0
- package/dist/database/extractors/drizzle.d.ts +62 -0
- package/dist/database/extractors/drizzle.js +251 -0
- package/dist/database/extractors/drizzle.js.map +1 -0
- package/dist/database/extractors/firebase.d.ts +39 -0
- package/dist/database/extractors/firebase.js +192 -0
- package/dist/database/extractors/firebase.js.map +1 -0
- package/dist/database/extractors/index.d.ts +69 -0
- package/dist/database/extractors/index.js +345 -0
- package/dist/database/extractors/index.js.map +1 -0
- package/dist/database/extractors/mongodb.d.ts +44 -0
- package/dist/database/extractors/mongodb.js +198 -0
- package/dist/database/extractors/mongodb.js.map +1 -0
- package/dist/database/extractors/mysql.d.ts +61 -0
- package/dist/database/extractors/mysql.js +173 -0
- package/dist/database/extractors/mysql.js.map +1 -0
- package/dist/database/extractors/postgres.d.ts +47 -0
- package/dist/database/extractors/postgres.js +141 -0
- package/dist/database/extractors/postgres.js.map +1 -0
- package/dist/database/extractors/prisma.d.ts +71 -0
- package/dist/database/extractors/prisma.js +270 -0
- package/dist/database/extractors/prisma.js.map +1 -0
- package/dist/database/extractors/sqlite.d.ts +50 -0
- package/dist/database/extractors/sqlite.js +148 -0
- package/dist/database/extractors/sqlite.js.map +1 -0
- package/dist/database/generators/learning-generator.d.ts +48 -0
- package/dist/database/generators/learning-generator.js +221 -0
- package/dist/database/generators/learning-generator.js.map +1 -0
- package/dist/database/generators/templates.d.ts +103 -0
- package/dist/database/generators/templates.js +1557 -0
- package/dist/database/generators/templates.js.map +1 -0
- package/dist/database/index.d.ts +15 -0
- package/dist/database/index.js +16 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/utils/json-output.d.ts +26 -0
- package/dist/database/utils/json-output.js +37 -0
- package/dist/database/utils/json-output.js.map +1 -0
- package/dist/generators/unified.d.ts +1 -0
- package/dist/generators/unified.js +173 -0
- package/dist/generators/unified.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/config-detector.d.ts +1 -0
- package/dist/utils/config-detector.js +40 -0
- package/dist/utils/config-detector.js.map +1 -0
- package/dist/utils/config-loader.d.ts +16 -0
- package/dist/utils/config-loader.js +20 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,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,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
|
+
}
|