memobank-cli 0.2.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/CHANGELOG.md +139 -0
- package/LICENSE +21 -0
- package/README.md +300 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +294 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/capture.d.ts +12 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +191 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/import.d.ts +28 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +356 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/index.d.ts +12 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +82 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/install.d.ts +16 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +142 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/lifecycle.d.ts +21 -0
- package/dist/commands/lifecycle.d.ts.map +1 -0
- package/dist/commands/lifecycle.js +106 -0
- package/dist/commands/lifecycle.js.map +1 -0
- package/dist/commands/map.d.ts +10 -0
- package/dist/commands/map.d.ts.map +1 -0
- package/dist/commands/map.js +72 -0
- package/dist/commands/map.js.map +1 -0
- package/dist/commands/onboarding.d.ts +10 -0
- package/dist/commands/onboarding.d.ts.map +1 -0
- package/dist/commands/onboarding.js +420 -0
- package/dist/commands/onboarding.js.map +1 -0
- package/dist/commands/recall.d.ts +13 -0
- package/dist/commands/recall.d.ts.map +1 -0
- package/dist/commands/recall.js +89 -0
- package/dist/commands/recall.js.map +1 -0
- package/dist/commands/review.d.ts +11 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +66 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/search.d.ts +13 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +107 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/setup.d.ts +9 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +354 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/write.d.ts +14 -0
- package/dist/commands/write.d.ts.map +1 -0
- package/dist/commands/write.js +247 -0
- package/dist/commands/write.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +147 -0
- package/dist/config.js.map +1 -0
- package/dist/core/decay-engine.d.ts +16 -0
- package/dist/core/decay-engine.d.ts.map +1 -0
- package/dist/core/decay-engine.js +91 -0
- package/dist/core/decay-engine.js.map +1 -0
- package/dist/core/embedding.d.ts +60 -0
- package/dist/core/embedding.d.ts.map +1 -0
- package/dist/core/embedding.js +169 -0
- package/dist/core/embedding.js.map +1 -0
- package/dist/core/lifecycle-manager.d.ts +105 -0
- package/dist/core/lifecycle-manager.d.ts.map +1 -0
- package/dist/core/lifecycle-manager.js +332 -0
- package/dist/core/lifecycle-manager.js.map +1 -0
- package/dist/core/memory-template.d.ts +70 -0
- package/dist/core/memory-template.d.ts.map +1 -0
- package/dist/core/memory-template.js +496 -0
- package/dist/core/memory-template.js.map +1 -0
- package/dist/core/noise-filter.d.ts +39 -0
- package/dist/core/noise-filter.d.ts.map +1 -0
- package/dist/core/noise-filter.js +168 -0
- package/dist/core/noise-filter.js.map +1 -0
- package/dist/core/retriever.d.ts +21 -0
- package/dist/core/retriever.d.ts.map +1 -0
- package/dist/core/retriever.js +77 -0
- package/dist/core/retriever.js.map +1 -0
- package/dist/core/sanitizer.d.ts +9 -0
- package/dist/core/sanitizer.d.ts.map +1 -0
- package/dist/core/sanitizer.js +57 -0
- package/dist/core/sanitizer.js.map +1 -0
- package/dist/core/smart-extractor.d.ts +12 -0
- package/dist/core/smart-extractor.d.ts.map +1 -0
- package/dist/core/smart-extractor.js +102 -0
- package/dist/core/smart-extractor.js.map +1 -0
- package/dist/core/store.d.ts +40 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +233 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/tool-config.d.ts +33 -0
- package/dist/core/tool-config.d.ts.map +1 -0
- package/dist/core/tool-config.js +253 -0
- package/dist/core/tool-config.js.map +1 -0
- package/dist/engines/engine-adapter.d.ts +22 -0
- package/dist/engines/engine-adapter.d.ts.map +1 -0
- package/dist/engines/engine-adapter.js +7 -0
- package/dist/engines/engine-adapter.js.map +1 -0
- package/dist/engines/lancedb-engine.d.ts +55 -0
- package/dist/engines/lancedb-engine.d.ts.map +1 -0
- package/dist/engines/lancedb-engine.js +279 -0
- package/dist/engines/lancedb-engine.js.map +1 -0
- package/dist/engines/text-engine.d.ts +30 -0
- package/dist/engines/text-engine.d.ts.map +1 -0
- package/dist/engines/text-engine.js +100 -0
- package/dist/engines/text-engine.js.map +1 -0
- package/dist/platforms/claude-code.d.ts +13 -0
- package/dist/platforms/claude-code.d.ts.map +1 -0
- package/dist/platforms/claude-code.js +85 -0
- package/dist/platforms/claude-code.js.map +1 -0
- package/dist/platforms/codex.d.ts +9 -0
- package/dist/platforms/codex.d.ts.map +1 -0
- package/dist/platforms/codex.js +102 -0
- package/dist/platforms/codex.js.map +1 -0
- package/dist/platforms/cursor.d.ts +9 -0
- package/dist/platforms/cursor.d.ts.map +1 -0
- package/dist/platforms/cursor.js +112 -0
- package/dist/platforms/cursor.js.map +1 -0
- package/dist/types.d.ts +55 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lifecycle command
|
|
3
|
+
* Analyze and manage memory lifecycle (tiers, archival, corrections)
|
|
4
|
+
*/
|
|
5
|
+
export interface LifecycleOptions {
|
|
6
|
+
repo?: string;
|
|
7
|
+
report?: boolean;
|
|
8
|
+
archive?: boolean;
|
|
9
|
+
delete?: boolean;
|
|
10
|
+
flagged?: boolean;
|
|
11
|
+
tier?: 'core' | 'working' | 'peripheral';
|
|
12
|
+
}
|
|
13
|
+
export declare function lifecycleCommand(options?: LifecycleOptions): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Record a correction for a memory
|
|
16
|
+
*/
|
|
17
|
+
export declare function correctCommand(memoryPath: string, options: {
|
|
18
|
+
repo?: string;
|
|
19
|
+
reason?: string;
|
|
20
|
+
}): Promise<void>;
|
|
21
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/commands/lifecycle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;CAC1C;AAWD,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4EpF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1C,OAAO,CAAC,IAAI,CAAC,CAqBf"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Lifecycle command
|
|
4
|
+
* Analyze and manage memory lifecycle (tiers, archival, corrections)
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.lifecycleCommand = lifecycleCommand;
|
|
8
|
+
exports.correctCommand = correctCommand;
|
|
9
|
+
const store_1 = require("../core/store");
|
|
10
|
+
const lifecycle_manager_1 = require("../core/lifecycle-manager");
|
|
11
|
+
const DEFAULT_CONFIG = {
|
|
12
|
+
coreThreshold: 10,
|
|
13
|
+
peripheralThreshold: 90,
|
|
14
|
+
archiveAfterDays: 180,
|
|
15
|
+
deleteAfterDays: 365,
|
|
16
|
+
allowCorrections: true,
|
|
17
|
+
correctionThreshold: 3,
|
|
18
|
+
};
|
|
19
|
+
async function lifecycleCommand(options = {}) {
|
|
20
|
+
const cwd = process.cwd();
|
|
21
|
+
const repoRoot = (0, store_1.findRepoRoot)(cwd, options.repo);
|
|
22
|
+
// Generate report
|
|
23
|
+
if (options.report || !options.archive && !options.delete && !options.flagged && !options.tier) {
|
|
24
|
+
const report = (0, lifecycle_manager_1.generateLifecycleReport)(repoRoot, DEFAULT_CONFIG);
|
|
25
|
+
console.log(report);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
// Show flagged memories
|
|
29
|
+
if (options.flagged) {
|
|
30
|
+
const flagged = (0, lifecycle_manager_1.getFlaggedMemories)(repoRoot);
|
|
31
|
+
if (flagged.length === 0) {
|
|
32
|
+
console.log('✓ No memories flagged for review');
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
console.log(`\n🚩 Flagged Memories (${flagged.length})\n`);
|
|
36
|
+
console.log('These memories have been corrected multiple times:\n');
|
|
37
|
+
for (const memory of flagged) {
|
|
38
|
+
console.log(`- [${memory.type}] ${memory.name}`);
|
|
39
|
+
console.log(` ${memory.description}`);
|
|
40
|
+
console.log(` Path: ${memory.path}\n`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// Analyze and show by tier
|
|
46
|
+
if (options.tier) {
|
|
47
|
+
const analysis = (0, lifecycle_manager_1.analyzeLifecycle)(repoRoot, DEFAULT_CONFIG);
|
|
48
|
+
const filtered = analysis.filter((a) => a.tier === options.tier);
|
|
49
|
+
if (filtered.length === 0) {
|
|
50
|
+
console.log(`No memories in tier: ${options.tier}`);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
console.log(`\n📊 ${options.tier.toUpperCase()} Tier Memories (${filtered.length})\n`);
|
|
54
|
+
for (const item of filtered.slice(0, 20)) {
|
|
55
|
+
console.log(`- [${item.memory.type}] ${item.memory.name}`);
|
|
56
|
+
console.log(` Access count: ${item.accessCount}`);
|
|
57
|
+
console.log(` Days since access: ${item.daysSinceAccess?.toFixed(0) || 'N/A'}\n`);
|
|
58
|
+
}
|
|
59
|
+
if (filtered.length > 20) {
|
|
60
|
+
console.log(`... and ${filtered.length - 20} more\n`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// Archive inactive memories
|
|
66
|
+
if (options.archive) {
|
|
67
|
+
const analysis = (0, lifecycle_manager_1.analyzeLifecycle)(repoRoot, DEFAULT_CONFIG);
|
|
68
|
+
const archivalCandidates = analysis.filter((a) => a.isArchivalCandidate);
|
|
69
|
+
if (archivalCandidates.length === 0) {
|
|
70
|
+
console.log('✓ No memories need archival');
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
console.log(`\n📦 Archival Candidates (${archivalCandidates.length})\n`);
|
|
74
|
+
for (const item of archivalCandidates) {
|
|
75
|
+
console.log(`- [${item.memory.type}] ${item.memory.name}`);
|
|
76
|
+
console.log(` Days inactive: ${item.daysSinceAccess?.toFixed(0)}\n`);
|
|
77
|
+
}
|
|
78
|
+
console.log('\n⚠️ To archive a specific memory, use:');
|
|
79
|
+
console.log(` memo lifecycle archive --path <memory-path>\n`);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// Delete memories
|
|
83
|
+
if (options.delete) {
|
|
84
|
+
console.log('\n⚠️ Delete operation requires --path option\n');
|
|
85
|
+
console.log('Usage: memo lifecycle delete --path <memory-path>\n');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Record a correction for a memory
|
|
91
|
+
*/
|
|
92
|
+
async function correctCommand(memoryPath, options) {
|
|
93
|
+
const cwd = process.cwd();
|
|
94
|
+
const repoRoot = (0, store_1.findRepoRoot)(cwd, options.repo);
|
|
95
|
+
// For now, just record the correction request
|
|
96
|
+
// Full implementation would open editor for correction
|
|
97
|
+
const record = (0, lifecycle_manager_1.recordCorrection)(repoRoot, memoryPath, '[original content]', '[corrected content]', options.reason || 'User correction');
|
|
98
|
+
if (record.flaggedForReview) {
|
|
99
|
+
console.log('⚠️ This memory has been corrected multiple times and is flagged for review');
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
console.log('✓ Correction recorded');
|
|
103
|
+
}
|
|
104
|
+
console.log(`Total corrections: ${record.corrections.length}`);
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/commands/lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/commands/map.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,UAAU,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAyExE"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Map command
|
|
4
|
+
* Print summary of the memory graph
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.mapCommand = mapCommand;
|
|
8
|
+
const store_1 = require("../core/store");
|
|
9
|
+
async function mapCommand(options = {}) {
|
|
10
|
+
const cwd = process.cwd();
|
|
11
|
+
const repoRoot = (0, store_1.findRepoRoot)(cwd, options.repo);
|
|
12
|
+
let memories = (0, store_1.loadAll)(repoRoot);
|
|
13
|
+
// Filter by type if specified
|
|
14
|
+
if (options.type) {
|
|
15
|
+
memories = memories.filter((m) => m.type === options.type);
|
|
16
|
+
}
|
|
17
|
+
if (memories.length === 0) {
|
|
18
|
+
console.log('No memories found');
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
// Count by type
|
|
22
|
+
const typeCounts = {
|
|
23
|
+
lesson: 0,
|
|
24
|
+
decision: 0,
|
|
25
|
+
workflow: 0,
|
|
26
|
+
architecture: 0,
|
|
27
|
+
};
|
|
28
|
+
memories.forEach((m) => {
|
|
29
|
+
typeCounts[m.type]++;
|
|
30
|
+
});
|
|
31
|
+
// Count tags
|
|
32
|
+
const tagCounts = {};
|
|
33
|
+
memories.forEach((m) => {
|
|
34
|
+
m.tags.forEach((tag) => {
|
|
35
|
+
tagCounts[tag] = (tagCounts[tag] || 0) + 1;
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
// Sort tags by frequency
|
|
39
|
+
const sortedTags = Object.entries(tagCounts)
|
|
40
|
+
.sort((a, b) => b[1] - a[1])
|
|
41
|
+
.slice(0, 10);
|
|
42
|
+
// Get recent memories
|
|
43
|
+
const recentMemories = [...memories]
|
|
44
|
+
.sort((a, b) => new Date(b.created).getTime() - new Date(a.created).getTime())
|
|
45
|
+
.slice(0, 5);
|
|
46
|
+
// Print summary
|
|
47
|
+
console.log(`## Memory Map\n`);
|
|
48
|
+
console.log(`**Total:** ${memories.length} memories\n`);
|
|
49
|
+
console.log(`### By Type\n`);
|
|
50
|
+
for (const [type, count] of Object.entries(typeCounts)) {
|
|
51
|
+
if (count > 0) {
|
|
52
|
+
console.log(`- ${type}: ${count}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
console.log();
|
|
56
|
+
if (sortedTags.length > 0) {
|
|
57
|
+
console.log(`### Top Tags\n`);
|
|
58
|
+
for (const [tag, count] of sortedTags) {
|
|
59
|
+
console.log(`- ${tag}: ${count}`);
|
|
60
|
+
}
|
|
61
|
+
console.log();
|
|
62
|
+
}
|
|
63
|
+
if (recentMemories.length > 0) {
|
|
64
|
+
console.log(`### Recent Additions\n`);
|
|
65
|
+
for (const memory of recentMemories) {
|
|
66
|
+
const relativePath = memory.path.replace(repoRoot + '/', '');
|
|
67
|
+
const date = memory.created.split('T')[0];
|
|
68
|
+
console.log(`- [${memory.type}] ${memory.name} · ${date} (\`${relativePath}\`)`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/commands/map.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive Onboarding Command
|
|
3
|
+
* Unified setup flow with interactive menu selection
|
|
4
|
+
* Replaces separate install and setup commands
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Main onboarding flow
|
|
8
|
+
*/
|
|
9
|
+
export declare function onboardingCommand(repoPath?: string): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=onboarding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../src/commands/onboarding.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA6LH;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8ExE"}
|
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Interactive Onboarding Command
|
|
4
|
+
* Unified setup flow with interactive menu selection
|
|
5
|
+
* Replaces separate install and setup commands
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.onboardingCommand = onboardingCommand;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const readline = __importStar(require("readline"));
|
|
45
|
+
const child_process_1 = require("child_process");
|
|
46
|
+
const util_1 = require("util");
|
|
47
|
+
const store_1 = require("../core/store");
|
|
48
|
+
const config_1 = require("../config");
|
|
49
|
+
const import_1 = require("./import");
|
|
50
|
+
const claude_code_1 = require("../platforms/claude-code");
|
|
51
|
+
const codex_1 = require("../platforms/codex");
|
|
52
|
+
const cursor_1 = require("../platforms/cursor");
|
|
53
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
54
|
+
/**
|
|
55
|
+
* Create readline interface with arrow key support
|
|
56
|
+
*/
|
|
57
|
+
function createReadline() {
|
|
58
|
+
return readline.createInterface({
|
|
59
|
+
input: process.stdin,
|
|
60
|
+
output: process.stdout,
|
|
61
|
+
terminal: true,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Show interactive menu with arrow key navigation
|
|
66
|
+
*/
|
|
67
|
+
function showMenu(rl, title, items, defaultIndex) {
|
|
68
|
+
return new Promise((resolve) => {
|
|
69
|
+
let selectedIndex = defaultIndex || 0;
|
|
70
|
+
let isSelecting = true;
|
|
71
|
+
// Hide cursor
|
|
72
|
+
process.stdout.write('\x1B[?25l');
|
|
73
|
+
const render = () => {
|
|
74
|
+
// Clear screen from current position
|
|
75
|
+
readline.clearScreenDown(process.stdout);
|
|
76
|
+
rl.write('\x1B[G'); // Move to beginning of line
|
|
77
|
+
console.log(`\n${title}\n`);
|
|
78
|
+
items.forEach((item, index) => {
|
|
79
|
+
const isSelected = index === selectedIndex;
|
|
80
|
+
const icon = isSelected ? '❯' : ' ';
|
|
81
|
+
const check = isSelected ? '◉' : '◯';
|
|
82
|
+
const style = isSelected ? '\x1B[36m' : '\x1B[90m'; // Cyan or Gray
|
|
83
|
+
const disabled = item.disabled ? '\x1B[90m' : '';
|
|
84
|
+
console.log(`${style}${icon} ${check} ${item.label}${item.description ? ` - ${item.description}` : ''}\x1B[39m`);
|
|
85
|
+
});
|
|
86
|
+
console.log('\n\x1B[90mUse ↑↓ arrows to navigate, Enter to select\x1B[39m');
|
|
87
|
+
};
|
|
88
|
+
const handleKeypress = (_, key) => {
|
|
89
|
+
if (key.name === 'up' && selectedIndex > 0) {
|
|
90
|
+
selectedIndex--;
|
|
91
|
+
render();
|
|
92
|
+
}
|
|
93
|
+
else if (key.name === 'down' && selectedIndex < items.length - 1) {
|
|
94
|
+
selectedIndex++;
|
|
95
|
+
render();
|
|
96
|
+
}
|
|
97
|
+
else if (key.name === 'return' && !items[selectedIndex].disabled) {
|
|
98
|
+
cleanup();
|
|
99
|
+
resolve(selectedIndex);
|
|
100
|
+
}
|
|
101
|
+
else if (key.name === 'c' && key.ctrl) {
|
|
102
|
+
cleanup();
|
|
103
|
+
process.exit(0);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
const cleanup = () => {
|
|
107
|
+
// Show cursor
|
|
108
|
+
process.stdout.write('\x1B[?25h');
|
|
109
|
+
rl.removeListener('keypress', handleKeypress);
|
|
110
|
+
};
|
|
111
|
+
rl.on('keypress', handleKeypress);
|
|
112
|
+
render();
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Show checkbox selection (multiple choice)
|
|
117
|
+
*/
|
|
118
|
+
function showCheckbox(rl, title, items) {
|
|
119
|
+
return new Promise((resolve) => {
|
|
120
|
+
let selectedIndex = 0;
|
|
121
|
+
const selected = items.map((i) => i.selected || false);
|
|
122
|
+
process.stdout.write('\x1B[?25l');
|
|
123
|
+
const render = () => {
|
|
124
|
+
readline.clearScreenDown(process.stdout);
|
|
125
|
+
rl.write('\x1B[G');
|
|
126
|
+
console.log(`\n${title}\n`);
|
|
127
|
+
items.forEach((item, index) => {
|
|
128
|
+
const isSelected = index === selectedIndex;
|
|
129
|
+
const icon = isSelected ? '❯' : ' ';
|
|
130
|
+
const check = selected[index] ? '◉' : '◯';
|
|
131
|
+
const style = isSelected ? '\x1B[36m' : '\x1B[90m';
|
|
132
|
+
console.log(`${style}${icon} [${check}] ${item.label}\x1B[39m`);
|
|
133
|
+
});
|
|
134
|
+
console.log('\n\x1B[90m↑↓ navigate, Space to toggle, Enter to confirm\x1B[39m');
|
|
135
|
+
};
|
|
136
|
+
const handleKeypress = (_, key) => {
|
|
137
|
+
if (key.name === 'up' && selectedIndex > 0) {
|
|
138
|
+
selectedIndex--;
|
|
139
|
+
render();
|
|
140
|
+
}
|
|
141
|
+
else if (key.name === 'down' && selectedIndex < items.length - 1) {
|
|
142
|
+
selectedIndex++;
|
|
143
|
+
render();
|
|
144
|
+
}
|
|
145
|
+
else if (key.name === 'space') {
|
|
146
|
+
selected[selectedIndex] = !selected[selectedIndex];
|
|
147
|
+
render();
|
|
148
|
+
}
|
|
149
|
+
else if (key.name === 'return') {
|
|
150
|
+
cleanup();
|
|
151
|
+
resolve(items.filter((_, i) => selected[i]).map((i) => i.value));
|
|
152
|
+
}
|
|
153
|
+
else if (key.ctrl && key.name === 'c') {
|
|
154
|
+
cleanup();
|
|
155
|
+
process.exit(0);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
const cleanup = () => {
|
|
159
|
+
process.stdout.write('\x1B[?25h');
|
|
160
|
+
rl.removeListener('keypress', handleKeypress);
|
|
161
|
+
};
|
|
162
|
+
rl.on('keypress', handleKeypress);
|
|
163
|
+
render();
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Detect project name
|
|
168
|
+
*/
|
|
169
|
+
async function detectProjectName(cwd) {
|
|
170
|
+
try {
|
|
171
|
+
const { stdout } = await execAsync('git rev-parse --show-toplevel', { cwd });
|
|
172
|
+
return path.basename(stdout.trim());
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return path.basename(cwd);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Check if Ollama is available
|
|
180
|
+
*/
|
|
181
|
+
async function checkOllama() {
|
|
182
|
+
return new Promise((resolve) => {
|
|
183
|
+
(0, child_process_1.exec)('ollama list', (error) => {
|
|
184
|
+
resolve(!error);
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Main onboarding flow
|
|
190
|
+
*/
|
|
191
|
+
async function onboardingCommand(repoPath) {
|
|
192
|
+
const rl = createReadline();
|
|
193
|
+
const cwd = process.cwd();
|
|
194
|
+
const repoRoot = repoPath ? path.resolve(repoPath) : (0, store_1.findRepoRoot)(cwd);
|
|
195
|
+
// Welcome screen
|
|
196
|
+
console.clear();
|
|
197
|
+
console.log('\n\x1B[36m');
|
|
198
|
+
console.log('╔═══════════════════════════════════════════════════════════╗');
|
|
199
|
+
console.log('║ ║');
|
|
200
|
+
console.log('║ 🧠 Welcome to Memobank CLI Setup ║');
|
|
201
|
+
console.log('║ ║');
|
|
202
|
+
console.log('║ Persistent memory for AI coding sessions ║');
|
|
203
|
+
console.log('║ ║');
|
|
204
|
+
console.log('╚═══════════════════════════════════════════════════════════╝');
|
|
205
|
+
console.log('\x1B[39m\n');
|
|
206
|
+
// Detect project
|
|
207
|
+
const projectName = await detectProjectName(cwd);
|
|
208
|
+
console.log(`📁 Project: \x1B[36m${projectName}\x1B[39m`);
|
|
209
|
+
console.log(`📂 Location: \x1B[90m${repoRoot}\x1B[39m\n`);
|
|
210
|
+
// Initialize config if needed
|
|
211
|
+
const configPath = path.join(repoRoot, 'meta', 'config.yaml');
|
|
212
|
+
let config;
|
|
213
|
+
if (!fs.existsSync(configPath)) {
|
|
214
|
+
(0, config_1.initConfig)(repoRoot, projectName);
|
|
215
|
+
config = (0, config_1.loadConfig)(repoRoot);
|
|
216
|
+
console.log('✓ Created new configuration\n');
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
config = (0, config_1.loadConfig)(repoRoot);
|
|
220
|
+
console.log('✓ Found existing configuration\n');
|
|
221
|
+
}
|
|
222
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
223
|
+
// Main menu
|
|
224
|
+
const mainMenuItems = [
|
|
225
|
+
{ label: 'Quick Setup', value: 'quick', description: 'Recommended for most users' },
|
|
226
|
+
{ label: 'Custom Setup', value: 'custom', description: 'Configure each option' },
|
|
227
|
+
{ label: 'Import Memories', value: 'import', description: 'From Claude Code, Gemini, etc.' },
|
|
228
|
+
{ label: 'Platform Setup', value: 'platforms', description: 'Configure AI tools' },
|
|
229
|
+
{ label: 'Embedding Setup', value: 'embedding', description: 'Vector search configuration' },
|
|
230
|
+
{ label: 'Exit', value: 'exit', description: 'Finish setup' },
|
|
231
|
+
];
|
|
232
|
+
let exitSetup = false;
|
|
233
|
+
while (!exitSetup) {
|
|
234
|
+
const choice = await showMenu(rl, 'What would you like to do?', mainMenuItems);
|
|
235
|
+
switch (mainMenuItems[choice].value) {
|
|
236
|
+
case 'quick':
|
|
237
|
+
await quickSetup(rl, repoRoot, config);
|
|
238
|
+
break;
|
|
239
|
+
case 'custom':
|
|
240
|
+
await customSetup(rl, repoRoot, config);
|
|
241
|
+
break;
|
|
242
|
+
case 'import':
|
|
243
|
+
await (0, import_1.importMemories)({ repo: repoRoot });
|
|
244
|
+
break;
|
|
245
|
+
case 'platforms':
|
|
246
|
+
await platformSetup(rl, repoRoot);
|
|
247
|
+
break;
|
|
248
|
+
case 'embedding':
|
|
249
|
+
await embeddingSetup(rl, config, repoRoot);
|
|
250
|
+
break;
|
|
251
|
+
case 'exit':
|
|
252
|
+
exitSetup = true;
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// Summary
|
|
257
|
+
showSummary(config);
|
|
258
|
+
rl.close();
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Quick setup - automated recommended configuration
|
|
262
|
+
*/
|
|
263
|
+
async function quickSetup(rl, repoRoot, config) {
|
|
264
|
+
console.log('\n🚀 Quick Setup\n');
|
|
265
|
+
// Check for Ollama
|
|
266
|
+
const hasOllama = await checkOllama();
|
|
267
|
+
if (hasOllama) {
|
|
268
|
+
console.log('✓ Detected Ollama installation');
|
|
269
|
+
config.embedding.engine = 'lancedb';
|
|
270
|
+
config.embedding.provider = 'ollama';
|
|
271
|
+
config.embedding.model = 'mxbai-embed-large';
|
|
272
|
+
config.embedding.dimensions = 1024;
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
console.log('⊘ Ollama not found, using text search');
|
|
276
|
+
config.embedding.engine = 'text';
|
|
277
|
+
}
|
|
278
|
+
(0, config_1.writeConfig)(repoRoot, config);
|
|
279
|
+
// Install platforms
|
|
280
|
+
console.log('\n📦 Installing platform integrations...\n');
|
|
281
|
+
await (0, claude_code_1.installClaudeCode)(repoRoot);
|
|
282
|
+
await (0, codex_1.installCodex)(process.cwd());
|
|
283
|
+
await (0, cursor_1.installCursor)(process.cwd());
|
|
284
|
+
console.log('\n✅ Quick Setup Complete!\n');
|
|
285
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Custom setup - step by step configuration
|
|
289
|
+
*/
|
|
290
|
+
async function customSetup(rl, repoRoot, config) {
|
|
291
|
+
// Embedding choice
|
|
292
|
+
const embeddingMenu = [
|
|
293
|
+
{ label: 'Ollama (Local, Free)', value: 'ollama', description: 'Recommended' },
|
|
294
|
+
{ label: 'OpenAI (Cloud)', value: 'openai' },
|
|
295
|
+
{ label: 'Text Only (No embeddings)', value: 'text' },
|
|
296
|
+
];
|
|
297
|
+
const embeddingChoice = await showMenu(rl, 'Choose embedding provider:', embeddingMenu);
|
|
298
|
+
switch (embeddingMenu[embeddingChoice].value) {
|
|
299
|
+
case 'ollama':
|
|
300
|
+
config.embedding.engine = 'lancedb';
|
|
301
|
+
config.embedding.provider = 'ollama';
|
|
302
|
+
config.embedding.model = 'mxbai-embed-large';
|
|
303
|
+
config.embedding.dimensions = 1024;
|
|
304
|
+
break;
|
|
305
|
+
case 'openai':
|
|
306
|
+
config.embedding.engine = 'lancedb';
|
|
307
|
+
config.embedding.provider = 'openai';
|
|
308
|
+
config.embedding.model = 'text-embedding-3-small';
|
|
309
|
+
config.embedding.dimensions = 1536;
|
|
310
|
+
break;
|
|
311
|
+
case 'text':
|
|
312
|
+
config.embedding.engine = 'text';
|
|
313
|
+
break;
|
|
314
|
+
}
|
|
315
|
+
// Platform selection
|
|
316
|
+
const platformItems = [
|
|
317
|
+
{ label: 'Claude Code', value: 'claude', selected: true },
|
|
318
|
+
{ label: 'Cursor', value: 'cursor', selected: true },
|
|
319
|
+
{ label: 'Codex (AGENTS.md)', value: 'codex', selected: true },
|
|
320
|
+
];
|
|
321
|
+
const selectedPlatforms = await showCheckbox(rl, 'Configure AI tools:', platformItems);
|
|
322
|
+
console.log('\n📦 Installing selected platforms...\n');
|
|
323
|
+
if (selectedPlatforms.includes('claude')) {
|
|
324
|
+
await (0, claude_code_1.installClaudeCode)(repoRoot);
|
|
325
|
+
}
|
|
326
|
+
if (selectedPlatforms.includes('cursor')) {
|
|
327
|
+
await (0, cursor_1.installCursor)(process.cwd());
|
|
328
|
+
}
|
|
329
|
+
if (selectedPlatforms.includes('codex')) {
|
|
330
|
+
await (0, codex_1.installCodex)(process.cwd());
|
|
331
|
+
}
|
|
332
|
+
(0, config_1.writeConfig)(repoRoot, config);
|
|
333
|
+
console.log('\n✅ Custom Setup Complete!\n');
|
|
334
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Platform-specific setup
|
|
338
|
+
*/
|
|
339
|
+
async function platformSetup(rl, repoRoot) {
|
|
340
|
+
const platformItems = [
|
|
341
|
+
{ label: 'Claude Code', value: 'claude', selected: false },
|
|
342
|
+
{ label: 'Cursor', value: 'cursor', selected: false },
|
|
343
|
+
{ label: 'Codex (AGENTS.md)', value: 'codex', selected: false },
|
|
344
|
+
];
|
|
345
|
+
const selected = await showCheckbox(rl, 'Select platforms to configure:', platformItems);
|
|
346
|
+
console.log('\n📦 Installing...\n');
|
|
347
|
+
if (selected.includes('claude')) {
|
|
348
|
+
await (0, claude_code_1.installClaudeCode)(repoRoot);
|
|
349
|
+
}
|
|
350
|
+
if (selected.includes('cursor')) {
|
|
351
|
+
await (0, cursor_1.installCursor)(process.cwd());
|
|
352
|
+
}
|
|
353
|
+
if (selected.includes('codex')) {
|
|
354
|
+
await (0, codex_1.installCodex)(process.cwd());
|
|
355
|
+
}
|
|
356
|
+
console.log('\n✅ Platform setup complete!\n');
|
|
357
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Embedding setup
|
|
361
|
+
*/
|
|
362
|
+
async function embeddingSetup(rl, config, repoRoot) {
|
|
363
|
+
const embeddingMenu = [
|
|
364
|
+
{ label: 'Ollama (Local, Free)', value: 'ollama', description: 'Recommended' },
|
|
365
|
+
{ label: 'OpenAI (Cloud)', value: 'openai' },
|
|
366
|
+
{ label: 'Azure OpenAI', value: 'azure' },
|
|
367
|
+
{ label: 'Text Only', value: 'text', description: 'No embeddings' },
|
|
368
|
+
];
|
|
369
|
+
const choice = await showMenu(rl, 'Choose embedding provider:', embeddingMenu);
|
|
370
|
+
switch (embeddingMenu[choice].value) {
|
|
371
|
+
case 'ollama':
|
|
372
|
+
config.embedding.engine = 'lancedb';
|
|
373
|
+
config.embedding.provider = 'ollama';
|
|
374
|
+
config.embedding.model = 'mxbai-embed-large';
|
|
375
|
+
config.embedding.dimensions = 1024;
|
|
376
|
+
break;
|
|
377
|
+
case 'openai':
|
|
378
|
+
config.embedding.engine = 'lancedb';
|
|
379
|
+
config.embedding.provider = 'openai';
|
|
380
|
+
config.embedding.model = 'text-embedding-3-small';
|
|
381
|
+
config.embedding.dimensions = 1536;
|
|
382
|
+
break;
|
|
383
|
+
case 'azure':
|
|
384
|
+
config.embedding.engine = 'lancedb';
|
|
385
|
+
config.embedding.provider = 'azure';
|
|
386
|
+
config.embedding.model = 'text-embedding-ada-002';
|
|
387
|
+
config.embedding.dimensions = 1536;
|
|
388
|
+
break;
|
|
389
|
+
case 'text':
|
|
390
|
+
config.embedding.engine = 'text';
|
|
391
|
+
break;
|
|
392
|
+
}
|
|
393
|
+
(0, config_1.writeConfig)(repoRoot, config);
|
|
394
|
+
console.log('\n✅ Embedding configured!\n');
|
|
395
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Show setup summary
|
|
399
|
+
*/
|
|
400
|
+
function showSummary(config) {
|
|
401
|
+
console.log('\n\x1B[36m╔═══════════════════════════════════════════════════════════╗\x1B[39m');
|
|
402
|
+
console.log('\x1B[36m║\x1B[39m \x1B[36m║\x1B[39m');
|
|
403
|
+
console.log('\x1B[36m║\x1B[39m \x1B[1m✅ Setup Complete!\x1B[22m \x1B[36m║\x1B[39m');
|
|
404
|
+
console.log('\x1B[36m║\x1B[39m \x1B[36m║\x1B[39m');
|
|
405
|
+
console.log('\x1B[36m╚═══════════════════════════════════════════════════════════╝\x1B[39m\n');
|
|
406
|
+
console.log('Configuration:\n');
|
|
407
|
+
console.log(` Embedding Engine: \x1B[36m${config.embedding.engine}\x1B[39m`);
|
|
408
|
+
if (config.embedding.engine === 'lancedb') {
|
|
409
|
+
console.log(` Provider: \x1B[90m${config.embedding.provider}\x1B[39m`);
|
|
410
|
+
console.log(` Model: \x1B[90m${config.embedding.model}\x1B[39m`);
|
|
411
|
+
}
|
|
412
|
+
console.log(` Top K Results: \x1B[90m${config.memory.top_k}\x1B[39m`);
|
|
413
|
+
console.log(` Token Budget: \x1B[90m${config.memory.token_budget}\x1B[39m\n`);
|
|
414
|
+
console.log('Next steps:\n');
|
|
415
|
+
console.log(' \x1B[36mmemo write lesson\x1B[39m Create your first memory');
|
|
416
|
+
console.log(' \x1B[36mmemo recall "query"\x1B[39m Search memories');
|
|
417
|
+
console.log(' \x1B[36mmemo lifecycle report\x1B[39m View memory statistics');
|
|
418
|
+
console.log(' \x1B[36mmemo --help\x1B[39m See all commands\n');
|
|
419
|
+
}
|
|
420
|
+
//# sourceMappingURL=onboarding.js.map
|