monomind 1.15.6 → 1.16.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/.claude/agents/github/repo-architect.md +1 -1
- package/.claude/agents/specialists/integration-architect.md +6 -6
- package/.claude/commands/hive-mind/hive-mind-init.md +1 -1
- package/.claude/commands/hive-mind/hive-mind-memory.md +1 -1
- package/.claude/commands/mastermind/brain.md +11 -11
- package/.claude/commands/mastermind/master.md +4 -4
- package/.claude/commands/mastermind/memory.md +6 -6
- package/.claude/commands/memory/README.md +4 -4
- package/.claude/commands/truth/start.md +3 -3
- package/.claude/helpers/extras-registry.json +2 -2
- package/.claude/helpers/skill-registry.json +26 -26
- package/.claude/helpers/statusline.cjs +8 -8
- package/.claude/skills/agentic-jujutsu/SKILL.md +3 -3
- package/.claude/skills/mastermind/_protocol.md +8 -8
- package/README.md +6 -6
- package/package.json +2 -2
- package/packages/@monomind/cli/README.md +6 -6
- package/packages/@monomind/cli/dist/src/__tests__/browse-analyzer.test.js +18 -1
- package/packages/@monomind/cli/dist/src/commands/agent.js +2 -2
- package/packages/@monomind/cli/dist/src/commands/autopilot.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/completions.js +2 -21
- package/packages/@monomind/cli/dist/src/commands/config.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/hive-mind.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/hooks-coverage-commands.js +31 -31
- package/packages/@monomind/cli/dist/src/commands/hooks-routing-commands.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/hooks.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/index.d.ts +0 -1
- package/packages/@monomind/cli/dist/src/commands/index.js +0 -4
- package/packages/@monomind/cli/dist/src/commands/init.js +8 -8
- package/packages/@monomind/cli/dist/src/commands/memory.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/commands/memory.js +138 -28
- package/packages/@monomind/cli/dist/src/commands/migrate.js +2 -2
- package/packages/@monomind/cli/dist/src/commands/neural.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/swarm.js +1 -1
- package/packages/@monomind/cli/dist/src/config-adapter.js +8 -8
- package/packages/@monomind/cli/dist/src/index.js +1 -1
- package/packages/@monomind/cli/dist/src/init/claudemd-generator.js +2 -2
- package/packages/@monomind/cli/dist/src/init/executor.js +16 -16
- package/packages/@monomind/cli/dist/src/init/shared-instructions-generator.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/init/shared-instructions-generator.js +1 -1
- package/packages/@monomind/cli/dist/src/init/statusline-generator.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/init/statusline-generator.js +8 -8
- package/packages/@monomind/cli/dist/src/init/types.d.ts +3 -3
- package/packages/@monomind/cli/dist/src/init/types.js +3 -3
- package/packages/@monomind/cli/dist/src/mcp-client.js +1 -8
- package/packages/@monomind/cli/dist/src/mcp-tools/autopilot-tools.js +3 -3
- package/packages/@monomind/cli/dist/src/mcp-tools/daa-tools.js +13 -13
- package/packages/@monomind/cli/dist/src/mcp-tools/guidance-tools.js +4 -4
- package/packages/@monomind/cli/dist/src/mcp-tools/hive-mind-tools.js +4 -4
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-intelligence.js +1 -0
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-routing.js +23 -23
- package/packages/@monomind/cli/dist/src/mcp-tools/index.d.ts +0 -1
- package/packages/@monomind/cli/dist/src/mcp-tools/index.js +0 -2
- package/packages/@monomind/cli/dist/src/mcp-tools/memory-tools.d.ts +22 -6
- package/packages/@monomind/cli/dist/src/mcp-tools/memory-tools.js +553 -505
- package/packages/@monomind/cli/dist/src/mcp-tools/progress-tools.js +1 -1
- package/packages/@monomind/cli/dist/src/mcp-tools/system-tools.js +5 -5
- package/packages/@monomind/cli/dist/src/mcp-tools/transfer-tools.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/mcp-tools/transfer-tools.js +1 -156
- package/packages/@monomind/cli/dist/src/memory/embedding-operations.js +3 -3
- package/packages/@monomind/cli/dist/src/memory/hnsw-operations.js +5 -5
- package/packages/@monomind/cli/dist/src/memory/intelligence.js +2 -2
- package/packages/@monomind/cli/dist/src/memory/memory-bridge.d.ts +86 -234
- package/packages/@monomind/cli/dist/src/memory/memory-bridge.js +455 -1702
- package/packages/@monomind/cli/dist/src/memory/memory-crud.js +3 -3
- package/packages/@monomind/cli/dist/src/memory/memory-initializer.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/memory/memory-initializer.js +5 -5
- package/packages/@monomind/cli/dist/src/memory/memory-read.js +4 -4
- package/packages/@monomind/cli/dist/src/suggest.js +0 -1
- package/packages/@monomind/cli/dist/src/types.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/ui/dashboard.html +41 -5
- package/packages/@monomind/cli/dist/src/ui/orgs.html +91 -5
- package/packages/@monomind/cli/dist/src/ui/server.mjs +44 -0
- package/packages/@monomind/cli/dist/src/update/validator.js +1 -3
- package/packages/@monomind/cli/package.json +4 -4
- package/scripts/verify-appliance.sh +1 -1
- package/packages/@monomind/cli/dist/src/commands/plugins.d.ts +0 -11
- package/packages/@monomind/cli/dist/src/commands/plugins.js +0 -799
- package/packages/@monomind/cli/dist/src/plugins/manager.d.ts +0 -133
- package/packages/@monomind/cli/dist/src/plugins/manager.js +0 -498
- package/packages/@monomind/cli/dist/src/plugins/store/discovery.d.ts +0 -88
- package/packages/@monomind/cli/dist/src/plugins/store/discovery.js +0 -650
- package/packages/@monomind/cli/dist/src/plugins/store/index.d.ts +0 -76
- package/packages/@monomind/cli/dist/src/plugins/store/index.js +0 -141
- package/packages/@monomind/cli/dist/src/plugins/store/search.d.ts +0 -46
- package/packages/@monomind/cli/dist/src/plugins/store/search.js +0 -231
- package/packages/@monomind/cli/dist/src/plugins/store/types.d.ts +0 -274
- package/packages/@monomind/cli/dist/src/plugins/store/types.js +0 -7
- package/packages/@monomind/cli/dist/src/plugins/tests/demo-plugin-store.d.ts +0 -7
- package/packages/@monomind/cli/dist/src/plugins/tests/demo-plugin-store.js +0 -126
- package/packages/@monomind/cli/dist/src/plugins/tests/standalone-test.d.ts +0 -12
- package/packages/@monomind/cli/dist/src/plugins/tests/standalone-test.js +0 -188
- package/packages/@monomind/cli/dist/src/plugins/tests/test-plugin-store.d.ts +0 -7
- package/packages/@monomind/cli/dist/src/plugins/tests/test-plugin-store.js +0 -206
- package/packages/@monomind/cli/dist/src/services/registry-api.d.ts +0 -58
- package/packages/@monomind/cli/dist/src/services/registry-api.js +0 -199
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* CLI Memory Command
|
|
3
|
-
* Memory operations for
|
|
3
|
+
* Memory operations for LanceDB integration
|
|
4
4
|
*/
|
|
5
5
|
import { output } from '../output.js';
|
|
6
6
|
import { select, confirm, input } from '../prompt.js';
|
|
@@ -8,9 +8,9 @@ import { callMCPTool, MCPClientError } from '../mcp-client.js';
|
|
|
8
8
|
import { configManager } from '../services/config-file-manager.js';
|
|
9
9
|
// Memory backends
|
|
10
10
|
const BACKENDS = [
|
|
11
|
-
{ value: '
|
|
11
|
+
{ value: 'lancedb', label: 'LanceDB', hint: 'Vector database with ANN indexing' },
|
|
12
12
|
{ value: 'sqlite', label: 'SQLite', hint: 'Lightweight local storage' },
|
|
13
|
-
{ value: 'hybrid', label: 'Hybrid', hint: 'SQLite +
|
|
13
|
+
{ value: 'hybrid', label: 'Hybrid', hint: 'SQLite + LanceDB (recommended)' },
|
|
14
14
|
{ value: 'memory', label: 'In-Memory', hint: 'Fast but non-persistent' }
|
|
15
15
|
];
|
|
16
16
|
// Store command
|
|
@@ -447,29 +447,29 @@ function formatRelativeTime(isoDate) {
|
|
|
447
447
|
// Edit command
|
|
448
448
|
const editCommand = {
|
|
449
449
|
name: 'edit',
|
|
450
|
-
description: 'Edit a memory entry (
|
|
450
|
+
description: 'Edit a memory entry (LanceDB, Memory Palace, or knowledge chunk)',
|
|
451
451
|
options: [
|
|
452
|
-
{ name: 'key', short: 'k', description: 'Storage key
|
|
453
|
-
{ name: 'namespace', short: 'n', description: 'Memory namespace
|
|
452
|
+
{ name: 'key', short: 'k', description: 'Storage key', type: 'string' },
|
|
453
|
+
{ name: 'namespace', short: 'n', description: 'Memory namespace', type: 'string', default: 'default' },
|
|
454
454
|
{ name: 'value', description: 'New value/content', type: 'string' },
|
|
455
|
-
{ name: 'source', short: 's', description: 'Source to edit:
|
|
455
|
+
{ name: 'source', short: 's', description: 'Source to edit: lancedb, palace, knowledge', type: 'string', default: 'lancedb', choices: ['lancedb', 'palace', 'knowledge'] },
|
|
456
456
|
{ name: 'id', description: 'Entry ID (palace/knowledge)', type: 'string' }
|
|
457
457
|
],
|
|
458
458
|
examples: [
|
|
459
|
-
{ command: 'monomind memory edit -k "pattern/auth" --value "updated content"', description: 'Edit
|
|
459
|
+
{ command: 'monomind memory edit -k "pattern/auth" --value "updated content"', description: 'Edit LanceDB entry' },
|
|
460
460
|
{ command: 'monomind memory edit --source palace --id "abc123" --value "new content"', description: 'Edit Memory Palace drawer' },
|
|
461
461
|
{ command: 'monomind memory edit --source knowledge --id "chunk-42" --value "updated"', description: 'Edit knowledge chunk' }
|
|
462
462
|
],
|
|
463
463
|
action: async (ctx) => {
|
|
464
|
-
const source = ctx.flags.source || '
|
|
464
|
+
const source = ctx.flags.source || 'lancedb';
|
|
465
465
|
let value = ctx.flags.value || ctx.args[0];
|
|
466
466
|
const fs = await import('fs');
|
|
467
467
|
const path = await import('path');
|
|
468
|
-
if (source === '
|
|
468
|
+
if (source === 'lancedb') {
|
|
469
469
|
const key = ctx.flags.key;
|
|
470
470
|
const namespace = ctx.flags.namespace || 'default';
|
|
471
471
|
if (!key) {
|
|
472
|
-
output.printError('Key is required for
|
|
472
|
+
output.printError('Key is required for lancedb edit. Use --key or -k');
|
|
473
473
|
return { success: false, exitCode: 1 };
|
|
474
474
|
}
|
|
475
475
|
if (!value && ctx.interactive) {
|
|
@@ -666,28 +666,28 @@ const templatesCommand = {
|
|
|
666
666
|
const deleteCommand = {
|
|
667
667
|
name: 'delete',
|
|
668
668
|
aliases: ['rm'],
|
|
669
|
-
description: 'Delete a memory entry (
|
|
669
|
+
description: 'Delete a memory entry (LanceDB, Memory Palace, or knowledge chunk)',
|
|
670
670
|
options: [
|
|
671
671
|
{
|
|
672
672
|
name: 'key',
|
|
673
673
|
short: 'k',
|
|
674
|
-
description: 'Storage key
|
|
674
|
+
description: 'Storage key',
|
|
675
675
|
type: 'string'
|
|
676
676
|
},
|
|
677
677
|
{
|
|
678
678
|
name: 'namespace',
|
|
679
679
|
short: 'n',
|
|
680
|
-
description: 'Memory namespace
|
|
680
|
+
description: 'Memory namespace',
|
|
681
681
|
type: 'string',
|
|
682
682
|
default: 'default'
|
|
683
683
|
},
|
|
684
684
|
{
|
|
685
685
|
name: 'source',
|
|
686
686
|
short: 's',
|
|
687
|
-
description: 'Source to delete from:
|
|
687
|
+
description: 'Source to delete from: lancedb, palace, knowledge',
|
|
688
688
|
type: 'string',
|
|
689
|
-
default: '
|
|
690
|
-
choices: ['
|
|
689
|
+
default: 'lancedb',
|
|
690
|
+
choices: ['lancedb', 'palace', 'knowledge']
|
|
691
691
|
},
|
|
692
692
|
{
|
|
693
693
|
name: 'id',
|
|
@@ -703,15 +703,15 @@ const deleteCommand = {
|
|
|
703
703
|
}
|
|
704
704
|
],
|
|
705
705
|
examples: [
|
|
706
|
-
{ command: 'monomind memory delete -k "mykey"', description: 'Delete
|
|
706
|
+
{ command: 'monomind memory delete -k "mykey"', description: 'Delete memory entry' },
|
|
707
707
|
{ command: 'monomind memory delete -k "lesson" -n "lessons"', description: 'Delete from specific namespace' },
|
|
708
708
|
{ command: 'monomind memory delete --source palace --id "abc123"', description: 'Delete Memory Palace drawer' },
|
|
709
709
|
{ command: 'monomind memory delete --source knowledge --id "chunk-42" -f', description: 'Delete knowledge chunk (no confirm)' }
|
|
710
710
|
],
|
|
711
711
|
action: async (ctx) => {
|
|
712
|
-
const source = ctx.flags.source || '
|
|
712
|
+
const source = ctx.flags.source || 'lancedb';
|
|
713
713
|
const force = ctx.flags.force;
|
|
714
|
-
if (source === '
|
|
714
|
+
if (source === 'lancedb') {
|
|
715
715
|
const key = ctx.flags.key || ctx.args[0];
|
|
716
716
|
const namespace = ctx.flags.namespace || 'default';
|
|
717
717
|
if (!key) {
|
|
@@ -1213,9 +1213,9 @@ const exportCommand = {
|
|
|
1213
1213
|
{
|
|
1214
1214
|
name: 'format',
|
|
1215
1215
|
short: 'f',
|
|
1216
|
-
description: 'Export format (json, csv, binary)',
|
|
1216
|
+
description: 'Export format (json, csv, binary, okf)',
|
|
1217
1217
|
type: 'string',
|
|
1218
|
-
choices: ['json', 'csv', 'binary'],
|
|
1218
|
+
choices: ['json', 'csv', 'binary', 'okf'],
|
|
1219
1219
|
default: 'json'
|
|
1220
1220
|
},
|
|
1221
1221
|
{
|
|
@@ -1233,7 +1233,8 @@ const exportCommand = {
|
|
|
1233
1233
|
],
|
|
1234
1234
|
examples: [
|
|
1235
1235
|
{ command: 'monomind memory export -o ./backup.json', description: 'Export all to JSON' },
|
|
1236
|
-
{ command: 'monomind memory export -o ./data.csv -f csv', description: 'Export to CSV' }
|
|
1236
|
+
{ command: 'monomind memory export -o ./data.csv -f csv', description: 'Export to CSV' },
|
|
1237
|
+
{ command: 'monomind memory export -o ./knowledge -f okf', description: 'Export as OKF bundle (directory of .md files)' }
|
|
1237
1238
|
],
|
|
1238
1239
|
action: async (ctx) => {
|
|
1239
1240
|
const outputPath = ctx.flags.output;
|
|
@@ -1243,6 +1244,44 @@ const exportCommand = {
|
|
|
1243
1244
|
return { success: false, exitCode: 1 };
|
|
1244
1245
|
}
|
|
1245
1246
|
output.printInfo(`Exporting memory to ${outputPath}...`);
|
|
1247
|
+
// OKF bundle: native export — directory of .md files with YAML frontmatter
|
|
1248
|
+
if (format === 'okf') {
|
|
1249
|
+
try {
|
|
1250
|
+
const fs = await import('fs');
|
|
1251
|
+
const path = await import('path');
|
|
1252
|
+
const { listEntries, getEntry } = await import('../memory/memory-initializer.js');
|
|
1253
|
+
const namespace = ctx.flags.namespace;
|
|
1254
|
+
const listed = await listEntries({ namespace, limit: 10000 });
|
|
1255
|
+
if (!listed.success) {
|
|
1256
|
+
output.printError(`Failed to list entries: ${listed.error}`);
|
|
1257
|
+
return { success: false, exitCode: 1 };
|
|
1258
|
+
}
|
|
1259
|
+
let written = 0;
|
|
1260
|
+
for (const entry of listed.entries) {
|
|
1261
|
+
const got = await getEntry({ key: entry.key, namespace: entry.namespace });
|
|
1262
|
+
if (!got.found || !got.entry)
|
|
1263
|
+
continue;
|
|
1264
|
+
const { key, namespace: ns, content, tags, createdAt } = got.entry;
|
|
1265
|
+
const safeKey = key.replace(/[/\\:*?"<>|]/g, '-');
|
|
1266
|
+
const dir = path.join(outputPath, ns);
|
|
1267
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
1268
|
+
const yamlEscape = (s) => s.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
1269
|
+
const tagsLine = tags.length > 0 ? `tags: [${tags.join(', ')}]\n` : '';
|
|
1270
|
+
const md = `---\ntype: Memory\nkey: "${yamlEscape(key)}"\nnamespace: "${yamlEscape(ns)}"\n${tagsLine}timestamp: ${createdAt}\n---\n\n${content}`;
|
|
1271
|
+
fs.writeFileSync(path.join(dir, `${safeKey}.md`), md, 'utf-8');
|
|
1272
|
+
written++;
|
|
1273
|
+
}
|
|
1274
|
+
output.printSuccess(`Exported ${written} entries to ${outputPath}`);
|
|
1275
|
+
if (listed.total > 10000) {
|
|
1276
|
+
output.printInfo(`Note: only first 10000 of ${listed.total} entries exported`);
|
|
1277
|
+
}
|
|
1278
|
+
return { success: true, data: { written, outputPath } };
|
|
1279
|
+
}
|
|
1280
|
+
catch (error) {
|
|
1281
|
+
output.printError(`OKF export error: ${String(error)}`);
|
|
1282
|
+
return { success: false, exitCode: 1 };
|
|
1283
|
+
}
|
|
1284
|
+
}
|
|
1246
1285
|
try {
|
|
1247
1286
|
const result = await callMCPTool('memory_export', {
|
|
1248
1287
|
outputPath,
|
|
@@ -1307,6 +1346,77 @@ const importCommand = {
|
|
|
1307
1346
|
return { success: false, exitCode: 1 };
|
|
1308
1347
|
}
|
|
1309
1348
|
output.printInfo(`Importing memory from ${inputPath}...`);
|
|
1349
|
+
// OKF bundle: native import — detect directory of .md files with YAML frontmatter
|
|
1350
|
+
const fsCheck = await import('fs');
|
|
1351
|
+
const isDir = fsCheck.existsSync(inputPath) && fsCheck.statSync(inputPath).isDirectory();
|
|
1352
|
+
if (isDir) {
|
|
1353
|
+
try {
|
|
1354
|
+
const fs = await import('fs');
|
|
1355
|
+
const path = await import('path');
|
|
1356
|
+
const { storeEntry } = await import('../memory/memory-initializer.js');
|
|
1357
|
+
function parseOkfFrontmatter(raw) {
|
|
1358
|
+
if (!raw.startsWith('---\n'))
|
|
1359
|
+
return { meta: {}, body: raw };
|
|
1360
|
+
const end = raw.indexOf('\n---\n', 4);
|
|
1361
|
+
if (end === -1)
|
|
1362
|
+
return { meta: {}, body: raw };
|
|
1363
|
+
const meta = {};
|
|
1364
|
+
for (const line of raw.slice(4, end).split('\n')) {
|
|
1365
|
+
const colon = line.indexOf(':');
|
|
1366
|
+
if (colon <= 0)
|
|
1367
|
+
continue;
|
|
1368
|
+
const k = line.slice(0, colon).trim();
|
|
1369
|
+
const rawV = line.slice(colon + 1).trim();
|
|
1370
|
+
const isQuoted = rawV.startsWith('"') && rawV.endsWith('"') && rawV.length >= 2;
|
|
1371
|
+
const v = isQuoted ? rawV.slice(1, -1).replace(/\\(["\\])/g, '$1') : rawV;
|
|
1372
|
+
if (v.startsWith('[') && v.endsWith(']')) {
|
|
1373
|
+
meta[k] = v.slice(1, -1).split(',').map(s => s.trim()).filter(Boolean);
|
|
1374
|
+
}
|
|
1375
|
+
else {
|
|
1376
|
+
meta[k] = v;
|
|
1377
|
+
}
|
|
1378
|
+
}
|
|
1379
|
+
return { meta, body: raw.slice(end + 5) };
|
|
1380
|
+
}
|
|
1381
|
+
function findMdFiles(dir) {
|
|
1382
|
+
const results = [];
|
|
1383
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
1384
|
+
const full = path.join(dir, entry.name);
|
|
1385
|
+
if (entry.isDirectory())
|
|
1386
|
+
results.push(...findMdFiles(full));
|
|
1387
|
+
else if (entry.name.endsWith('.md'))
|
|
1388
|
+
results.push(full);
|
|
1389
|
+
}
|
|
1390
|
+
return results;
|
|
1391
|
+
}
|
|
1392
|
+
const overrideNs = ctx.flags.namespace;
|
|
1393
|
+
const merge = ctx.flags.merge ?? true;
|
|
1394
|
+
const files = findMdFiles(inputPath);
|
|
1395
|
+
let imported = 0, skipped = 0;
|
|
1396
|
+
const start = Date.now();
|
|
1397
|
+
for (const file of files) {
|
|
1398
|
+
const raw = fs.readFileSync(file, 'utf-8');
|
|
1399
|
+
const { meta, body } = parseOkfFrontmatter(raw);
|
|
1400
|
+
const key = meta['key'] || path.basename(file, '.md');
|
|
1401
|
+
const ns = overrideNs || meta['namespace'] || path.basename(path.dirname(file));
|
|
1402
|
+
const tags = Array.isArray(meta['tags']) ? meta['tags'] : meta['tags'] ? [meta['tags']] : [];
|
|
1403
|
+
const result = await storeEntry({ key, value: body.trim(), namespace: ns, tags, upsert: !merge });
|
|
1404
|
+
if (result.success)
|
|
1405
|
+
imported++;
|
|
1406
|
+
else
|
|
1407
|
+
skipped++;
|
|
1408
|
+
}
|
|
1409
|
+
output.printSuccess(`Imported ${imported} entries from ${inputPath}`);
|
|
1410
|
+
if (skipped > 0)
|
|
1411
|
+
output.printInfo(`Skipped ${skipped} entries (duplicates or errors)`);
|
|
1412
|
+
output.printInfo(`Duration: ${Date.now() - start}ms`);
|
|
1413
|
+
return { success: true, data: { imported, skipped } };
|
|
1414
|
+
}
|
|
1415
|
+
catch (error) {
|
|
1416
|
+
output.printError(`OKF import error: ${String(error)}`);
|
|
1417
|
+
return { success: false, exitCode: 1 };
|
|
1418
|
+
}
|
|
1419
|
+
}
|
|
1310
1420
|
try {
|
|
1311
1421
|
const result = await callMCPTool('memory_import', {
|
|
1312
1422
|
inputPath,
|
|
@@ -1342,7 +1452,7 @@ const initMemoryCommand = {
|
|
|
1342
1452
|
{
|
|
1343
1453
|
name: 'backend',
|
|
1344
1454
|
short: 'b',
|
|
1345
|
-
description: 'Backend type: hybrid (default), sqlite, or
|
|
1455
|
+
description: 'Backend type: hybrid (default), sqlite, or lancedb',
|
|
1346
1456
|
type: 'string',
|
|
1347
1457
|
default: 'hybrid'
|
|
1348
1458
|
},
|
|
@@ -1380,7 +1490,7 @@ const initMemoryCommand = {
|
|
|
1380
1490
|
],
|
|
1381
1491
|
examples: [
|
|
1382
1492
|
{ command: 'monomind memory init', description: 'Initialize hybrid backend with all features' },
|
|
1383
|
-
{ command: 'monomind memory init -b
|
|
1493
|
+
{ command: 'monomind memory init -b lancedb', description: 'Initialize LanceDB backend' },
|
|
1384
1494
|
{ command: 'monomind memory init -p ./data/memory.db --force', description: 'Reinitialize at custom path' },
|
|
1385
1495
|
{ command: 'monomind memory init --verbose --verify', description: 'Initialize with full verification' }
|
|
1386
1496
|
],
|
|
@@ -1447,7 +1557,7 @@ const initMemoryCommand = {
|
|
|
1447
1557
|
const { activated, failed, initTimeMs } = result.controllers;
|
|
1448
1558
|
if (activated.length > 0 || failed.length > 0) {
|
|
1449
1559
|
const controllerLines = [
|
|
1450
|
-
output.bold('
|
|
1560
|
+
output.bold('Memory Controllers:'),
|
|
1451
1561
|
` Activated: ${activated.length} Failed: ${failed.length} Init: ${Math.round(initTimeMs)}ms`,
|
|
1452
1562
|
];
|
|
1453
1563
|
if (verbose && activated.length > 0) {
|
|
@@ -1586,11 +1696,11 @@ export const memoryCommand = {
|
|
|
1586
1696
|
output.printList([
|
|
1587
1697
|
`${output.highlight('init')} - Initialize memory database (sql.js)`,
|
|
1588
1698
|
`${output.highlight('store')} - Store data in memory`,
|
|
1589
|
-
`${output.highlight('edit')} - Edit an entry (
|
|
1699
|
+
`${output.highlight('edit')} - Edit an entry (LanceDB, palace, knowledge)`,
|
|
1590
1700
|
`${output.highlight('retrieve')} - Retrieve data from memory`,
|
|
1591
1701
|
`${output.highlight('search')} - Semantic/vector search`,
|
|
1592
1702
|
`${output.highlight('list')} - List memory entries`,
|
|
1593
|
-
`${output.highlight('delete')} - Delete an entry (
|
|
1703
|
+
`${output.highlight('delete')} - Delete an entry (LanceDB, palace, knowledge)`,
|
|
1594
1704
|
`${output.highlight('templates')} - Show best-practice entry templates`,
|
|
1595
1705
|
`${output.highlight('stats')} - Show statistics`,
|
|
1596
1706
|
`${output.highlight('configure')} - Configure backend`,
|
|
@@ -292,7 +292,7 @@ const runCommand = {
|
|
|
292
292
|
}
|
|
293
293
|
}
|
|
294
294
|
output.printSuccess(`Memory files backed up (${jsonFiles.length} JSON, ${hasDb ? '1 DB' : '0 DB'}).`);
|
|
295
|
-
output.printInfo('Run "monomind memory init --force" to import v2 memory into v1
|
|
295
|
+
output.printInfo('Run "monomind memory init --force" to import v2 memory into v1 LanceDB.');
|
|
296
296
|
}
|
|
297
297
|
migrated.push('memory');
|
|
298
298
|
}
|
|
@@ -775,7 +775,7 @@ function formatMigrationStatus(status) {
|
|
|
775
775
|
function getMigrationSteps(target) {
|
|
776
776
|
const allSteps = [
|
|
777
777
|
{ name: 'Configuration Files', description: 'Migrate config schema to v1 format', source: './monomind.json', dest: './monomind.config.json' },
|
|
778
|
-
{ name: 'Memory Backend', description: 'Upgrade to hybrid backend with
|
|
778
|
+
{ name: 'Memory Backend', description: 'Upgrade to hybrid backend with LanceDB', source: './.monomind/memory', dest: './data/memory' },
|
|
779
779
|
{ name: 'Agent Definitions', description: 'Convert agent configs to v1 format', source: './.monomind/agents', dest: './packages/agents' },
|
|
780
780
|
{ name: 'Hook Registry', description: 'Migrate hooks to v1 hook system', source: './src/hooks', dest: './packages/hooks' },
|
|
781
781
|
{ name: 'Workflow Definitions', description: 'Convert workflows to event-sourced format', source: './.monomind/workflows', dest: './data/workflows' },
|
|
@@ -56,7 +56,7 @@ const statusCommand = {
|
|
|
56
56
|
component: 'Pattern Index',
|
|
57
57
|
status: hnswStatus.available ? output.success('Ready') : output.dim('Empty'),
|
|
58
58
|
details: hnswStatus.available
|
|
59
|
-
? `${hnswStatus.entryCount} vectors, ${hnswStatus.dimensions}-dim (
|
|
59
|
+
? `${hnswStatus.entryCount} vectors, ${hnswStatus.dimensions}-dim (ANN via LanceDB)`
|
|
60
60
|
: 'No vectors indexed yet',
|
|
61
61
|
},
|
|
62
62
|
{
|
|
@@ -271,7 +271,7 @@ const initCommand = {
|
|
|
271
271
|
output.writeln(output.dim(' Initializing memory namespace...'));
|
|
272
272
|
output.writeln(output.dim(' Setting up communication channels...'));
|
|
273
273
|
if (v1Mode) {
|
|
274
|
-
output.writeln(output.dim(' Configuring
|
|
274
|
+
output.writeln(output.dim(' Configuring LanceDB integration (ANN)....'));
|
|
275
275
|
output.writeln(output.dim(' Initializing keyword routing + outcome measurement...'));
|
|
276
276
|
}
|
|
277
277
|
output.writeln();
|
|
@@ -30,8 +30,8 @@ export function systemConfigToMonomindConfig(systemConfig) {
|
|
|
30
30
|
backend: normalizeMemoryBackend(systemConfig.memory?.type),
|
|
31
31
|
persistPath: systemConfig.memory?.path || './data/memory',
|
|
32
32
|
cacheSize: systemConfig.memory?.maxSize ?? 1000000,
|
|
33
|
-
enableHNSW: systemConfig.memory?.
|
|
34
|
-
vectorDimension: systemConfig.memory?.
|
|
33
|
+
enableHNSW: systemConfig.memory?.lancedb?.indexType === 'hnsw',
|
|
34
|
+
vectorDimension: systemConfig.memory?.lancedb?.dimensions ?? 384,
|
|
35
35
|
},
|
|
36
36
|
// MCP configuration
|
|
37
37
|
mcp: {
|
|
@@ -114,12 +114,10 @@ export function configToSystemConfig(config) {
|
|
|
114
114
|
type: denormalizeMemoryBackend(config.memory.backend),
|
|
115
115
|
path: config.memory.persistPath,
|
|
116
116
|
maxSize: config.memory.cacheSize,
|
|
117
|
-
|
|
117
|
+
lancedb: {
|
|
118
118
|
dimensions: config.memory.vectorDimension,
|
|
119
119
|
indexType: config.memory.enableHNSW ? 'hnsw' : 'flat',
|
|
120
|
-
|
|
121
|
-
m: 16,
|
|
122
|
-
quantization: 'none',
|
|
120
|
+
nProbes: 20,
|
|
123
121
|
},
|
|
124
122
|
},
|
|
125
123
|
mcp: {
|
|
@@ -182,11 +180,13 @@ function normalizeMemoryBackend(backend) {
|
|
|
182
180
|
switch (backend) {
|
|
183
181
|
case 'memory':
|
|
184
182
|
case 'sqlite':
|
|
185
|
-
case '
|
|
183
|
+
case 'lancedb':
|
|
186
184
|
case 'hybrid':
|
|
187
185
|
return backend;
|
|
186
|
+
case 'agentdb':
|
|
187
|
+
return 'lancedb'; // legacy alias
|
|
188
188
|
case 'redis':
|
|
189
|
-
return 'memory';
|
|
189
|
+
return 'memory';
|
|
190
190
|
default:
|
|
191
191
|
return 'hybrid';
|
|
192
192
|
}
|
|
@@ -287,7 +287,7 @@ export class CLI {
|
|
|
287
287
|
this.output.writeln(this.output.bold('V1 FEATURES:'));
|
|
288
288
|
this.output.printList([
|
|
289
289
|
'15-agent hierarchical mesh coordination',
|
|
290
|
-
'
|
|
290
|
+
'LanceDB with ANN vector indexing',
|
|
291
291
|
'Keyword routing + route-outcome measurement',
|
|
292
292
|
'Unified SwarmCoordinator engine',
|
|
293
293
|
'Event-sourced state management',
|
|
@@ -176,7 +176,7 @@ function cliCommandsTable() {
|
|
|
176
176
|
| \`init\` | 4 | Project initialization |
|
|
177
177
|
| \`agent\` | 8 | Agent lifecycle management |
|
|
178
178
|
| \`swarm\` | 6 | Multi-agent swarm coordination |
|
|
179
|
-
| \`memory\` | 11 |
|
|
179
|
+
| \`memory\` | 11 | LanceDB memory with ANN search |
|
|
180
180
|
| \`task\` | 6 | Task creation and lifecycle |
|
|
181
181
|
| \`session\` | 7 | Session state management |
|
|
182
182
|
| \`hooks\` | 17 | Self-learning hooks + 12 workers |
|
|
@@ -350,7 +350,7 @@ function intelligenceSystem() {
|
|
|
350
350
|
|
|
351
351
|
- **Keyword routing**: Deterministic task→agent routing via \`createKeywordRouter\`
|
|
352
352
|
- **Outcome measurement**: Route and command outcomes are recorded and scored to surface routing accuracy over time
|
|
353
|
-
- **Pattern search**:
|
|
353
|
+
- **Pattern search**: LanceDB ANN vector search for finding similar past patterns
|
|
354
354
|
|
|
355
355
|
Routing and learning are JS-only — no native engine is required. Outcomes
|
|
356
356
|
feed back into the recorded metrics so routing quality is measured, not assumed.`;
|
|
@@ -64,13 +64,13 @@ const SKILLS_MAP = {
|
|
|
64
64
|
'hive-mind-advanced',
|
|
65
65
|
],
|
|
66
66
|
browser: ['agent-browser-testing'],
|
|
67
|
-
|
|
68
|
-
'
|
|
69
|
-
'
|
|
70
|
-
'
|
|
71
|
-
'
|
|
72
|
-
'
|
|
73
|
-
'reasoningbank
|
|
67
|
+
memory: [
|
|
68
|
+
'memory-advanced',
|
|
69
|
+
'memory-learning',
|
|
70
|
+
'memory-patterns',
|
|
71
|
+
'memory-optimization',
|
|
72
|
+
'memory-vector-search',
|
|
73
|
+
'memory-reasoningbank',
|
|
74
74
|
'reasoningbank-intelligence',
|
|
75
75
|
],
|
|
76
76
|
github: [
|
|
@@ -1028,8 +1028,8 @@ async function copySkills(targetDir, options, result) {
|
|
|
1028
1028
|
else {
|
|
1029
1029
|
if (skillsConfig.core)
|
|
1030
1030
|
skillsToCopy.push(...SKILLS_MAP.core);
|
|
1031
|
-
if (skillsConfig.
|
|
1032
|
-
skillsToCopy.push(...SKILLS_MAP.
|
|
1031
|
+
if (skillsConfig.memory)
|
|
1032
|
+
skillsToCopy.push(...SKILLS_MAP.memory);
|
|
1033
1033
|
if (skillsConfig.github)
|
|
1034
1034
|
skillsToCopy.push(...SKILLS_MAP.github);
|
|
1035
1035
|
if (skillsConfig.browser)
|
|
@@ -1416,7 +1416,7 @@ async function writeStatusline(targetDir, options, result) {
|
|
|
1416
1416
|
}
|
|
1417
1417
|
}
|
|
1418
1418
|
}
|
|
1419
|
-
// ALWAYS generate statusline.cjs — the generated version includes
|
|
1419
|
+
// ALWAYS generate statusline.cjs — the generated version includes
|
|
1420
1420
|
// vectors/size, tests, ADRs, hooks, and integration stats that the
|
|
1421
1421
|
// pre-installed static copy in the npm package lacks.
|
|
1422
1422
|
// This must overwrite any copy from writeHelpers() which copies the legacy file.
|
|
@@ -1670,7 +1670,7 @@ async function writeCapabilitiesDoc(targetDir, options, result) {
|
|
|
1670
1670
|
Monomind is a domain-driven design architecture for multi-agent AI coordination with:
|
|
1671
1671
|
|
|
1672
1672
|
- **15-Agent Swarm Coordination** with hierarchical and mesh topologies
|
|
1673
|
-
- **
|
|
1673
|
+
- **ANN Vector Search** - indexed pattern retrieval via LanceDB
|
|
1674
1674
|
- **Keyword Routing** - deterministic task→agent routing with outcome measurement
|
|
1675
1675
|
- **Byzantine Fault Tolerance** - Queen-led consensus mechanisms
|
|
1676
1676
|
- **MCP Server Integration** - Model Context Protocol support
|
|
@@ -1769,7 +1769,7 @@ npx monomind@latest swarm monitor
|
|
|
1769
1769
|
| \`init\` | 4 | Project initialization |
|
|
1770
1770
|
| \`agent\` | 8 | Agent lifecycle management |
|
|
1771
1771
|
| \`swarm\` | 6 | Multi-agent coordination |
|
|
1772
|
-
| \`memory\` | 11 |
|
|
1772
|
+
| \`memory\` | 11 | LanceDB with ANN vector search |
|
|
1773
1773
|
| \`mcp\` | 9 | MCP server management |
|
|
1774
1774
|
| \`task\` | 6 | Task assignment |
|
|
1775
1775
|
| \`session\` | 7 | Session persistence |
|
|
@@ -1787,7 +1787,7 @@ npx monomind@latest swarm monitor
|
|
|
1787
1787
|
| \`security\` | 6 | Security scanning |
|
|
1788
1788
|
| \`performance\` | 5 | Profiling & benchmarks |
|
|
1789
1789
|
| \`providers\` | 5 | AI provider config |
|
|
1790
|
-
|
|
1790
|
+
|
|
1791
1791
|
| \`deployment\` | 5 | Deploy management |
|
|
1792
1792
|
| \`embeddings\` | 4 | Vector embeddings |
|
|
1793
1793
|
| \`claims\` | 4 | Authorization |
|
|
@@ -1874,7 +1874,7 @@ npx monomind@latest doctor --fix
|
|
|
1874
1874
|
|
|
1875
1875
|
### Intelligence System
|
|
1876
1876
|
- **Keyword routing**: Deterministic task→agent routing with outcome measurement
|
|
1877
|
-
- **
|
|
1877
|
+
- **ANN pattern search**: Indexed vector search via LanceDB
|
|
1878
1878
|
- **ReasoningBank**: Stores learned patterns and trajectories for retrieval
|
|
1879
1879
|
- **Int8 Quantization**: ~4x memory reduction for stored embeddings
|
|
1880
1880
|
|
|
@@ -1959,7 +1959,7 @@ npx monomind@latest hive-mind consensus --propose "task"
|
|
|
1959
1959
|
|
|
1960
1960
|
| Metric | Target | Status |
|
|
1961
1961
|
|--------|--------|--------|
|
|
1962
|
-
|
|
|
1962
|
+
| ANN Search | Indexed vector search | ✅ Implemented (LanceDB) |
|
|
1963
1963
|
| Memory Reduction | 50-75% | ✅ Implemented (~4x via Int8 quantization) |
|
|
1964
1964
|
| Pattern Learning | Recorded + retrievable | ✅ Implemented (ReasoningBank) |
|
|
1965
1965
|
| MCP Response | <100ms | ✅ Achieved |
|
|
@@ -1978,7 +1978,7 @@ npx monomind@latest hive-mind consensus --propose "task"
|
|
|
1978
1978
|
| Package | Version | Purpose |
|
|
1979
1979
|
|---------|---------|---------|
|
|
1980
1980
|
| agentic-flow | 3.0.0-alpha.1 | Core coordination + ReasoningBank + Router |
|
|
1981
|
-
|
|
|
1981
|
+
| @lancedb/lancedb | latest | Vector database (ANN search) |
|
|
1982
1982
|
|
|
1983
1983
|
### Optional Integrations
|
|
1984
1984
|
| Package | Command |
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Auto-detects project profile and generates:
|
|
5
5
|
* 1. .agents/shared_instructions.md — prepended to every agent prompt
|
|
6
|
-
* 2. Memory seeds — pre-loaded into
|
|
6
|
+
* 2. Memory seeds — pre-loaded into LanceDB so agents start with project best practices
|
|
7
7
|
*/
|
|
8
8
|
import type { InitResult } from './types.js';
|
|
9
9
|
export interface ProjectProfile {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Auto-detects project profile and generates:
|
|
5
5
|
* 1. .agents/shared_instructions.md — prepended to every agent prompt
|
|
6
|
-
* 2. Memory seeds — pre-loaded into
|
|
6
|
+
* 2. Memory seeds — pre-loaded into LanceDB so agents start with project best practices
|
|
7
7
|
*/
|
|
8
8
|
import * as fs from 'node:fs';
|
|
9
9
|
import * as path from 'node:path';
|
|
@@ -18,7 +18,7 @@ import type { InitOptions } from './types.js';
|
|
|
18
18
|
* 🏗️ DDD Domains [●●○○○] 2/5 ⚡ HNSW 150x
|
|
19
19
|
* 🤖 Swarm ◉ [ 5/15] 👥 2 🪝 10/17 🟢 CVE 3/3 💾 4MB 🧠 63%
|
|
20
20
|
* 🔧 Architecture ADRs ●71% │ DDD ● 13% │ Security ●CLEAN
|
|
21
|
-
* 📊
|
|
21
|
+
* 📊 LanceDB Vectors ●3104⚡ │ Size 216KB │ Tests ●6 (~24 cases) │ MCP ●1/1
|
|
22
22
|
*/
|
|
23
23
|
export declare function generateStatuslineScript(options: InitOptions): string;
|
|
24
24
|
export declare function generateStatuslineHook(options: InitOptions): string;
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* 🏗️ DDD Domains [●●○○○] 2/5 ⚡ HNSW 150x
|
|
18
18
|
* 🤖 Swarm ◉ [ 5/15] 👥 2 🪝 10/17 🟢 CVE 3/3 💾 4MB 🧠 63%
|
|
19
19
|
* 🔧 Architecture ADRs ●71% │ DDD ● 13% │ Security ●CLEAN
|
|
20
|
-
* 📊
|
|
20
|
+
* 📊 LanceDB Vectors ●3104⚡ │ Size 216KB │ Tests ●6 (~24 cases) │ MCP ●1/1
|
|
21
21
|
*/
|
|
22
22
|
export function generateStatuslineScript(options) {
|
|
23
23
|
const maxAgents = options.runtime.maxAgents;
|
|
@@ -313,7 +313,7 @@ function getLearningStats() {
|
|
|
313
313
|
path.join(CWD, '.monomind', 'memory.db'),
|
|
314
314
|
path.join(CWD, '.claude', 'memory.db'),
|
|
315
315
|
path.join(CWD, 'data', 'memory.db'),
|
|
316
|
-
path.join(CWD, '.
|
|
316
|
+
path.join(CWD, '.swarm', 'lancedb'),
|
|
317
317
|
];
|
|
318
318
|
|
|
319
319
|
for (const dbPath of memoryPaths) {
|
|
@@ -461,7 +461,7 @@ function getSwarmStatus() {
|
|
|
461
461
|
function getSystemMetrics() {
|
|
462
462
|
const memoryMB = Math.floor(process.memoryUsage().heapUsed / 1024 / 1024);
|
|
463
463
|
const learning = getLearningStats();
|
|
464
|
-
const
|
|
464
|
+
const lancedbStats = getMemoryStats();
|
|
465
465
|
|
|
466
466
|
// Intelligence from learning.json
|
|
467
467
|
const learningData = readJSON(path.join(CWD, '.monomind', 'metrics', 'learning.json'));
|
|
@@ -473,7 +473,7 @@ function getSystemMetrics() {
|
|
|
473
473
|
} else {
|
|
474
474
|
// Use actual vector/entry counts — 2000 entries = 100%
|
|
475
475
|
const fromPatterns = learning.patterns > 0 ? Math.min(100, Math.floor(learning.patterns / 20)) : 0;
|
|
476
|
-
const fromVectors =
|
|
476
|
+
const fromVectors = lancedbStats.vectorCount > 0 ? Math.min(100, Math.floor(lancedbStats.vectorCount / 20)) : 0;
|
|
477
477
|
intelligencePct = Math.max(fromPatterns, fromVectors);
|
|
478
478
|
}
|
|
479
479
|
|
|
@@ -590,8 +590,8 @@ function getActiveAgent() {
|
|
|
590
590
|
} catch { return null; }
|
|
591
591
|
}
|
|
592
592
|
|
|
593
|
-
//
|
|
594
|
-
function
|
|
593
|
+
// Memory (LanceDB) stats — count real entries
|
|
594
|
+
function getMemoryStats() {
|
|
595
595
|
let vectorCount = 0;
|
|
596
596
|
let dbSizeKB = 0;
|
|
597
597
|
let namespaces = 0;
|
|
@@ -1067,7 +1067,7 @@ function generateDashboard() {
|
|
|
1067
1067
|
const system = getSystemMetrics();
|
|
1068
1068
|
const adrs = getADRStatus();
|
|
1069
1069
|
const hooks = getHooksStatus();
|
|
1070
|
-
const
|
|
1070
|
+
const lancedbStats = getMemoryStats();
|
|
1071
1071
|
const tests = getTestStats();
|
|
1072
1072
|
const session = getSessionStats();
|
|
1073
1073
|
const integration = getIntegrationStatus();
|
|
@@ -1188,7 +1188,7 @@ function generateJSON() {
|
|
|
1188
1188
|
system: getSystemMetrics(),
|
|
1189
1189
|
adrs: getADRStatus(),
|
|
1190
1190
|
hooks: getHooksStatus(),
|
|
1191
|
-
|
|
1191
|
+
lancedb: getMemoryStats(),
|
|
1192
1192
|
tests: getTestStats(),
|
|
1193
1193
|
git: { modified: git.modified, untracked: git.untracked, staged: git.staged, ahead: git.ahead, behind: git.behind },
|
|
1194
1194
|
lastUpdated: new Date().toISOString(),
|
|
@@ -66,8 +66,8 @@ export interface HooksConfig {
|
|
|
66
66
|
export interface SkillsConfig {
|
|
67
67
|
/** Include core skills (swarm, sparc, mastermind, monodesign, monomotion) */
|
|
68
68
|
core: boolean;
|
|
69
|
-
/** Include
|
|
70
|
-
|
|
69
|
+
/** Include memory/LanceDB skills */
|
|
70
|
+
memory: boolean;
|
|
71
71
|
/** Include GitHub integration skills */
|
|
72
72
|
github: boolean;
|
|
73
73
|
/** Include browser automation skills */
|
|
@@ -194,7 +194,7 @@ export interface RuntimeConfig {
|
|
|
194
194
|
/** Maximum agents */
|
|
195
195
|
maxAgents: number;
|
|
196
196
|
/** Memory backend */
|
|
197
|
-
memoryBackend: 'memory' | 'sqlite' | '
|
|
197
|
+
memoryBackend: 'memory' | 'sqlite' | 'lancedb' | 'hybrid';
|
|
198
198
|
/** Enable HNSW indexing */
|
|
199
199
|
enableHNSW: boolean;
|
|
200
200
|
/** Enable neural learning */
|
|
@@ -73,7 +73,7 @@ export const DEFAULT_INIT_OPTIONS = {
|
|
|
73
73
|
},
|
|
74
74
|
skills: {
|
|
75
75
|
core: true,
|
|
76
|
-
|
|
76
|
+
memory: true,
|
|
77
77
|
github: true,
|
|
78
78
|
browser: true,
|
|
79
79
|
advanced: true,
|
|
@@ -164,7 +164,7 @@ export const MINIMAL_INIT_OPTIONS = {
|
|
|
164
164
|
},
|
|
165
165
|
skills: {
|
|
166
166
|
core: true,
|
|
167
|
-
|
|
167
|
+
memory: false,
|
|
168
168
|
github: false,
|
|
169
169
|
browser: false,
|
|
170
170
|
advanced: false,
|
|
@@ -220,7 +220,7 @@ export const FULL_INIT_OPTIONS = {
|
|
|
220
220
|
},
|
|
221
221
|
skills: {
|
|
222
222
|
core: true,
|
|
223
|
-
|
|
223
|
+
memory: true,
|
|
224
224
|
github: true,
|
|
225
225
|
browser: true,
|
|
226
226
|
advanced: true,
|